Java 使用iText7生成带页码的PDF文件(同时生成目录,但是不会合并两个PDF)
2017-06-16 17:42
429 查看
一、效果图
1.带页码效果2.目录效果
前言:Java 使用iText7生成带页码的PDF文件,同时生成目录PDF,但限于水平,暂时还在摸索合并两个PDF。不过看了一下,iText好像有生成目录的代码,可以查看我另一篇博客我copy了一份说明QAQ。
点击这里可下载源码
二、实现代码
1.PDFUtil.java(添加标题、锻炼辅助类)package test.hui; import java.io.IOException; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import com.itextpdf.io.font.PdfEncodings; import com.itextpdf.io.image.ImageData; import com.itextpdf.io.image.ImageDataFactory; import com.itextpdf.kernel.events.IEventHandler; import com.itextpdf.kernel.events.PdfDocumentEvent; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.xobject.PdfImageXObject; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.AreaBreak; import com.itextpdf.layout.element.Image; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.property.TextAlignment; /** * * * * * @author Hui * */ public class PDFUtil { public static String DEST2 = "";//文件路径 public static PdfFont sysFont =null; private Map<String, Integer> catalogMap = new LinkedHashMap<String, Integer>();//<标题,页数> public PDFUtil(String url){ try { //sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);//中文设置 sysFont = PdfFontFactory.createFont("c://windows//fonts//simsun.ttc,1",PdfEncodings.IDENTITY_H, false);//中文设置,解决特殊字符错误 DEST2=url; } catch (IOException e) { e.printStackTrace(); } } /** * 创建pdf doc * @return doc * */ public Document createPdfDoc() throws Exception{ PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST2)); Document doc = new Document(pdfDoc);//构建文档对象 //设置页码 TextFooterEventHandler eh= new TextFooterEventHandler(doc); pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE,eh); return doc; } /** * 添加大标题 * @param * * */ public void addTitle(Document doc,String title) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(title).setFont(sysFont).setBold().setFontSize(20).setTextAlignment(TextAlignment.CENTER); doc.add(paragraph); } /** * 添加一级标题 * @param * * */ public void addHeading1(Document doc,String pg) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(pg).setFont(sysFont).setBold().setFontSize(16); doc.add(paragraph); catalogMap.put(pg, doc.getPdfDocument().getNumberOfPages()); } /** * 添加二级标题 * @param * * */ public void addHeading2(Document doc,String pg) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(pg).setFont(sysFont).setBold().setFontSize(14).setFirstLineIndent(14); doc.add(paragraph); catalogMap.put(pg, doc.getPdfDocument().getNumberOfPages()); } /** * 添加三级标题 * @param * * */ public void addHeading3(Document doc,String pg) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(pg).setFont(sysFont).setBold().setFontSize(12); doc.add(paragraph); catalogMap.put(pg, doc.getPdfDocument().getNumberOfPages()); } /** * 添加段落 * @param * */ public void addParagraph(Document doc,String pg) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(pg).setFont(sysFont).setFirstLineIndent(20);//中文字体,首行缩进 doc.add(paragraph); } /** * 添加图片 * @param * */ public void addImg(Document doc,String url) throws Exception{ ImageData imgData=ImageDataFactory.create(url); Image pic=new Image(imgData); doc.add(pic); } public Map<String, Integer> getCatalogMap() { return catalogMap; } public void setCatalogMap(Map<String, Integer> catalogMap) { this.catalogMap = catalogMap; } }
2.TextFooterEventHandler.java(生成页码辅助类)
package test.hui; import java.io.IOException; import com.itextpdf.io.font.FontConstants; import com.itextpdf.kernel.events.Event; import com.itextpdf.kernel.events.IEventHandler; import com.itextpdf.kernel.events.PdfDocumentEvent; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.layout.Document; /** * * * * * @author Hui * * */ public class TextFooterEventHandler implements IEventHandler { protected Document doc; protected int page; public TextFooterEventHandler(Document doc) { this.doc = doc; } @Override public void handleEvent(Event event) { PdfDocumentEvent docEvent = (PdfDocumentEvent) event; PdfCanvas canvas = new PdfCanvas(docEvent.getPage()); Rectangle pageSize = docEvent.getPage().getPageSize(); page++; canvas.beginText(); try { canvas.setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA_OBLIQUE), 15); } catch (IOException e) { e.printStackTrace(); } canvas.moveText((pageSize.getRight() - doc.getRightMargin() + (pageSize.getLeft() + doc.getLeftMargin())) / 2,pageSize.getBottom() + doc.getBottomMargin()) .showText(""+page) .endText() .release(); } }
3.Testp.java
package test.hui; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import com.itextpdf.kernel.events.PdfDocumentEvent; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.layout.Document; public class Testp{ public static String url="G:\\test4.pdf";//这里两个路径应改成你自己的路径 public static String urlOrig="G:\\test1.pdf"; static Map<String, Integer> catalogMap = new HashMap<String, Integer>(); public static void main(String[] args) throws Exception { long old = System.currentTimeMillis(); //生成内容pdf PDFUtil pdfUtil=new PDFUtil(url); Document doc=pdfUtil.createPdfDoc(); PdfDocument pdfDoc=doc.getPdfDocument(); //这里生成页码,引用TextFooterEventHandler的方法 TextFooterEventHandler eh= new TextFooterEventHandler(doc); pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE,eh); pdfUtil.addTitle(doc, "预案"); for(int i=0;i<15;i++){ pdfUtil.addHeading1(doc,i+" 标题"); if(i%2==0){ pdfUtil.addHeading2(doc,i+".1 小标题标题"); } pdfUtil.addParagraph(doc, "内容QAQAQZAAAWQSXFDSFSD内容QAQAQZAAAWQSXFDSFSD内容QAQAQZAAAWQSXFDSFSD内容QAQAQZAAAWQSXFDSFSD内容QAQAQZAAAWQSXFDSFSD"); } pdfDoc.close(); doc.close(); //------------------分割线-------------- //生成目录方法,暂时只能生产目录的pdf,还需努力合并 PDFUtil pdfUtil2=new PDFUtil(urlOrig); Document doc2=pdfUtil2.createPdfDoc(); System.out.println(doc2.getPdfDocument().getCatalog().getPdfObject()); for(Entry<String, Integer> entry:pdfUtil.getCatalogMap().entrySet()){ c650 String title=entry.getKey(); String page=entry.getValue()+""; if(countInString(title, ".")==0){ pdfUtil2.addParagraph(doc2, title+"......."+page); }else if(countInString(title, ".")==1){ pdfUtil2.addParagraph(doc2, title+"......."+page); }else{ } } doc2.close(); long now = System.currentTimeMillis(); System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒\n\n" + "文件保存在:"+url+","+urlOrig); } //用来控制生成目录 public static int countInString(String str1, String str2) { int total = 0; for (String tmp = str1; tmp != null && tmp.length() >= str2.length();){ if(tmp.indexOf(str2) == 0){ total++; tmp = tmp.substring(str2.length()); }else{ tmp = tmp.substring(1); } } return total; } }
相关文章推荐
- 使用hibernate自动生成实体类时同时出现两个.java文件
- java动态生成pdf含表格table和 合并两个pdf文件功能
- Java使用Freemarker和iText生成PDF文件
- java 使用itextpdf.jar和itext-asian.jar根据pdf模板填写数据后生成一个新的pdf文件
- 滴水穿石--Java 生成PDF文件--iText使用之插入图片和中文乱码
- 滴水穿石--Java 生成PDF文件--iText使用之入门
- 【Java】maven工程使用iText生成PDF文件
- 【JAVA】使用Eclipse依赖生成jar包时,避免最外层同时生成资源文件的配置。
- 【Java】使用iText生成PDF文件
- 【Java】使用iText生成PDF文件
- java使用itext合并pdf文件
- 市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加
- java使用IText生成PDF格式文件
- java基于jxl.jar包生成Excel文件到指定目录和服务器下载两种模式的使用方法
- 使用JAVA实现比较两个文件夹下的文件新增和修改情况,并复制到新的目录(实现增量更新项目)
- 使用cmd编译java文件成功生成class,但是不能执行
- 关于Java Web 使用 iText 将数据库中的 表 的数据 生成 PDF 格式文件(升級版本)
- iText7初步使用:生成简单的pdf文件
- Java-pdf模板制作流程-使用pdf 模板生成pdf文件
- Java使用Freemarker和iText生成带有图片的PDF文件