参考: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例子的更多相关文章

  1. 关于java poi itext生成pdf文件的例子以及方法

    最近正在做导出pdf文件的功能,所以查了了一些相关资料,发现不是很完善,这里做一些小小的感想,欢迎各位“猿”童鞋批评指正. poi+itext,所需要的jar包有itext-2.1.7.jar,poi ...

  2. iText实现导出pdf文件java代码实现例子

    ///////////////////////////////////主类////////////////////////////////////////// package com.iText; i ...

  3. 利用itext生成pdf的简单例子

    一.itext简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文 ...

  4. 利用itext导出PDF的小例子

    我这边使用的jar包: itext-2.1.7.jar itextasian-1.5.2.jar 代码,简单的小例子,导出pdf: PdfService.java: package com.cy.se ...

  5. 使用iText库创建PDF文件

    前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读 ...

  6. PDF 生成插件 flying saucer 和 iText

    最近的项目中遇到了需求,用户在页面点击下载,将页面以PDF格式下载完成供用户浏览,所以上网找了下实现方案. 在Java世界,要想生成PDF,方案不少,所以简单做一个小结吧. 在此之前,先来勾画一下我心 ...

  7. C#:IText构造PDF文件

    IText构造PDF文件 1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象. Document有三种 ...

  8. iText导出pdf、word、图片

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  9. Itext导出PDF,word,图片案例

    iText导出pdf.word.图片 一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生 ...

随机推荐

  1. knn算法手写字识别案例

    import pandas as pd import numpy as np import matplotlib.pyplot as plt import os from sklearn.neighb ...

  2. ExcelVBA 操作putty

    Private Sub login(ip As String, userName As String, password As String) Dim TaskID As Long '设置进程id p ...

  3. 使用Angular2+的内置管道格式化数据

    在简书看到一篇关于Angualr运用内置管道格式化数据的总结,感觉挺实用的,转载一下以供参考: [转载]https://www.jianshu.com/p/a8bd5a1d2c53 PS:管道是在HT ...

  4. 【洛谷新手村】简单字符串 p1055 ISBN号码

    p1055 ISBN号码[传送门] 算法标签什么的: 思路:直接以字符串的形式读入这一串数字,然后for循环对字符串进行处理,字符串中的数字存进数组中(如果是X,存为10):然后再根据要求判断是否是正 ...

  5. centos7 nginx完整支持thinkphp pathinfo模式开启方法

    thinkphp运行在linux+nginx,如何开启pathinfo模式,我是完整测试过了,没问题的,在thinkphp配置文件 开启    'URL_MODEL'   =>  1,   1代 ...

  6. saltstack的高级管理

    一.saltstack的状态管理 状态管理官网: https://www.unixhot.com/docs/saltstack/ref/states/all/index.html 1)状态分析 [ro ...

  7. PHP内置函数parse_str会自动进行urldecode(URL解码)

    用法:void parse_str ( string $str [, array &$arr] ) parse_str用来解析(分离)URL中的查询字符串(Query String),所谓查询 ...

  8. 一、简单的图片上传并预览功能input[file]

    一.简单的图片上传并预览功能input[file] <!DOCTYPE html> <html lang="en"> <head> <me ...

  9. update all line start with -- to space

    update all line start with -- to space ^--.*$

  10. 生成树计数 Matrix-Tree 定理 学习笔记

    一直都知道要用Matrix-Tree定理来解决生成树计数问题,但是拖到今天才来学.博主数学不好也只能跟着各位大佬博客学一下它的应用以及会做题,证明实在是不会. 推荐博客: https://www.cn ...