iText例子
参考:http://itextpdf.com/book/examples.php
daniel@daniel-mint ~/latex/linux/itext/daniel $ cat HelloWorldNarrow.java
import java.io.FileOutputStream;
import java.io.IOException; import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter; /**
* Hello World: document constructor.
*/
public class HelloWorldNarrow { /** Path to the resulting PDF file. */
public static final String RESULT
= "daniel.pdf"; /**
* Creates a PDF file: hello_narrow.pdf
* @param args no arguments needed
*/
public static void main(String[] args)
throws DocumentException, IOException {
// step 1
// Using a custom page size
Rectangle pagesize = new Rectangle(480f, 720f);
Document document = new Document(pagesize, 36f, 72f, 108f, 180f);
// step 2
PdfWriter.getInstance(document, new FileOutputStream(RESULT));
// step 3
document.open();
// step 4
document.add(new Paragraph(
"Hello World! Hello People! " +
"Hello Sky! Hello Sun! Hello Moon! Hello Stars!"));
// step 5
document.close();
}
}
daniel@daniel-mint ~/latex/linux/itext/daniel $
daniel@daniel-mint ~/latex/linux/itext/daniel $
daniel@daniel-mint ~/latex/linux/itext/daniel $ ls
HelloWorldNarrow.java run.sh
daniel@daniel-mint ~/latex/linux/itext/daniel $ cat run.sh
javac -cp ../itextpdf-5.5.2.jar:. $1.java
java -cp ../itextpdf-5.5.2.jar:. $1
rm $1.class
daniel@daniel-mint ~/latex/linux/itext/daniel $ bash run.sh HelloWorldNarrow
daniel@daniel-mint ~/latex/linux/itext/daniel $ ls
daniel.pdf HelloWorldNarrow.java run.sh
daniel@daniel-mint ~/latex/linux/itext/daniel $
daniel@daniel-mint ~/latex/linux/itext/daniel $
daniel@daniel-mint ~/latex/linux/itext/daniel $ cat daniel.pdf
%PDF-1.4
%���
2 0 obj
<</Length 96/Filter/FlateDecode>>stream
x�+�r
�26S034I�2P�5�1��
@Bi\�99
��E9)�
N@j~AN*��] g�������0�fH�d
4�K����\C����&
endstream
endobj
4 0 obj
<</Parent 3 0 R/Contents 2 0 R/Type/Page/Resources<</Font<</F1 1 0 R>>>>/MediaBox[0 0 480 720]>>
endobj
1 0 obj
<</BaseFont/Helvetica/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>>
endobj
3 0 obj
<</Type/Pages/Count 1/Kids[4 0 R]>>
endobj
5 0 obj
<</Type/Catalog/Pages 3 0 R>>
endobj
6 0 obj
<</Producer(iText� 5.5.2 �2000-2014 iText Group NV \(AGPL-version\))/ModDate(D:20140819175007+08'00')/CreationDate(D:20140819175007+08'00')>>
endobj
xref
0 7
0000000000 65535 f
0000000289 00000 n
0000000015 00000 n
0000000377 00000 n
0000000177 00000 n
0000000428 00000 n
0000000473 00000 n
trailer
<</Root 5 0 R/ID [<8f313f0b956c31e86d082ed4ab592eeb><8f313f0b956c31e86d082ed4ab592eeb>]/Info 6 0 R/Size 7>>
%iText-5.5.2
startxref
630
%%EOF
daniel@daniel-mint ~/latex/linux/itext/daniel $
通过Rups解析出stream内容
q
BT
36 612 Td
0 -18 Td
/F1 12 Tf
(Hello World! Hello People! Hello Sky! Hello Sun! Hello Moon! Hello) Tj
0 0 Td
0 -18 Td
(Stars!) Tj
0 0 Td
ET
Q
daniel@daniel-mint ~/latex/linux/itext/daniel $ awk '/stream/ {p=1}; p; /endstream/ {p=0}' daniel.pdf | sed -re '{s/.*stream.*//g}' | awk 'NF!=0' | hexdump -C
00000000 78 9c 2b e4 72 0a e1 32 36 53 30 33 34 52 08 49 |x.+.r..26S034R.I|
00000010 e1 32 50 d0 35 b4 00 31 f4 dd 0c 15 40 42 69 5c |.2P.5..1....@Bi\|
00000020 1a 1e a9 39 39 f9 0a e1 f9 45 39 29 8a 0a 10 4e |...99....E9)...N|
00000030 40 6a 7e 41 4e 2a 8c 17 9c 5d 09 67 96 e6 c1 98 |@j~AN*...].g....|
00000040 be f9 f9 30 b6 66 48 16 d0 64 03 14 0b 34 82 4b |...0.fH..d...4.K|
00000050 12 8b 8a 15 91 a4 5c 43 b8 02 b9 00 fc 98 26 ef |......\C......&.|
00000060 0a |.|
00000061
daniel@daniel-mint ~/latex/linux/itext/daniel $
daniel@daniel-mint ~/latex/linux/itext/daniel $ awk '/stream/ {p=1}; p; /endstream/ {p=0}' daniel.pdf | sed -re '{s/.*stream.*//g}' | awk 'NF!=0' | zlib-flate -uncompress
q
BT
36 612 Td
0 -18 Td
/F1 12 Tf
(Hello World! Hello People! Hello Sky! Hello Sun! Hello Moon! Hello)Tj
0 0 Td
0 -18 Td
(Stars!)Tj
0 0 Td
ET
Q
其中zlib-flate是在qpdf程序包中。
直接修改pdf文件
daniel@daniel-mint ~/latex/linux/itext/daniel $ awk '/stream/ {p=1}; p; /endstream/ {p=0}' daniel.pdf | sed -re '{s/.*stream.*//g}' | awk 'NF!=0' | zlib-flate -uncompress > de.bin
daniel@daniel-mint ~/latex/linux/itext/daniel $ cat de.bin
q
BT
36 612 Td
0 -18 Td
/F1 12 Tf
(Hello World! Hello People! Hello Sky! Hello Sun! Hello Moon! Hello)Tj
0 0 Td
0 -18 Td
(Stars!)Tj
0 0 Td
ET
Q
daniel@daniel-mint ~/latex/linux/itext/daniel $ sed -e 's/Hello.*Hello/Daniel King is a software engineer!/g' de.bin
q
BT
36 612 Td
0 -18 Td
/F1 12 Tf
(Daniel King is a software engineer!)Tj
0 0 Td
0 -18 Td
(Stars!)Tj
0 0 Td
ET
Q
daniel@daniel-mint ~/latex/linux/itext/daniel $ sed -e 's/Hello.*Hello/Daniel King is a software engineer!/g' de.bin > de1.bin
daniel@daniel-mint ~/latex/linux/itext/daniel $ cat daniel.pdf | awk 'BEGIN{p=1}; p; /stream/{p=0};' > reassembled.pdf
daniel@daniel-mint ~/latex/linux/itext/daniel $ cat de1.bin | zlib-flate -compress >> reassembled.pdf
daniel@daniel-mint ~/latex/linux/itext/daniel $ echo -e '\nendstream' >> reassembled.pdf
daniel@daniel-mint ~/latex/linux/itext/daniel $ cat daniel.pdf | awk 'BEGIN{p=0}; p; /endstream/{p=1};' >> reassembled.pdf
结果虽然能在pdf viewer中显示,但是用pdf2txt处理会失败,因此还是hack的不完美。
我们再看一下PoDoFo的实现
802
803
804
805 m_oss.str("");
806 m_oss << "BT" << std::endl << "/" << m_pFont->GetIdentifier().GetName()
807 << " " << m_pFont->GetFontSize()
808 << " Tf" << std::endl;
809
810 if (currentTextRenderingMode != ePdfTextRenderingMode_Fill) {
811 SetCurrentTextRenderingMode();
812 }
813
814 //if( m_pFont->GetFontScale() != 100.0F ) - this value is kept between text blocks
815 m_oss << m_pFont->GetFontScale() << " Tz" << std::endl;
816
817 //if( m_pFont->GetFontCharSpace() != 0.0F ) - this value is kept between text blocks
818 m_oss << m_pFont->GetFontCharSpace() * m_pFont->GetFontSize() / 100.0 << " Tc" << std::endl;
819
820 m_oss << dX << std::endl
821 << dY << std::endl << "Td ";
822
823 m_pCanvas->Append( m_oss.str() );
824 m_pFont->WriteStringToStream( sString, m_pCanvas );
825
826 /*
827 char* pBuffer;
828 std::auto_ptr<PdfFilter> pFilter = PdfFilterFactory::Create( ePdfFilter_ASCIIHexDecode );
829 pFilter->Encode( sString.GetString(), sString.GetLength(), &pBuffer, &lLen );
830
831 m_pCanvas->Append( pBuffer, lLen );
832 free( pBuffer );
833 */
834
835 m_pCanvas->Append( " Tj\nET\n" );
836 }
可以看到,它依次调用了
Tf : 选择字体,设置字体大小
Tz: 设置横向缩放比例因子
Tc: 设置字符间距离
Td: 设置位置
Tj: 显示字符串
iText例子的更多相关文章
- 关于java poi itext生成pdf文件的例子以及方法
最近正在做导出pdf文件的功能,所以查了了一些相关资料,发现不是很完善,这里做一些小小的感想,欢迎各位“猿”童鞋批评指正. poi+itext,所需要的jar包有itext-2.1.7.jar,poi ...
- iText实现导出pdf文件java代码实现例子
///////////////////////////////////主类////////////////////////////////////////// package com.iText; i ...
- 利用itext生成pdf的简单例子
一.itext简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文 ...
- 利用itext导出PDF的小例子
我这边使用的jar包: itext-2.1.7.jar itextasian-1.5.2.jar 代码,简单的小例子,导出pdf: PdfService.java: package com.cy.se ...
- 使用iText库创建PDF文件
前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读 ...
- PDF 生成插件 flying saucer 和 iText
最近的项目中遇到了需求,用户在页面点击下载,将页面以PDF格式下载完成供用户浏览,所以上网找了下实现方案. 在Java世界,要想生成PDF,方案不少,所以简单做一个小结吧. 在此之前,先来勾画一下我心 ...
- C#:IText构造PDF文件
IText构造PDF文件 1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象. Document有三种 ...
- iText导出pdf、word、图片
一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...
- Itext导出PDF,word,图片案例
iText导出pdf.word.图片 一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生 ...
随机推荐
- 记录XorDDos木马清理步骤
1.检查 查看定时任务文件发现有两个异常定时任务 [root@manage ~]# cat /etc/crontab # * * * * * user-name command to be execu ...
- [CF643E]Bear and Destroying Subtrees(期望,忽略误差)
Description: 给你一棵初始只有根为1的树 两种操作 1 x 表示加入一个新点以 x为父亲 2 x 表示以 x 为根的子树期望最深深度 每条边都有 \(\frac{1}{ ...
- python学习第二十八天函数局部变量的用法
函数局部变量是在函数里面的变量,只能在函数内部使用,如果函数没有找对应变量,函数将去函数外部找对应变量,局部变量优先级大于外部变量,详细说明一下 1,局部变量已经定义值 name='zhan san' ...
- Mybatis-技术专区-Mapper接口以及Example的实例函数及详解
一.mapper接口中的方法解析 mapper接口中的函数及方法 int countByExample(UserExample example) thorws SQLException 按条件 ...
- Android应用程序开发之图片操作(二)——工程图片资源的加载及OOM的处理
(一)工程图片资源的加载方法 在Android应用程序开发之图片操作(一)中,详细说明了如何操作各种资源图片,只是有的没有附上示例代码,在此,我将针对项目工程中的图片资源的显示加载进行说明.官方说明, ...
- mintUI修改toast样式的问题解决办法
在公共样式中加入 /*修改mintUI 弹窗样式大小*/ .noticeErrorToast{ transform: scale(2) !important; margin-left:-.6rem ! ...
- Linux统计文件内容
wc:统计文件的行数.单词数.字节数(word count) - wc char.txt:统计出文件char.txt的换行符个数.单词数.字节数 (char.txx有14行.13个单词.66字节) - ...
- 手动实现一个vue的mvvm,思路解析
1.解析dom.fragment编译,初始化new watcher 2 ,数据劫持,Object.defineProperty(obj,key,{ configurable:true,// 可以配置 ...
- java随机数Math.random()
double random=Math.random();//返回[0,1)随机数 (int)(Math.random()*6)//返回0-5:随机数 (int)(Math.random()*6+1)/ ...
- rpc - rpc 程序号数据库
SYNOPSIS /etc/rpc DESCRIPTION rpc 文件列出了rpc 程序的可读名, 可以此代替rpc 程序号. 每行包含如下信息: 运行rpc 程序的服务名 rpc 程序号 别名 各 ...