java读取生成PDF,iText操作PDF
2014-01-20 15:36
417 查看
package com.lbl.itext; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.junit.Test; import com.itextpdf.text.Anchor; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chapter; import com.itextpdf.text.Chunk; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.FontFactory; import com.itextpdf.text.List; import com.itextpdf.text.ListItem; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.Rectangle; import com.itextpdf.text.Section; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfWriter; /** * iText是一个PDF的类库 * <p> * iText是提供了一组API,允许开发人员做一下的事情:(不仅仅局限以下、还有更多可以做的): * <p> * <ui> * <li>从xml或者数据库生成文档或者报表 * <li>制作绘图和书籍,开拓很多PDF中的交互特性 * <li>在现有的PDF中增加书签,页码,水印,和其他特性 * <li>切分或者整合存在的PDF文件 * <li>填写互动表格 * <li>在WEB浏览器中提供动态生成和操作PDF的服务 * </ui> * * @author liubenlong * */ public class ITextTest{ @Test public void myFirstPdf(){ //新建一个文档 Document document = new Document(); try { //建立一个书写器(Writer)与document对象关联 PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); //打开一个文档 document.open(); //向文档中添加一段文字:hello world! document.add(new Paragraph("hello world!")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ document.close(); } } /** * 给文档设置背景颜色、边框、外边距 */ @Test public void myFirstPdfWithSimpleStyle(){ //定义一个A4大小的矩形组件(Rectangle:矩形) Rectangle rect = new Rectangle(PageSize.A4); //设置背景色为浅灰色 rect.setBackgroundColor(BaseColor.LIGHT_GRAY); //设置border类型为box(四周都有) rect.setBorder(Rectangle.BOX); //设置border颜色为深灰色 rect.setBorderColor(BaseColor.RED); //设置border宽度为5 rect.setBorderWidth(5); //创建一个文档,将rect作为预设的样式传入,后面的10,10,10,10是文档的外边距 Document document = new Document(rect,10,10,10,10); try { PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); document.open(); document.add(new Paragraph("hello world!")); //如果你希望一些块有下划线或删除线 Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE)); chunk1.setBackground(new BaseColor(0xFF, 0xFF, 0x00)); document.add(new Paragraph(chunk1)); Chunk chunk2 = new Chunk("This font is of type ITALIC | STRIKETHRU", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.ITALIC | Font.STRIKETHRU)); document.add(new Paragraph(chunk2)); Paragraph p1 = new Paragraph(new Chunk("This is my first paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12)));//块 Paragraph p2 = new Paragraph(new Phrase("This is my second paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12)));//短句 Paragraph p3 = new Paragraph("This is my third paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12));//段落 document.add(p1); document.add(p2); document.add(p3); Anchor anchor = new Anchor("baidu", FontFactory.getFont(FontFactory.HELVETICA, 12f, Font.UNDERLINE, new BaseColor(0, 0, 255))); anchor.setReference("http://www.baidu.com"); document.add(anchor); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ document.close(); } } /** * 设置阅读器的参数 * <p> * <b>设置阅读器参数的一些静态变量含义</b> * <table width="500" border="1"> * <tr> * <td>类型</td> * <td>静态变量名</td> * <td>作用</td> * </tr> * <tr> * <td rowspan="4">页面布局</td> * <td>PdfWriter.PageLayoutSinglePage</td> * <td>同时只显示一个页面</td> * </tr> * <tr> * <td>PdfWriter.PageLayoutOneColumn </td> * <td>单列显示</td> * </tr> * <tr> * <td>PdfWriter.PageLayoutTwoColumnLeft</td> * <td>双列显示,奇数页在左</td> * </tr> * <tr> * <td>PdfWriter.PageLayoutTwoColumnRight</td> * <td>同时只显示一个页面</td> * </tr> * <tr> * <td rowspan="9">页面模式</td> * <td>PdfWriter.PageModeUseNone</td> * <td>既不显示大钢也不显示缩略图</td> * </tr> * <tr> * <td>PdfWriter.PageModeUseOutlines </td> * <td>显示大纲</td> * </tr> <tr> <td>PdfWriter.PageModeUseThumbs</td> <td>显示缩略图</td> </tr> <tr> <td>PdfWriter.PageModeFullScreen </td> <td>全屏模式,没有菜单、windows控件或者其他任何windows可见控件</td> </tr> <tr> <td>PdfWriter.HideToolbar</td> <td>当文档激活时,是否隐藏阅读程序(如Adobe Reader)的工具条</td> </tr> <tr> <td>PdfWriter.HideMenubar</td> <td>当文档激活时,是否隐藏阅读程序的菜单</td> </tr> <tr> <td>PdfWriter.HideWindowUI </td> <td>当文档激活时,是否隐藏阅读程序的界面元素,如滚动条、导航条等,而仅仅保留文档显示</td> </tr> <tr> <td>PdfWriter.FitWindow </td> <td>是否调整文档窗口尺寸以适合显示第一页</td> </tr> <tr> <td>PdfWriter.CenterWindow</td> <td>是否将文档窗口放到屏幕中央</td> </tr> <tr> <td rowspan="3">全屏模式下页面布局</td> <td>PdfWriter.NonFullScreenPageModeUseNone</td> <td>既不显示大钢也不显示缩略图</td> </tr> <tr> <td>PdfWriter.NonFullScreenPageModeUseOutlines</td> <td>显示大钢</td> </tr> <tr> <td>PdfWriter.NonFullScreenPageModeUseThumbs</td> <td>显示缩略图</td> </tr> </table> */ @Test public void myFirstPdfWithParam(){ Document document = new Document(); try { PdfWriter pdf = PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); /** * PdfWriter.PageModeUseThumbs:显示缩略图 * PdfWriter.PageLayoutTwoColumnLeft:双列显示,奇数页在左 * PdfWriter.HideMenubar:隐藏阅读程序的菜单 */ pdf.setViewerPreferences(PdfWriter.PageModeUseThumbs|PdfWriter.PageLayoutTwoColumnLeft|PdfWriter.HideMenubar); document.open(); for (int i = 0; i < 50; i++) { document.add(new Paragraph("hello world!")); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ document.close(); } } /** * 设置文档密码权限 * 注意:这里需要添加包:bcprov-jdk15on-147.jar否则会报下面这个错误 * java.lang.ClassNotFoundException: org.bouncycastle.asn1.ASN1Primitive * * 但是bcprov-jdk16-1.44不行,原因待查 * <p> * <b>设置文档权限相关静态变量含义</b> * <p> * 下列表列出了文档许可参数设置的含义,不过要注意,如果你用40bit进行加密,那么标注为128bit的会自动的被禁止,如果你想要取消这些许可,你必须用128bit进行加密,显而易见,用128bit进行加密提供了更高的安全级别。 * <table width="500" border="1"> * <tr> * <td>静态变量名</td> * <td>作用</td> * <td>标注</td> * </tr> * <tr> * <td>PdfWriter. ALLOW_ASSEMBLY</td> * <td>插入、删除、旋转页面、加入书签的允许。内容不能被改变、除非PdfWriter. ALLOW_MODIFY_CONTENTS设置了许可</td> * <td>128bit</td> * </tr> * <tr> * <td>PdfWriter. ALLOW_COPY</td> * <td>拷贝或者提取文本或者图像的许可</td> * <td></td> * </tr> * <tr> * <td>PdfWriter. ALLOW_DEGRADED_PRINTING</td> * <td>Printing the document, but not with the quality offered by PdfWriter.Allow-Printing.</td> * <td>128bit</td> * </tr> * <tr> * <td>PdfWriter. ALLOW_FILL_IN</td> * <td>填充表单域许可</td> * <td>128bit</td> * </tr> * <tr> * <td>PdfWriter. ALLOW_MODIFY_ANNOTATIONS</td> * <td>填写注释许可</td> * <td></td> * </tr> * <tr> * <td>PdfWriter. ALLOW_MODIFY_CONTENTS</td> * <td>修改内容许可,比如改变页面内容、或者插入删除页面</td> * <td></td> * </tr> * <tr> * <td>PdfWriter. ALLOW_PRINTING</td> * <td>允许打印文档</td> * <td></td> * </tr> * <tr> * <td>PdfWriter. ALLOW_SCREENREADERS</td> * <td>Extracting text and graphics for use by accessibility devices.</td> * <td>128bit</td> * </tr> * </table> * <p> * 如果你想取消拷贝或者保存PDF文件的许可,这样是很难做到的,你不能使abode reader的Save(Save as)命令取消,这不是iText的bug,而是PDF本身带来的安全问题,如果你真想这么做的话,你必须利用digital rights management(数字版权加密保护技术)作为解决方案,有许多这样的技术提供者,但是这些工具是相当昂贵的 */ @Test public void myFirstPdfWithPassword(){ Document document = new Document(); try { PdfWriter pdf = PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); /** * 第一个参数是设置userPassword为123 * 第二个参数是设置ownerPassword为1234 * 第三个参数设置user的权限可以复制、可以打印 * 第四个参数设置加密类型 */ pdf.setEncryption( new byte[]{'1','2','3'}, new byte[]{'1','2','3','4'}, PdfWriter.ALLOW_COPY|PdfWriter.ALLOW_PRINTING , PdfWriter.STANDARD_ENCRYPTION_40); document.open(); document.add(new Paragraph("hello world!")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ if(document.isOpen())document.close(); } } /** * 中文PDF * 由于itext默认是不支持亚洲文字的,如果要想使用中文,则必须在应用中应用亚洲语言包(itext-asian.jar) */ @Test public void myFirstPdfWithChinese(){ Document document = new Document(); try { PdfWriter.getInstance(document,new FileOutputStream("D:\\helloworld.pdf")); BaseFont base = null; Font fontChinese = null; try { //创建一个简体中文的基本字体、UniGB-UCS2-H为简体中文 base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.EMBEDDED); fontChinese = new Font(base, 12, Font.NORMAL); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } document.open(); //设置文档中文字为简体中文 document.add(new Paragraph("大家好!",fontChinese)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); }finally{ System.out.println(document.isOpen()); document.close(); } } public static void main(String[] args) { try { /** *//** * 首先,创建一个document。 * document是PDF文档中所有元素的容器。 * 第一个参数表示页的大小,其后的参数分别表示左、右、上、下的边距。 */ Document document = new Document(PageSize.A4, 50, 50, 50, 50); /** *//** * 此处创建的write定义了上面创建的document的类型。 * 除了PdfWriter以为,还有HtmlWriter, RtfWriter, XmlWriter和一些别的类型。 * 第一个参数引用document对象,第二个参数指定了输出文件的绝对路径。 * 接着,我们open这个document往里边写入数据。 */ PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("c:/ITextTest.pdf")); writer.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar); // 隐藏菜单栏和工具栏 document.open(); /** *//** * 现在,我们往document的第一页中加入一些文本内容。 * 所有的文本都要使用com.lowagie.text.Paragraph才能添加。 * 可以创建一个默认的paragraph,使用默认的字体,颜色,尺寸等属性,也可使使用自己定义的字体。 * 下面分别进行了这两种操作。 */ document.add(new Paragraph("First page of the document.")); document.add(new Paragraph( "Some more text on the first page with different color and font type.", FontFactory.getFont(FontFactory.COURIER, 14f,Font.BOLD, new BaseColor(255, 150, 200)))); /** *//** * 接下来,我们往document中添加一些复杂的元素。 * 让我们从创建一个新的chapter开始。 * chapter是一个特殊的部分,它将从新的一页开始,默认显示数字序号。 */ Paragraph title1 = new Paragraph( "Chapter 1", FontFactory.getFont(FontFactory.HELVETICA, 18f, Font.BOLDITALIC, new BaseColor(0, 0,255))); Chapter chapter1 = new Chapter(title1, 1); chapter1.setNumberDepth(0); /** *//** * Section是chapter的一个子元素。 * 在下面的代码中我们创建了一个题为"This is Section 1 in Chapter 1" 的Section。 * 为了在Section下添加文本,我们再创建一个Paragraph对象,将其增加到Section对象中。 */ Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1", FontFactory.getFont(FontFactory.HELVETICA, 16f, Font.BOLD, new BaseColor(255, 0, 0))); Section section1 = chapter1.addSection(title11); Paragraph someSectionText = new Paragraph( "This text comes as part of section 1 of chapter 1."); section1.add(someSectionText); someSectionText = new Paragraph("Following is a 3 X 2 table."); section1.add(someSectionText); // /** *//** // * 接着,再创建一个表格(table)对象。 // * 表格中含有一个行和列的矩阵。 // * 一行中的单元格(cell)可以延伸到多列。 // * 同样的,一列中的单元格可以延伸到多行。 // * 因此,一个3x2的表格不需要6个单元格。 // */ // Table t = new Table(3, 2); // //设置边框颜色。如果颜色和背景色一样,则边框不会显示出来 // t.setBorderColor(Color.white); // //设置单元格内文本的间距 // t.setPadding(5); // //设置相邻单元格的间距 // t.setSpacing(5); // t.setBorderWidth(1); // // /** *//** // * 然后,创建3个单元格对象,包含不同的内容。 // * 依次将其放入表格中。 // * 先放在第一行第一列,再放在同一行的下一列中,…… // * 当一行填满之后,下一个单元格将放在下一行的第一列中。 // * 只给定单元格的内容(不新建单元格)也可以新增一个单元格,比如t.addCell("1.1");。 // * 最后,将表格添加到Section对象中。 // */ // Cell c1 = new Cell("Header1"); // //设置单元格边框颜色,设置方法和表格边框一样 // c1.setBorderColor(Color.WHITE); // t.addCell(c1); // c1 = new Cell("Header2"); // t.addCell(c1); // c1 = new Cell("Header3"); // t.addCell(c1); // t.addCell("1.1"); // t.addCell("1.2"); // t.addCell("1.3"); // section1.add(t); /** *//** * 接下来,往PDF文档中添加一个列表(List)。 * 一个列表包含许多列表项(ListItem)。 * 列表可以编号也可以不编号。 * 将List的第一个参数置true表示创建的是一个编号的列表; * 第二个参数表示是否使用字母编号,true为使用字母,false为使用数字 * 第三个参数为缩进值。 */ List l = new List(true, false, 10); l.add(new ListItem("First item of list")); l.add(new ListItem("Second item of list")); section1.add(l); /** *//** * 将chapter放入document中。 * 关闭document。 */ document.add(chapter1); document.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } }
需要导入的包:
相关文章推荐
- 【Java】使用iText生成PDF文件
- java生成PDF文件(itext)
- 使用ITEXT与JAVA生成PDF报表
- java 使用itextpdf.jar和itext-asian.jar根据pdf模板填写数据后生成一个新的pdf文件
- java使用itext操作pdf
- 读取操作PDF的Java类库
- jfreechart,pdf生成组件iText,jasper report报表组件及POI操作excel等在企业软件开发中常遇到的第三方应用
- 使用ITEXT生成pdf文件,使用POI、jxl对excel文件进行读取
- JAVA读取和操作PDF系列《三》
- Java操作Excel之理解JXL--读取Excel模板动态写入数据并生成Excel
- Java应用iText动态生成PDF文件-温柔一刀
- Java操作PDF之iText超入门
- 关于Java Web 使用 iText 将数据库中的 表 的数据 生成 PDF 格式文件(升級版本)
- Java操作PDF文件(iText)
- java使用IText生成PDF格式文件
- 读取操作PDF的Java类库
- Java使用iText实现对PDF文件的操作
- 使用Java组件itext 生成pdf介绍
- 关于java poi itext生成pdf文件的例子以及方法
- C#操作PDF文档--PDFBox读取pdf文档,O2S.Components.PDFRender4NET生成缩略图