itext 生成 PDF(一)

itext 生成 PDF(一),第1张

itext 生成 PDF(二)

官网: http://itextsupport.com/apidocs/itext5/latest/

博文: https://blog.csdn.net/u010154380/article/details/78087663

博文: https://blog.csdn.net/u013129932/article/details/43889705

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

项目要使用iText,必须引入jar包。才能使用,maven依赖如下:

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency>

输出中文,还要引入下面itext-asian.jar包:

<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

设置pdf文件密码,还要引入下面bcprov-jdk15on.jar包:

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.54</version></dependency>

iText常用类

com.itextpdf.text.Document:这是iText库中最常用的类,它代表了一个pdf实例。如果你需要从零开始生成一个PDF文件,你需要使用这个Document类。首先创建(new)该实例,然后打开(open)它,并添加(add)内容,最后关闭(close)该实例,即可生成一个pdf文件。

com.itextpdf.text.Paragraph:表示一个缩进的文本段落,在段落中,你可以设置对齐方式,缩进,段落前后间隔等

com.itextpdf.text.Chapter:表示PDF的一个章节,他通过一个Paragraph类型的标题和整形章数创建

com.itextpdf.text.Font:这个类包含了所有规范好的字体,包括family of font,大小,样式和颜色,所有这些字体都被声明为静态常量

com.itextpdf.text.List:表示一个列表;

com.itextpdf.text.Anchor:表示一个锚,类似于HTML页面的链接。

com.itextpdf.text.pdf.PdfWriter:当这个PdfWriter被添加到PdfDocument后,所有添加到Document的内容将会写入到与文件或网络关联的输出流中。

com.itextpdf.text.pdf.PdfReader:用于读取PDF文件;

iText使用

创建一个简单的pdf文件,如下:

