您当前的位置:首页 > 互联网教程

如何运用Java组件itext生成pdf

发布时间:2025-05-22 07:20:10    发布人:远客网络

如何运用Java组件itext生成pdf

一、如何运用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);