由于工作需要,今天简单的看了一下Java生成PDF的相关资料。综合看下来,除了使用报表平台和OOo的附带工具,目前使用较为普遍的有两个途径:iText和Apache的FOP。从实际出发,我们分别看看两者处理带有中文的PDF的具体用法吧。
[iText] (
link)
iText我想大概不少人都有所耳闻,JasperReports默认的PDF支持就来自这个软件包,它处理速度快,支持很多PDF"高级"特性,如:Annotations、AcroForms、数字签名、加密等,支持对已有PDF的处理,通过iTextAsian.jar和iTextAsianCmaps.jar,它对中文的支持也不错。缺点是较为依赖Java代码,需要学习不少的专有API,当输入/输出格式有变化时,需要修改代码(除非手工写一些wrapper),不够灵活。目前的版本是2.1.3。具体代码:
Formatter.java
<!---->
1 import java.io.FileOutputStream;
2
3 import com.lowagie.text.Document;
4 import com.lowagie.text.Font;
5 import com.lowagie.text.PageSize;
6 import com.lowagie.text.Paragraph;
7 import com.lowagie.text.pdf.BaseFont;
8 import com.lowagie.text.pdf.PdfWriter;
9
10 public class Formatter {
11
12 public static void main(String[] args) throws Exception {
13 Document document = new Document(PageSize.A4);
14 try {
15 System.out.print("Generating PDF");
16 PdfWriter.getInstance(document, new FileOutputStream("test.pdf"));
17 document.open();
18 //iText自带的中文字体
19 BaseFont bf1 = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
20 //自定义字体
21 BaseFont bf2 = BaseFont.createFont("wqy-zenhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
22 Font font = new Font(bf2, 12, Font.NORMAL);
23 Paragraph p = new Paragraph("测试abc中文123", font);
24 document.add(p);
25 System.out.println("Done.");
26 } finally {
27 document.close();
28 }
29 }
30
31 }
效果:
中文支持有默认的STSong-Light等字体,但为了优化输出效果,这里使用了文泉驿正黑字体。如果不指定中文字体,默认情况下中文字符不会显示。
[FOP] (
link)
FOP出自Apache,在各大Java网站、论坛出现相对较低,我也是从DocBook这条线摸进来的,DocBook主要提供了一个现成的、符合一般技术书籍要求的数据结构,而展现效果(如PDF),则是通过预定义好的XSL-FO来实现的。XSL-FO是W3C的标准,正式的名称是XSL,是XSL相关的三大组件/语言中的一个,另外两个是XSLT和XPath。Apache的FOP是处理FO的众多proecessor之一,相比iText,支持的输出格式更多,对W3C相关标准支持度高,格式定义可以完全脱离具体的Java代码,十分灵活,且控制力很强。缺点是大数据量时性能较差,默认中文支持不好。目前的版本是0.95。具体代码:
test.xml
<!----> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <source>
3 <title>
4 FOP Sample
5 </title>
6 <paragraph>
7 测试abc中文123
8 </paragraph>
9 </source>
test.xsl
<!----> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:transform version="1.0"
3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4 xmlns:fo="http://www.w3.org/1999/XSL/Format">
5
6 <xsl:template match="/">
7 <fo:root>
8 <fo:layout-master-set>
9 <fo:simple-page-master master-name="A4-portrait"
10 page-height="29.7cm" page-width="21.0cm" margin="2cm">
11 <fo:region-body/>
12 </fo:simple-page-master>
13 </fo:layout-master-set>
14 <fo:page-sequence master-reference="A4-portrait">
15 <fo:flow flow-name="xsl-region-body">
16 <fo:block font-family="WenQuanYi Zen Hei" font-size="24pt">
17 <xsl:value-of select="source/title"/>
18 </fo:block>
19 <fo:block font-family="WenQuanYi Zen Hei" text-indent="1cm">
20 <xsl:value-of select="source/paragraph"/>
21 </fo:block>
22 </fo:flow>
23 </fo:page-sequence>
24 </fo:root>
25 </xsl:template>
26
27 </xsl:transform>
fop-config.xml
<!----> 1 <?xml version="1.0"?>
2 <fop version="1.0">
3 <base>.</base>
4 <source-resolution>72</source-resolution>
5 <target-resolution>72</target-resolution>
6 <default-page-settings height="29.7cm" width="21.0cm"/>
7 <renderers>
8 <renderer mime="application/pdf">
9 <filterList>
10 <value>flate</value>
11 </filterList>
12 <fonts>
13 <directory>.</directory>
14 <auto-detect/>
15 </fonts>
16 </renderer>
17 </renderers>
18 </fop>
Formatter.java
<!---->
1 import java.io.File;
2 import java.io.FileOutputStream;
3 import java.io.OutputStream;
4
5 import javax.xml.transform.Result;
6 import javax.xml.transform.Source;
7 import javax.xml.transform.Transformer;
8 import javax.xml.transform.TransformerFactory;
9 import javax.xml.transform.sax.SAXResult;
10 import javax.xml.transform.stream.StreamSource;
11
12 import org.apache.fop.apps.FOUserAgent;
13 import org.apache.fop.apps.Fop;
14 import org.apache.fop.apps.FopFactory;
15 import org.apache.fop.apps.MimeConstants;
16
17 public class Formatter {
18
19 public static void main(String[] args) throws Exception {
20 File source = new File("test.xml");
21 File specs = new File("test.xsl");
22 File target = new File("test.pdf");
23 FopFactory fopFactory = FopFactory.newInstance();
24 fopFactory.setUserConfig("fop-config.xml"); // 读取自定义配置
25 FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
26 OutputStream out = new FileOutputStream(target);
27 out = new java.io.BufferedOutputStream(out);
28 try {
29 System.out.print("Generating PDF");
30 Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
31 TransformerFactory factory = TransformerFactory.newInstance();
32 Transformer transformer = factory.newTransformer(new StreamSource(specs));
33 Source src = new StreamSource(source);
34 Result res = new SAXResult(fop.getDefaultHandler());
35 transformer.transform(src, res);
36 System.out.println("Done.");
37 } finally {
38 out.close();
39 }
40 }
41
42 }效果:
FOP的中文支持(其实是自定义字体支持),在0.94版本之前,十分有限,对每一个需要使用的TrueType字体,都需要生成一个metrics文件,在0.94和之后的版本,则没有这个要求,且可以自动扫描系统字体和指定文件夹中的TTF字体。如果不配置中文字体,默认情况下,中文字符在PDF中将被处理成"#"。
上面的示例代码虽然简单,但展示了FOP真正强大的地方,那就是控制力。这里篇幅有限,不可能全部特性都一一涉及,这个简单的例子至少可以让我们看到从原始的XML格式的数据,通过XSLT按照自定义的规则转换成XSL-FO,最后输出到PDF的过程,每一步都可以在Java代码之外进行严格控制。
以上是我对iText和FOP一些基本特点和用法的整理,它们各有特点,大家可以根据各自需要继续深入研究,FOP和iText相结合也未尝不可。希望能够帮助到有需要的朋友。
分享到:
相关推荐
在这个场景中,我们关注的是两个特定版本的iText库:`itext-asian-5.2.0.jar` 和 `itextpdf-5.5.5.jar`。 `itext-asian-5.2.0.jar` 是iText的一个扩展版本,特别针对亚洲语言的支持。这个版本包含了对中文、日文、...
这个压缩包包含了两个主要的JAR文件:`itext-asian-5.2.0.jar`和`itextpdf-5.5.13.1.jar`,它们在处理PDF文件时扮演着重要的角色。 `itext-asian-5.2.0.jar`是iText的一个扩展,主要是为了支持亚洲语言,如中文、...
在本案例中,我们关注的是两个特定版本的JAR包:`itext-asian-5.2.0.jar` 和 `itextpdf-5.5.5.jar`。 `itext-asian-5.2.0.jar` 是iText的一个扩展,专门针对亚洲语言,如简体中文、繁体中文、日语和韩语等。这个...
`itext-asian-5.2.0.jar` 和 `itextpdf-5.5.5.jar` 是两个关键的Java库,专门解决这个问题。 `itext-asian-5.2.0.jar` 是iText库的一个扩展,主要针对亚洲语言的支持,包括中文、日文和韩文。这个库包含了处理中文...
总结起来,`itext-asian-5.2.0.jar`和`itextpdf-5.5.5.jar`这两个JAR包组合使用,可以有效地解决在Java程序中使用iText导出包含中文内容的PDF文档时可能出现的显示问题。通过正确地加载和应用支持中文的字体,以及...
通过以上步骤,你可以在Java环境中利用iTextPDF和iText-Asian库为PDF文件添加中文水印。这个过程涉及到PDF文档的读取、写入、文本样式设定以及内容的定位,是一个典型的PDF处理应用场景。在实际开发中,你可能需要...
pdf定位签字包(itext-asian-5.2.0.jar与itextpdf-5.5.11.jar)。专门用来做定位。参考文档:https://www.jb51.net/article/212310.htm
基于iText和flying saucer结合freemark生成pdf 范例 1. 使用maven构建,不含jar包,可以自行使用maven下载依赖包, 2. 使用前需要将C:/Windows/Fonts/ARIALUNI.TTF 复制到doc-render/src/test/resources/config/fonts...
总的来说,iText7-7.0.2的这个Java PDF库可以用于各种场景,例如创建PDF文档、添加表单字段、处理图像、生成和读取条形码、签署PDF文件,以及对PDF进行各种高级操作。开发人员可以根据自己的需求选择相应的模块,...
- **标题解读**:“itext-in-action java开发pdf”这一标题明确指出了本书的主要内容:使用 Java 和 iText 库来创建和操作 PDF 文件。iText 是一个广泛使用的开源库,它允许开发者在 Java 应用程序中生成、读取和...
这个压缩包包含两个重要的JAR文件:`itextpdf-5.5.12.jar`和`itext-asian-5.2.0.jar`,它们是iText库的不同版本,用于帮助Java程序创建、编辑和操作PDF文档。 首先,我们来详细了解一下`itextpdf-5.5.12.jar`。这是...
在本例中,我们有两个jar文件:`itext-2.1.7.jar`和`itext-rtf-2.1.7.jar`。`itext-2.1.7.jar`是iText的基本库,主要用于生成PDF文件,而`itext-rtf-2.1.7.jar`是其RTF扩展,使我们能够创建和编辑RTF格式的文件,...
本文将深入探讨如何使用iText7这个库在Java环境中生成带有页码和目录的PDF文件。 iText7是一款功能丰富的PDF处理库,它支持创建、编辑、解析和展示PDF文档。在Java中,我们可以利用iText7轻松地生成具有复杂结构的...
3. iText-5.0.6.jar 和 itext-2.1.7.jar:这两个版本的iText核心库,分别对应于iText的两个不同版本。iText 2.x系列是早期版本,而iText 5.x带来了许多改进和新特性,例如更全面的PDF/A支持,更好的XML处理,以及更...
在这个场景中,我们涉及了两个关键的jar文件:"itext-asian-5.2.0.jar" 和 "itextpdf-5.5.13.jar"。这两个文件是iText的不同版本和特定扩展,它们提供了丰富的功能来创建、编辑和处理PDF文档。 首先,"itextpdf-...
java的PDF生成jar包,包含 iText-5.5.8.jar, iTextAsian.jar, itextpdf-5.5.8, itextpdf-5.5.8-javadoc, itext-xtra-5.5.8, xmlworker-5.5.8。 已打包中文字体
这两个组件在Java开发中,特别是在处理PDF文档时,是不可或缺的工具。 **iText PDF库**: iText 是一个功能强大的PDF库,允许开发者在Java或.NET环境中创建、修改、合并和拆分PDF文档。它的核心功能包括: 1. **...
赠送jar包:itext-2.1.7.jar; 赠送原API文档:itext-2.1.7-javadoc.jar; 赠送源代码:itext-2.1.7-sources.jar; 赠送Maven依赖信息文件:itext-2.1.7.pom; 包含翻译后的API文档:itext-2.1.7-javadoc-API文档-...
iText-2.1.3是iText的一个早期版本,它提供了基本的PDF操作功能,包括创建新的PDF文档、添加文本、图像、表格和链接,以及修改已存在的PDF文档。这个版本支持PDF 1.4规范,意味着你可以创建符合这一标准的PDF文件。...