packagecom.hd.pdfimportjava.io.FileNotFoundExceptionimportjava.io.FileOutputStreamimportcom.itextpdf.text.Documentimportcom.itextpdf.text.DocumentExceptionimportcom.itextpdf.text.Paragraphimportcom.itextpdf.text.pdf.PdfWriterpublicclassTestPDFDemo1{publicstaticvoidmain(String[]args)throws FileNotFoundException,DocumentException{// 1.新建document对象Document document=newDocument()// 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。PdfWriter writer=PdfWriter.getInstance(document,newFileOutputStream("C:/Users/H__D/Desktop/test.pdf"))// 3.打开文档document.open()// 4.添加一个内容段落document.add(newParagraph("Hello World!"))// 5.关闭文档document.close()}}

打开文件

851491-20161209165247147-746087588.png

PDF中创建表格

publicstaticvoidmain(String[]args)throws DocumentException,FileNotFoundException{//创建文件Document document=newDocument()//建立一个书写器PdfWriter writer=PdfWriter.getInstance(document,newFileOutputStream("C:/Users/H__D/Desktop/test4.pdf"))//打开文件document.open()//添加内容document.add(newParagraph("HD content here"))// 3列的表.PdfPTable table=newPdfPTable(3)table.setWidthPercentage(100)// 宽度100%填充table.setSpacingBefore(10f)// 前间距table.setSpacingAfter(10f)// 后间距List<PdfPRow>listRow=table.getRows()//设置列宽float[]columnWidths={1f,2f,3f}table.setWidths(columnWidths)//行1PdfPCell cells1[]=newPdfPCell[3]PdfPRow row1=newPdfPRow(cells1)//单元格cells1[0]=newPdfPCell(newParagraph("111"))//单元格内容cells1[0].setBorderColor(BaseColor.BLUE)//边框验证cells1[0].setPaddingLeft(20)//左填充20cells1[0].setHorizontalAlignment(Element.ALIGN_CENTER)//水平居中cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE)//垂直居中cells1[1]=newPdfPCell(newParagraph("222"))cells1[2]=newPdfPCell(newParagraph("333"))//行2PdfPCell cells2[]=newPdfPCell[3]PdfPRow row2=newPdfPRow(cells2)cells2[0]=newPdfPCell(newParagraph("444"))//把第一行添加到集合listRow.add(row1)listRow.add(row2)//把表格添加到文件中document.add(table)//关闭文档document.close()//关闭书写器writer.close()}

打开图片

851491-20161209165247147-746087588.png

给PDF文件设置文件属性,例如:

publicstaticvoidmain(String[]args)throws FileNotFoundException,DocumentException{//创建文件Document document=newDocument()//建立一个书写器PdfWriter writer=PdfWriter.getInstance(document,newFileOutputStream("C:/Users/H__D/Desktop/test2.pdf"))//打开文件document.open()//添加内容document.add(newParagraph("Some content here"))//设置属性//标题document.addTitle("this is a title")//作者document.addAuthor("H__D")//主题document.addSubject("this is subject")//关键字document.addKeywords("Keywords")//创建时间document.addCreationDate()//应用程序document.addCreator("hd.com")//关闭文档document.close()//关闭书写器writer.close()}

打开文件

851491-20161209165247147-746087588.png

PDF中添加图片

publicstaticvoidmain(String[]args)throws DocumentException,IOException{//创建文件Document document=newDocument()//建立一个书写器PdfWriter writer=PdfWriter.getInstance(document,newFileOutputStream("C:/Users/H__D/Desktop/test3.pdf"))//打开文件document.open()//添加内容document.add(newParagraph("HD content here"))//图片1Image image1=Image.getInstance("C:/Users/H__D/Desktop/IMG_0109.JPG")//设置图片位置的x轴和y周image1.setAbsolutePosition(100f,550f)//设置图片的宽度和高度image1.scaleAbsolute(200,200)//将图片1添加到pdf文件中document.add(image1)//图片2Image image2=Image.getInstance(newURL("http://static.cnblogs.com/images/adminlogo.gif"))//将图片2添加到pdf文件中document.add(image2)//关闭文档document.close()//关闭书写器writer.close()}

打开图片

851491-20161209165247147-746087588.png

PDF中创建列表

publicstaticvoidmain(String[]args)throws DocumentException,FileNotFoundException{//创建文件Document document=newDocument()//建立一个书写器PdfWriter writer=PdfWriter.getInstance(document,newFileOutputStream("C:/Users/H__D/Desktop/test5.pdf"))//打开文件document.open()//添加内容document.add(newParagraph("HD content here"))//添加有序列表List orderedList=newList(List.ORDERED)orderedList.add(newListItem("Item one"))orderedList.add(newListItem("Item two"))orderedList.add(newListItem("Item three"))document.add(orderedList)//关闭文档document.close()//关闭书写器writer.close()}

打开文件

851491-20161209180029726-1168732515.png

PDF中设置样式/格式化输出,输出中文内容,必须引入itext-asian.jar

publicstaticvoidmain(String[]args)throws DocumentException,IOException{//创建文件Document document=newDocument()//建立一个书写器PdfWriter writer=PdfWriter.getInstance(document,newFileOutputStream("C:/Users/H__D/Desktop/test6.pdf"))//打开文件document.open()//中文字体,解决中文不能显示问题BaseFont bfChinese=BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED)//蓝色字体Font blueFont=newFont(bfChinese)blueFont.setColor(BaseColor.BLUE)//段落文本Paragraph paragraphBlue=newParagraph("paragraphOne blue front",blueFont)document.add(paragraphBlue)//绿色字体Font greenFont=newFont(bfChinese)greenFont.setColor(BaseColor.GREEN)//创建章节Paragraph chapterTitle=newParagraph("段落标题xxxx",greenFont)Chapter chapter1=newChapter(chapterTitle,1)chapter1.setNumberDepth(0)Paragraph sectionTitle=newParagraph("部分标题",greenFont)Section section1=chapter1.addSection(sectionTitle)Paragraph sectionContent=newParagraph("部分内容",blueFont)section1.add(sectionContent)//将章节添加到文章中document.add(chapter1)//关闭文档document.close()//关闭书写器writer.close()}

打开图片

![

851491-20161209180029726-1168732515.png

]

851491-20161209165247147-746087588.png

给PDF文件设置密码,需要引入bcprov-jdk15on.jar包:

publicstaticvoidmain(String[]args)throws DocumentException,IOException{// 创建文件Document document=newDocument()// 建立一个书写器PdfWriter writer=PdfWriter.getInstance(document,newFileOutputStream("C:/Users/H__D/Desktop/test8.pdf"))//用户密码String userPassword="123456"//拥有者密码String ownerPassword="hd"writer.setEncryption(userPassword.getBytes(),ownerPassword.getBytes(),PdfWriter.ALLOW_PRINTING,PdfWriter.ENCRYPTION_AES_128)// 打开文件document.open()//添加内容document.add(newParagraph("password !!!!"))// 关闭文档document.close()// 关闭书写器writer.close()}

打开图片

851491-20161209165247147-746087588.png

给PDF文件设置权限

publicstaticvoidmain(String[]args)throws DocumentException,IOException{// 创建文件Document document=newDocument()// 建立一个书写器PdfWriter writer=PdfWriter.getInstance(document,newFileOutputStream("C:/Users/H__D/Desktop/test9.pdf"))// 只读权限writer.setEncryption("".getBytes(),"".getBytes(),PdfWriter.ALLOW_PRINTING,PdfWriter.ENCRYPTION_AES_128)// 打开文件document.open()// 添加内容document.add(newParagraph("password !!!!"))// 关闭文档document.close()// 关闭书写器writer.close()}

读取/修改已有的PDF文件

publicstaticvoidmain(String[]args)throwsDocumentException,IOException{//读取pdf文件PdfReaderpdfReader=newPdfReader("C:/Users/H__D/Desktop/test1.pdf")//修改器PdfStamperpdfStamper=newPdfStamper(pdfReader,newFileOutputStream("C:/Users/H__D/Desktop/test10.pdf"))Imageimage=Image.getInstance("C:/Users/H__D/Desktop/IMG_0109.JPG")image.scaleAbsolute(50,50)image.setAbsolutePosition(0,700)for(inti=1i<=pdfReader.getNumberOfPages()i++){PdfContentBytecontent=pdfStamper.getUnderContent(i)content.addImage(image)}pdfStamper.close()}

itext  生成 PDF(二)

链接:https://www.jianshu.com/p/20d4905383b4

 首先从iText的官网下载这个开源的小组件。

iText官方网站

Java版iText组件

Java版工具包

C#版iText组件

C#版工具包

这里笔者使用的是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文档。

复制代码

1 // 1.创建 Document 对象

2 Document _document = new Document()

3 // 2.创建书写器,通过书写器将文档写入磁盘

4 PdfWriter _pdfWriter = PdfWriter.getInstance(_document, new FileOutputStream("生成文件的路径"))

5 // 3.打开文档

6 _document.open()

7 // 4.向文档中添加内容

8 _document.add(new Paragraph("Hi"))

9 // 5.关闭文档

10 _document.close()

复制代码

OK,搞定,不出问题的话就会在你指定的路径中生成一个PDF文档,内容是纯文本的“Hi”。

可是这样并不能完全满足我们的需求,因为通常我们要生成的PDF文件不一定是纯文本格式的,比如我现在要实现打印销售单的功能,那么最起码需要绘制表格才行,怎么办呢?且跟笔者继续向下研究。

在iText中,有专门的表格类,即PdfPTable类。笔者做了一个简单的表格示例,请先看代码:

复制代码

1 OutTradeList _otl = this.getOtlBiz().findOutTradeListById(this.getOtlid())

2 String _fileName = _otl.getOtlId() + ".pdf"

3

4 // iText 处理中文

5 BaseFont _baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", true)

6 // 1.创建 Document 对象

7 Document _document = new Document(PageSize.A4)

8

9 HttpServletResponse response = ServletActionContext.getResponse()

10 response.setContentType("application/pdfcharset=ISO-8859-1")

11 response.setHeader("Content-Disposition", "inlinefilename=" + new String(_fileName.getBytes(), "iso8859-1"))

12

13 // 2.创建书写器,通过书写器将文档写入磁盘

14 PdfWriter _pdfWriter = null

15 try {

16 _pdfWriter = PdfWriter.getInstance(_document, response.getOutputStream())

17 } catch (Exception e) {

18 this.setMessage("单据生成失败,请检查服务器目录权限配置是否正确")

19 e.printStackTrace()

20 System.out.println("2.挂了")

21 // return INPUT

22 return null

23 }

24 if(_pdfWriter == null) {

25 this.setMessage("单据生成失败,请检查服务器目录权限配置是否正确")

26 System.out.println("3.挂了")

27 // return INPUT

28 return null

29 }

30

31 // 3.打开文档

32 _document.open()

33

34 // 4.创建需要填入文档的元素

35 PdfPTable _table = new PdfPTable(4)

36 PdfPCell _cell = null

37

38 _table.addCell(new Paragraph("单据号", new Font(_baseFont)))

39 _cell = new PdfPCell(new Paragraph(_otl.getOtlId()))

40 _cell.setColspan(3)

41 _table.addCell(_cell)

42

43 _table.addCell(new Paragraph("客户名称", new Font(_baseFont)))

44 _cell = new PdfPCell(new Paragraph(_otl.getClients().getName(), new Font(_baseFont)))

45 _cell.setColspan(3)

46 _table.addCell(_cell)

47

48 _table.addCell(new Paragraph("销售日期", new Font(_baseFont)))

49 _cell = new PdfPCell(new Paragraph(_otl.getOutDate().toString()))

50 _cell.setColspan(3)

51 _table.addCell(_cell)

52

53 _cell = new PdfPCell()

54 _cell.setColspan(4)

55 PdfPTable _tabGoods = new PdfPTable(7)

56 // 添加标题行

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 = 0i <_outTrades.length) {

68 if((_outTrades[i] != null) &&(_outTrades[i] instanceof OutTrade)) {

69OutTrade _ot = (OutTrade) _outTrades[i]

70Goods _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())))

78 }

79 }

80 _cell.addElement(_tabGoods)

81 _table.addCell(_cell)

82

83 _table.addCell(new Paragraph("总计", new Font(_baseFont)))

84 _cell = new PdfPCell(new Paragraph(_otl.getAllPrice().toString()))

85 _cell.setColspan(3)

86 _table.addCell(_cell)

87

88 _table.addCell(new Paragraph(" *** 作员", new Font(_baseFont)))

89 _cell = new PdfPCell(new Paragraph(_otl.getProcure()))

90 _cell.setColspan(3)

91 _table.addCell(_cell)

92

93 // 5.向文档中添加内容,将表格加入文档中

94 _document.add(_table)

95

96 // 6.关闭文档

97 _document.close()

98 System.out.println(_fileName)

99 this.setPdfFilePath(_fileName)

100 System.out.println("3.搞定")

101 // return SUCCESS

102 return null

复制代码

以上代码是写在 Struts2 的 Action 中的,当用户发送了请求之后直接将生成的PDF文件用输出流写入到客户端,浏览器收到服务器的响应之后就会询问用户打开方式。

当然,我们也可以将文件写入磁盘等等。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11795497.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存