如何运用Java组件itext生成pdf
发布时间:2025-05-22 07:20:10 发布人:远客网络
一、如何运用Java组件itext生成pdf
首先从iText的官网下载这个开源的小组件。
这里笔者使用的是Java版itext-5.2.1。
将itext-5.2.1.zip压缩包解压缩后得到7个文件:itextpdf-5.2.1.jar(核心组件)、itextpdf-5.2.1-javadoc.jar(API文档)、itextpdf-5.2.1-sources.jar(源代码)、itext-xtra-5.2.1.jar、itext-xtra-5.2.1-javadoc.jar、itext-xtra-5.2.1-sources.jar
使用5步即可生成一个简单的PDF文档。
2 Document _document= new Document();
3// 2.创建书写器,通过书写器将文档写入磁盘
4 PdfWriter _pdfWriter= PdfWriter.getInstance(_document, new FileOutputStream("生成文件的路径"));
8 _document.add(new Paragraph("Hi"));
OK,搞定,不出问题的话就会在你指定的路径中生成一个PDF文档,内容是纯文本的“Hi”。
可是这样并不能完全满足我们的需求,因为通常我们要生成的PDF文件不一定是纯文本格式的,比如我现在要实现打印销售单的功能,那么最起码需要绘制表格才行,怎么办呢?且跟笔者继续向下研究。
在iText中,有专门的表格类,即PdfPTable类。笔者做了一个简单的表格示例,请先看代码:
1 OutTradeList _otl= this.getOtlBiz().findOutTradeListById(this.getOtlid());
2 String _fileName= _otl.getOtlId()+".pdf";
5 BaseFont _baseFont= BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H", true);
7 Document _document= new Document(PageSize.A4);
9 HttpServletResponse response= ServletActionContext.getResponse();
10 response.setContentType("application/pdf; charset=ISO-8859-1");
11 response.setHeader("Content-Disposition","inline; filename="+ new String(_fileName.getBytes(),"iso8859-1"));
13// 2.创建书写器,通过书写器将文档写入磁盘
14 PdfWriter _pdfWriter= null;
16 _pdfWriter= PdfWriter.getInstance(_document, response.getOutputStream());
18 this.setMessage("单据生成失败,请检查服务器目录权限配置是否正确");
20 System.out.println("2.挂了");
25 this.setMessage("单据生成失败,请检查服务器目录权限配置是否正确");
26 System.out.println("3.挂了");
35 PdfPTable _table= new PdfPTable(4);
38 _table.addCell(new Paragraph("单据号", new Font(_baseFont)));
39 _cell= new PdfPCell(new Paragraph(_otl.getOtlId()));
43 _table.addCell(new Paragraph("客户名称", new Font(_baseFont)));
44 _cell= new PdfPCell(new Paragraph(_otl.getClients().getName(), new Font(_baseFont)));
48 _table.addCell(new Paragraph("销售日期", new Font(_baseFont)));
49 _cell= new PdfPCell(new Paragraph(_otl.getOutDate().toString()));
55 PdfPTable _tabGoods= new PdfPTable(7);
57 _tabGoods.setHeaderRows(1);
58 _tabGoods.addCell(new Paragraph("序号", new Font(_baseFont)));
59 _tabGoods.addCell(new Paragraph("商品名称", new Font(_baseFont)));
60 _tabGoods.addCell(new Paragraph("自定义码", new Font(_baseFont)));
61 _tabGoods.addCell(new Paragraph("规格", new Font(_baseFont)));
62 _tabGoods.addCell(new Paragraph("数量", new Font(_baseFont)));
63 _tabGoods.addCell(new Paragraph("单价", new Font(_baseFont)));
64 _tabGoods.addCell(new Paragraph("小计", new Font(_baseFont)));
65 Object[] _outTrades= _otl.getOutTrades().toArray();
66//将商品销售详细信息加入表格
67 for(int i= 0; i< _outTrades.length;){
68 if((_outTrades[i]!= null)&&(_outTrades[i] instanceof OutTrade)){
69 OutTrade _ot=(OutTrade) _outTrades[i];
70 Goods _goods= _ot.getGoods();
71 _tabGoods.addCell(String.valueOf((++i)));
72 _tabGoods.addCell(new Paragraph(_goods.getName(), new Font(_baseFont)));
73 _tabGoods.addCell(_goods.getUserCode());
74 _tabGoods.addCell(_goods.getEtalon());
75 _tabGoods.addCell(String.valueOf(_ot.getNum()));
76 _tabGoods.addCell(String.valueOf(_ot.getPrice()));
77 _tabGoods.addCell(String.valueOf((_ot.getNum()* _ot.getPrice())));
80 _cell.addElement(_tabGoods);
83 _table.addCell(new Paragraph("总计", new Font(_baseFont)));
84 _cell= new PdfPCell(new Paragraph(_otl.getAllPrice().toString()));
88 _table.addCell(new Paragraph("操作员", new Font(_baseFont)));
89 _cell= new PdfPCell(new Paragraph(_otl.getProcure()));
93// 5.向文档中添加内容,将表格加入文档中
98 System.out.println(_fileName);
99 this.setPdfFilePath(_fileName);
100 System.out.println("3.搞定");
以上代码是写在 Struts2的 Action中的,当用户发送了请求之后直接将生成的PDF文件用输出流写入到客户端,浏览器收到服务器的响应之后就会询问用户打开方式。
当然,我们也可以将文件写入磁盘等等。
二、压缩文件字典大小
压缩字典是被压缩算法使用的内存区域,用来查找和压缩重复数据模式。
大字典会很大程在度提高大文件,特别是固实模式中的压缩效果,但它也会导致较慢的压缩速度和更高的内存需求。
一般RAR格式使用 4MB的字典,RAR5(RAR5.0)压缩文件格式使用 32MB。
字典越大,压缩速度就越慢,耗内存就越多。但是压缩后的文件将会越小。一般不建议调节到太大,因为这样做会相当消耗系统资源的。
具体可以根据自己电脑的内存大小来决定,不把物理内存用完就可以了。
JAR文件就是 Java Archive File,顾名思意,它的应用是与 Java息息相关的,是 Java的一种文档格式。JAR文件非常类似 ZIP文件——准确的说,它就是 ZIP文件,所以叫它文件包。JAR文件与 ZIP文件唯一的区别就是在 JAR文件的内容中,包含了一个 META-INF/MANIFEST.MF文件,这个文件是在生成 JAR文件的时候自动创建的。
ZIP应该算是最常见的压缩文件格式了,它不需要单独的一个压缩或者解压缩软件,因为Windows系统已经集成了对ZIP压缩格式的支持。
虽然ZIP在压缩文件格式中地位很高,但相当多的下载网站都选择了用RAR格式来压缩他们的文件,最根本的原因就在于RAR格式的文件压缩率比ZIP更高。
作为压缩格式的后起新秀,7Z有着比RAR更高的压缩率,能够将文件压缩的更加小巧。不过因为RAR格式已经高度普及,又没有网络普及的“天时”相助,7Z想要取代RAR的地位还是相当不容易的。
CAB是微软的一种安装文件压缩格式,主要应用于软件的安装程序中。因为涉及到安装程序,所以cab文件中包含的文件通常都不是简单的直接压缩,而是对文件名等都进行了处理,所以虽然可以对其直接解压缩,但解压后得到的文件通常都无法直接使用。
很多人都认为ISO是一种压缩格式,这源于WinRAR添加了对ISO格式“解压”的支持。而实际上,ISO并不是压缩格式,它之中所包含的文件也并没有经过压缩。ISO只是一种光盘的镜像格式,完全复制并保存了光盘上的内容而已。所谓的对ISO“解压”的过程,不过就是对ISO内文件的提取过程。
tar为后辍的文件能用WinZip或WinRAR打开,是因为WinZip或WinRar对.tar文件进行了关联,也就是指可以用相应的解压软件将其解压,tar是linux下较为常用的压缩文件的格式。
uue是一种在遇到邮件编码混合引起乱码的情况下比较有用的压缩格式,可以用WinZip或者WinRAR打开。
三、java 有关word,excel,pdf转换成html 有几种方式
java将Word/Excel/PDF文件转换成HTML整理
项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下:
一、使用Jacob转换Word,Excel为HTML
“JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32 libraries。”
首先下载Jacob包,JDK1.5以上需要使用Jacob1.9版本(JDK1.6尚未测试),与先前的Jacob1.7差别不大
1、将压缩包解压后,Jacob.jar添加到Libraries中;
2、将Jacob.dll放至“WINDOWS\SYSTEM32”下面。
【使用IDE启动Web服务器时,系统读取不到Jacob.dll,例如用MyEclipse启动Tomcat,就需要将dll文件copy到MyEclipse安装目录的“jre\bin”下面。
一般系统没有加载到Jacob.dll文件时,报错信息为:“java.lang.UnsatisfiedLinkError: no jacob in java.library.path”】
3 public static final int WORD_HTML= 8;
5 public static final int WORD_TXT= 7;
7 public static final int EXCEL_HTML= 44;
11*@param docfile WORD文件全路径
12*@param htmlfile转换后HTML存放路径
14 public static void wordToHtml(String docfile, String htmlfile)
16 ActiveXComponent app= new ActiveXComponent("Word.Application");//启动word
19 app.setProperty("Visible", new Variant(false));
20 Dispatch docs= app.getProperty("Documents").toDispatch();
21 Dispatch doc= Dispatch.invoke(
25 new Object[]{ docfile, new Variant(false),
26 new Variant(true)}, new int[1]).toDispatch();
27 Dispatch.invoke(doc,"SaveAs", Dispatch.Method, new Object[]{
28 htmlfile, new Variant(WORD_HTML)}, new int[1]);
29 Variant f= new Variant(false);
30 Dispatch.call(doc,"Close", f);
38 app.invoke("Quit", new Variant[]{});
44*@param xlsfile EXCEL文件全路径
45*@param htmlfile转换后HTML存放路径
47 public static void excelToHtml(String xlsfile, String htmlfile)
49 ActiveXComponent app= new ActiveXComponent("Excel.Application");//启动word
52 app.setProperty("Visible", new Variant(false));
53 Dispatch excels= app.getProperty("Workbooks").toDispatch();
54 Dispatch excel= Dispatch.invoke(
58 new Object[]{ xlsfile, new Variant(false),
59 new Variant(true)}, new int[1]).toDispatch();
60 Dispatch.invoke(excel,"SaveAs", Dispatch.Method, new Object[]{
61 htmlfile, new Variant(EXCEL_HTML)}, new int[1]);
62 Variant f= new Variant(false);
63 Dispatch.call(excel,"Close", f);
71 app.invoke("Quit", new Variant[]{});
当时我在找转换控件时,发现网易也转载了一偏关于Jacob使用帮助,但其中出现了比较严重的错误:String htmlfile="C:\\AA";
只指定到了文件夹一级,正确写法是String htmlfile="C:\\AA\\xxx.html";
到此WORD/EXCEL转换HTML就已经差不多了,相信大家应该很清楚了:)
1、下载xpdf最新版本,地址:
我下载的是xpdf-3.02pl2-win32.zip
我下载的是xpdf-chinese-simplified.tar.gz
地址:
我下载的是:pdftohtml-0.39-win32.tar.gz
1)先将xpdf-3.02pl2-win32.zip解压,解压后的内容可根据需要进行删减,如果只需要转换为txt格式,其他的exe文件可以删除,只保留pdftotext.exe,以此类推;
2)然后将xpdf-chinese-simplified.tar.gz解压到刚才xpdf-3.02pl2-win32.zip的解压目录;
3)将pdftohtml-0.39-win32.tar.gz解压,pdftohtml.exe解压到xpdf-3.02pl2-win32.zip的解压目录;
+------[X:\xpdf\xpdf-chinese-simplified]
+-------很多转换时需要用到的字符文件
xpdfrc:此文件是用来声明转换字符集对应路径的文件
5)修改xpdfrc文件(文件原名为sample-xpdfrc)
#----- begin Chinese Simplified support package
cidToUnicode Adobe-GB1 xpdf-chinese-simplified\Adobe-GB1.cidToUnicode
unicodeMap ISO-2022-CN xpdf-chinese-simplified\ISO-2022-CN.unicodeMap
unicodeMap EUC-CN xpdf-chinese-simplified\EUC-CN.unicodeMap
unicodeMap GBK xpdf-chinese-simplified\GBK.unicodeMap
cMapDir Adobe-GB1 xpdf-chinese-simplified\CMap
toUnicodeDir xpdf-chinese-simplified\CMap
fontDir C:\WINDOWS\Fonts
displayCIDFontTT Adobe-GB1 C:\WINDOWS\Fonts\simhei.ttf
#----- end Chinese Simplified support package
6)创建bat文件pdftohtml.bat(放置的路径不能包含空格)
private static String INPUT_PATH;
private static String PROJECT_PATH;
public static void convertToHtml(String file, String project)
private static int checkContentType()
String type= INPUT_PATH.substring(INPUT_PATH.lastIndexOf(".")+ 1, INPUT_PATH.length())
if(new File(INPUT_PATH).isFile())
String cmd="cmd/c start X:\\pdftohtml.bat\""+ PROJECT_PATH+"\"\""+ INPUT_PATH+"\"";
Runtime.getRuntime().exec(cmd);