java生成pdf文件
使用模板引擎生成pdf的几种方法
使用模板引擎生成pdf的几种方法
使用模板引擎生成PDF有以下几种方法:
1. 使用Java生成PDF:利用Freemarker模板引擎生成HTML,然后使用iText包进行转换,转换过程需要解决中文显示问题,需要在Freemarker模板文件中设置<body style="font-family:SimSun;">以解决该问题。
2. 使用Spring Boot和FreeMarker:通过在applicationproperties 中配置后缀、设置模板文件路径和覆盖默认属性值,可在SpringBoot 中使用FreeMarker生成Web应用。
3. 使用wkhtmltopdf:这是一种高性能的工具,可以将HTML转换为PDF,可以生成美观且实用的界面。
4. 使用SwingUI和JFreePDF:利用SwingUI生成用户界面,再使用JFreePDF将生成的HTML转换为PDF。
虽然这种方法可以生成PDF,但界面样式难看且不兼容太新的js语言。
5. 使用art-template:这是一种新的高性能JavaScript模板引擎,可以将数据与HTML模板更加友好地结合起来,支持服务器端和浏览器端使用,并使用标准语法进行渲染。
需要注意的是,不同的方法可能适用于不同的需求和场景,具体选择哪一种方法需要根据实际情况进行权衡和评估。
java根据模板生成pdf文件并导出
java根据模板生成pdf文件并导出首先你的制作一个pdf模板:1.先用word做出模板界面2.文件另存为pdf格式文件3.通过Adobe Acrobat pro软件打开刚刚用word转换成的pdf文件(注:如果没有这个软件可以通过我的百度云下载,链接:/s/1pL2klzt)如果无法下载可以联系博主。
4.点击右边的"准备表单"按钮,选择"测试.pdf"选择开始进去到编辑页面,打开后它会自动侦测并命名表单域,右键表单域,点击属性,出现文本域属性对话框(其实无需任何操作,一般情况下不需要修改什么东西,至少我没有修改哦。
如果你想修改fill1等信息,可以进行修改)5.做完上面的工作后,直接"另存为"将pdf存储就可以****************************************************************** ***********以上部分是制作pdf模板操作,上述完成后,就开始通过程序来根据pdf模板生成pdf文件了,上java程序:1.首先需要依赖包:itext的jar包,我是maven项目,所以附上maven依赖[html] view plain copy print?<!--https:///artifact/com.itextpdf/itextpdf--> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency> [html] view plain copy print?<!-- https:///artifact/com.itextpdf/itext-asian --> <span style="white-space:pre;"></span><dependency> <spanstyle="white-space:pre;"> </span><groupId>com.itextpdf</groupId> <span style="white-space:pre;"> </span><artifactId>itext-asian</artifactId> <span style="white-space:pre;"> </span><version>5.2.0</version> <spanstyle="white-space:pre;"></span></dependency> 2.下面就是生成pdf代码了[java] view plain copy print?importjava.io.ByteArrayOutputStream; importjava.io.FileOutputStream; import java.io.IOException; import com.itextpdf.text.Document; importcom.itextpdf.text.DocumentException; importcom.itextpdf.text.pdf.AcroFields; importcom.itextpdf.text.pdf.PdfCopy; importcom.itextpdf.text.pdf.PdfImportedPage; importcom.itextpdf.text.pdf.PdfReader; importcom.itextpdf.text.pdf.PdfStamper; public class Snippet { // 利用模板生成pdf public static void fillTemplate() { // 模板路径String templatePath = "E:/测试3.pdf"; // 生成的新文件路径String newPDFPath = "E:/ceshi.pdf"; PdfReader reader; FileOutputStream out; ByteArrayOutputStream bos; PdfStamper stamper; try { out = new FileOutputStream(newPDFPath);// 输出流reader = new PdfReader(templatePath);// 读取pdf模板bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);AcroFields form = stamper.getAcroFields();String[] str = { "123456789", "TOP__ONE", "男","1991-01-01", "130222111133338888", "河北省保定市" };int i = 0; java.util.Iterator<String> it = form.getFields().keySet().iterator(); while (it.hasNext()) { String name =it.next().toString();System.out.println(name);form.setField(name, str[i++]); }stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为truestamper.close(); Document doc = new Document(); PdfCopy copy = new PdfCopy(doc, out); doc.open(); PdfImportedPage importPage =copy.getImportedPage(new PdfReader(bos.toByteArray()), 1); copy.addPage(importPage);doc.close(); } catch (IOException e){ System.out.println(1); } catch (DocumentException e){ System.out.println(2); }} public static void main(String[] args){ fillTemplate(); } } 3.运行结果如下****************************************************************** ***如果没有模板,就行自己生成pdf文件保存到磁盘:下面的方法可以实现:[java] view plain copy print?public static void test1(){//生成pdf Document document = new Document();try { PdfWriter.getInstance(document, new FileOutputStream("E:/1.pdf"));document.open(); document.add(new Paragraph("hello word"));document.close(); } catch (Exception e){ System.out.println("file create exception"); } } 但是上述方法中包含中文时就会出现问题,所以可以使用下面这行代码实现,所使用的jar包,上面的两个依赖都包含了:[java] view plain copy print?public static voidtest1_1(){ BaseFont bf; Font font = null; try { bf =BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);//创建字体font = new Font(bf,12);//使用字体} catch (Exception e){ e.printStackTrace(); }Document document = new Document(); try{ PdfWriter.getInstance(document, new FileOutputStream("E:/2.pdf"));document.open(); document.add(new Paragraph("hello word 你好世界",font));//引用字体document.close(); } catch (Exception e){ System.out.println("file create exception"); } }****************************************************************** ********************当然,如果你想弄的炫一点,想实现其他字体,可以去网上搜字体文件然后下载下来,放到项目里,我这里是在项目里新建了一个font文件夹,将字体文件放到了里面。
java生成复杂pdf的方法
java生成复杂pdf的方法【实用版3篇】篇1 目录1.Java 生成复杂 PDF 的方法概述2.使用 iText 库生成 PDF3.使用 Apache PDFBox 库生成 PDF4.使用 FOP 生成 PDF5.总结篇1正文一、Java 生成复杂 PDF 的方法概述Java 生成复杂 PDF 的方法主要包括使用 iText 库、Apache PDFBox 库和 FOP 等工具。
这些工具可以让开发者方便地生成包含文本、图片、表格、图表等元素的 PDF 文件。
下面我们将分别介绍这三种方法。
二、使用 iText 库生成 PDFiText 是 Java 中常用的一个 PDF 生成库,它提供了丰富的API,可以满足各种复杂的 PDF 生成需求。
使用 iText 生成 PDF 主要包括以下几个步骤:1.导入 iText 相关库2.创建一个 PDF 文档对象3.添加文本、图片、表格等元素到 PDF 文档4.将 PDF 文档写入文件或输出流以下是一个简单的使用 iText 生成 PDF 的示例:```javaimport com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.PdfWriter;public class ItextExample {public static void main(String[] args) throws DocumentException {Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream("example.pdf"));document.open();document.add(new Paragraph("Hello, World!"));document.close();}}```三、使用 Apache PDFBox 库生成 PDFApache PDFBox 是一个开源的 Java 库,用于处理 PDF 文件。
java中根据模板生成pdf文件
java中根据模板⽣成pdf⽂件本⽂使⽤java引⼊apache提供的pdf操作⼯具⽣成pdf⽂件,主要是根据需求开发了⼀个util类,记录⼀下学习和开发过程。
因为业务需要,对于不同的⽤户要⽣成⼀个不同的pdf⽂件,记录了保险⽤户的疾病信息和结算信息等,根据pdf模板,从数据库中获取⽤户的基本和结算信息,然后⽣成该⽤户的结算⽂件。
根据这个需求,写了⼀个⼯具类,主要功能就是根据模板⽣成pdf⽂件,并保存到服务器指定位置。
pdfBox是apache提供的免费,开源的pdf操作⼯具,这个jar⾥⾯囊括了所有的pdfbox操作⼯具类,导⼊这⼀个就够了,使⽤起来很⽅便。
这⾥使⽤maven引⼊jar包:<!-- https:///artifact/org.apache.pdfbox/pdfbox --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.13</version></dependency>⼯具类有两个必须的元素:pdf模板⽂件和从数据库中抽出的数据。
pdf模板⽂件放在指定的路径,下图为部分pdf模板⽂件:模板⽂件可以有多张,这⾥只截取⼀张当做参考。
⼊参和返回值,如下图:String型的为⽣成的pdf⽂件名(该参数可有可⽆,⽂件名可以在该⽅法内定义,也可以在调⽤该⽅法时调⽤); Map<String,Object> 是从数据库中抽取的⽤户基本和结算信息,取出过程就不过多赘述了;返回值为⽣成pdf⽂件的保存全路径;不多说,直接上代码/*** 根据模板⽣成pdf*@param pdfName ⽂件名* @param data Map(String,Object)* @return ⽂件保存全路径⽂件*/public String createPDF(String pdfName, Map<String, Object> data) {PdfReader reader = null;AcroFields s = null;PdfStamper ps = null;ByteArrayOutputStream bos = null;String realPath = ResourceBundle.getBundle("systemconfig").getString("upLoadFolder") + File.separator + "comfirmationDoc"; String dateFolder = DateFormatUtils.format(new Date(), "yyyyMMdd");String folderPath = realPath + File.separator + dateFolder;//创建上传⽂件⽬录File folder = new File(folderPath);if (!folder.exists()) {folder.mkdirs();}//设置⽂件名String fileName = pdfName + "_" + DateFormatUtils.format(new Date(), "yyyyMMddhhmmss") + ".pdf";String savePath = folderPath + File.separator + fileName;try {String file = this.getClass().getClassLoader().getResource("comfirmTemplate.pdf").getPath();//设置字体String font = this.getClass().getClassLoader().getResource("YaHei.ttf").getPath();reader = new PdfReader(file);bos = new ByteArrayOutputStream();ps = new PdfStamper(reader, bos);s = ps.getAcroFields();//使⽤中⽂字体使⽤ AcroFields填充值的不需要在程序中设置字体,在模板⽂件中设置字体为中⽂字体 Adobe 宋体 std LBaseFont bfChinese = BaseFont.createFont(font, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);//设置编码格式s.addSubstitutionFont(bfChinese);// 遍历data 给pdf表单表格赋值for (String key : data.keySet()) {if (data.get(key) != null) {s.setField(key, data.get(key).toString());}}// 如果为false那么⽣成的PDF⽂件还能编辑,⼀定要设为trueps.setFormFlattening(true);ps.close();FileOutputStream fos = new FileOutputStream(savePath);fos.write(bos.toByteArray());fos.flush();fos.close();return savePath;} catch (IOException | DocumentException e) {logger.error("读取⽂件异常");e.printStackTrace();return "";} finally {try {bos.close();reader.close();} catch (IOException e) {logger.error("关闭流异常");e.printStackTrace();}}}经过实际使⽤,代码能够正常⽣成pdf⽂件,在这⾥就不上图了1.pdf模板⽂件可以看做是key-value的键值对型,key值即为⼊参中的map中的key值,在pdf模板中隐藏,value即是根据key填充的值。
java 生成PDF含图片和中文文件
1,所需包iText.jar iTextAsian.ar(支持中包)2,列子package com.pdf;import java.awt.Color;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import .MalformedURLException;import javax.naming.spi.DirectoryManager;import com.lowagie.text.BadElementException;import com.lowagie.text.Cell;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.Font;import com.lowagie.text.Image;import com.lowagie.text.PageSize;import com.lowagie.text.Paragraph;import com.lowagie.text.Table;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.pdf.PdfWriter;public class WriterPDF3 {public static void main(String[] args){WriterPDF3 pdf = new WriterPDF3();Document document = new Document();try{PdfWriter.getInstance(document,new FileOutputStream("c:\\two2.pdf"));document.open();pdf.findFiles(document,"c:\\aa");//写入中文件BaseFont bf = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); Font fontChine = new Font(bf,12,Font.NORMAL);Paragraph pa = new Paragraph("你好呀....",fontChine);document.add(pa);}catch(Exception e){}finally{document.close();}}/*** 遍历目录中的文件* @param doc* @param dir*/public void findFiles(Document doc,String dir){File fileDir = new File(dir);if(fileDir.exists()){File[] files = fileDir.listFiles();for(int i = 0; i < files.length; i++){File file = files[i];System.out.println("FileName="+dir+"file://%22+file.getname/());this.addImage(doc,dir+"file://%22+file.getname/());}}}/*** 出成图片* @param path* @return*/public Image addImage(Document doc,String path){Image image = null;try {image = Image.getInstance(path);//image.scalePercent(50);image.scaleAbsolute(200, 300);doc.add(image);} catch (Exception e) {e.printStackTrace();}return image;}}。
JAVA动态生成word和pdf
java生成word的几种方案1、Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。
使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。
DLL动态链接库的生成需要windows平台的支持。
2、Apache POI包括一系列的API,它们可以操作基于MicroSoft OLE 2 CompoundDocument Format的各种格式文件,可以通过这些API在Java中读写Excel、Word 等文件。
他的excel处理很强大,对于word还局限于读取,目前只能实现一些简单文件的操作,不能设置样式。
3、Java2word是一个在java程序中调用MS Office Word 文档的组件(类库)。
该组件提供了一组简单的接口,以便java程序调用他的服务操作Word 文档。
这些服务包括:打开文档、新建文档、查找文字、替换文字,插入文字、插入图片、插入表格,在书签处插入文字、插入图片、插入表格等。
填充数据到表格中读取表格数据,1.1版增强的功能:指定文本样式,指定表格样式。
如此,则可动态排版word 文档。
4、iText操作Excel还行。
对于复杂的大量的word也是噩梦。
用法很简单, 但是功能很少, 不能设置打印方向等问题。
5、JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。
6、用XML做就很简单了。
Word从2003开始支持XML格式,大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。
经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。
java生成pdf方案总结1. Jasper Report生成pdf:设计思路是先生成模板,然后得到数据,最后将两者整合得到结果。
电子凭证——Java生成Pdf
电⼦凭证——Java⽣成PdfJava⽣成Pdf技术⽅案,通过Html模板引擎进⾏数据渲染,通过iText⽣成Pdf,通过Jpedal⽣成图⽚。
解决CSS样式兼容问题,中⽂字体问题等。
1.背景在某些业务场景中,需要提供相关的电⼦凭证,⽐如⽹银/⽀付宝中转账的电⼦回单,签约的电⼦合同等。
⽅便⽤户查看,下载,打印。
⽬前常⽤的解决⽅案是,把相关数据信息,⽣成对应的pdf⽂件返回给⽤户。
本⽂源码:2.iTextiText是著名的开放源码的站点sourceforge⼀个项⽬,是⽤于⽣成PDF⽂档的⼀个java类库。
通过iText不仅可以⽣成PDF或rtf的⽂档,⽽且可以将XML、Html⽂件转化为PDF⽂件。
iText 开发⽂档:来个最简单的例⼦:添加依赖:<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency>测试代码:JavaToPdfpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.PdfWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdf {private static final String DEST = "target/HelloWorld.pdf";public static void main(String[] args) throws FileNotFoundException, DocumentException { Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));document.open();document.add(new Paragraph("hello world"));document.close();writer.close();}}运⾏结果:3.iText-中⽂⽀持iText默认是不⽀持中⽂的,因此需要添加对应的中⽂字体,⽐如⿊体simhei.ttf可参考⽂档:测试代码:JavaToPdfCNpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Font;import com.itextpdf.text.FontFactory;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfCN {private static final String DEST = "target/HelloWorld_CN.pdf";private static final String FONT = "simhei.ttf";public static void main(String[] args) throws FileNotFoundException, DocumentException {Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));document.open();Font f1 = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); document.add(new Paragraph("hello world,我是鲁家宁", f1));document.close();writer.close();}}输出结果:4.iText-Html渲染在⼀些⽐较复杂的pdf布局中,我们可以通过html去⽣成pdf可参考⽂档:添加依赖:<dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.11</version></dependency>添加模板:template.html<!DOCTYPE html><html><head><meta charset="UTF-8"/><title>Title</title><style>body{font-family:SimHei;}.red{color: red;}</style></head><body><div>你好,鲁家宁</div></body></html>测试代码:JavaToPdfHtmlpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerFontProvider; import com.itextpdf.tool.xml.XMLWorkerHelper; import com.lujianing.test.util.PathUtil;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.charset.Charset;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfHtml {private static final String DEST = "target/HelloWorld_CN_HTML.pdf";private static final String HTML = PathUtil.getCurrentPath()+"/template.html";private static final String FONT = "simhei.ttf";public static void main(String[] args) throws IOException, DocumentException {// step 1Document document = new Document();// step 2PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));// step 3document.open();// step 4XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontImp.register(FONT);XMLWorkerHelper.getInstance().parseXHtml(writer, document,new FileInputStream(HTML), null, Charset.forName("UTF-8"), fontImp);// step 5document.close();}}输出结果:需要注意:1.html中必须使⽤标准的语法,标签⼀定需要闭合2.html中如果有中⽂,需要在样式中添加对应字体的样式5.iText-Html-Freemarker渲染在实际使⽤中,html内容都是动态渲染的,因此我们需要加⼊模板引擎⽀持,可以使⽤FreeMarker/Velocity,这⾥使⽤FreeMarker举例添加FreeMarke依赖:<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.19</version></dependency>添加模板:template_freemarker.html<!DOCTYPE html><html><head><meta charset="UTF-8"/><title>Title</title><style>body{font-family:SimHei;}.blue{color: blue;}</style></head><body><div>你好,${name}</div></body></html>测试代码:JavaToPdfHtmlFreeMarkerpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerFontProvider;import com.itextpdf.tool.xml.XMLWorkerHelper;import com.lujianing.test.util.PathUtil;import freemarker.template.Configuration;import freemarker.template.Template;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.StringWriter;import java.io.Writer;import java.nio.charset.Charset;import java.util.HashMap;import java.util.Map;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfHtmlFreeMarker {private static final String DEST = "target/HelloWorld_CN_HTML_FREEMARKER.pdf";private static final String HTML = "template_freemarker.html";private static final String FONT = "simhei.ttf";private static Configuration freemarkerCfg = null;static {freemarkerCfg =new Configuration();//freemarker的模板⽬录try {freemarkerCfg.setDirectoryForTemplateLoading(new File(PathUtil.getCurrentPath())); } catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException, DocumentException {Map<String,Object> data = new HashMap();data.put("name","鲁家宁");String content = JavaToPdfHtmlFreeMarker.freeMarkerRender(data,HTML);JavaToPdfHtmlFreeMarker.createPdf(content,DEST);}public static void createPdf(String content,String dest) throws IOException, DocumentException {// step 1Document document = new Document();// step 2PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));// step 3document.open();// step 4XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontImp.register(FONT);XMLWorkerHelper.getInstance().parseXHtml(writer, document,new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"), fontImp);// step 5document.close();}/*** freemarker渲染html*/public static String freeMarkerRender(Map<String, Object> data, String htmlTmp) {Writer out = new StringWriter();try {// 获取模板,并设置编码⽅式Template template = freemarkerCfg.getTemplate(htmlTmp);template.setEncoding("UTF-8");// 合并数据模型与模板template.process(data, out); //将合并后的数据和模板写⼊到流中,这⾥使⽤的字符流out.flush();return out.toString();} catch (Exception e) {e.printStackTrace();} finally {try {out.close();} catch (IOException ex) {ex.printStackTrace();}}return null;}}输出结果:⽬前为⽌,我们已经实现了iText通过Html模板⽣成Pdf的功能,但是实际应⽤中,我们发现iText并不能对⾼级的CSS样式进⾏解析,⽐如CSS中的position属性等,因此我们要引⼊新的组件6.Flying Saucer-CSS⾼级特性⽀持Flying Saucer is a pure-Java library for rendering arbitrary well-formed XML (or XHTML) using CSS 2.1 for layout and formatting, output to Swing panels, PDF, and images.Flying Saucer是基于iText的,⽀持对CSS⾼级特性的解析。
Java生成PDF文件代码实现
生成Pdf文件Java生成PDF说明。
以下介绍了采用SpringBoot和FreeMarker动态的把数据从后台传到前台然后生成Pdf文件。
1.在Maven配置中引入Freemarker和Pdf 相关的依赖。
<!-- 引入Freemarker依赖 --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.26-incubating</version></dependency><!-- 引入Pdf依赖 --><dependency> <groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.12</version></dependency><!-- FreeMarkerConfigurer依赖于Spring中的context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.3.12.RELEASE</version></dependency>2.采用Freemarker编写前台展示界面test.ftl(后缀必须为.ftl)<div class="header"><!-- Freemark采用${}获取元素的值 --><h1>${title}</h1></div><!-- Freemark中集合的遍历 obCzpbzEntity为封装实体属性的对象--><#list obCzpbzEntity as obCzpbz><tr style="height:40px;"><td>${obCzpbz.czsx}</td><td>${obCzpbz.czbz}</td><td><#if obCzpbz.sfyzx == '1'>已执行<#else>未执行</#if></td></tr></#list>3.在Controller中封装返回到前台的数据@RestController public class AppController{<!--注入FreeMarkerConfigurer类-->@Autowiredprivate FreeMarkerConfigurer configurer;@GetMapping("/pdfTest")public void dyzgzp(HttpServletResponse response){List<Object> listVars =new ArrayList<>();Map<String,Object> variables =new HashMap<>();//将需要返回到前台的数据放到Map中variables.put("title","PdfTest");//设置打印纸张的大小A4(210mm 297mm)、A3(297mm 420mm)variables.put("size","420mm 297mm");listVars.add(variables);//test.ftl 前台展示界面的名称PdfUtils.preview(configurer,"test.ftl",listVars,response);}}4.PdfUtils的实现/*** pdf预览** @param configurer freemarker配置* @param templateName freemarker模板名称(带后缀.ftl)* @param listVars 模板参数集* @param response HttpServletResponse*/public static void preview(FreeMarkerConfigurer configurer, String templateName, List<Object> listVars, HttpServletResponse response){ServletOutputStream out;try{out = response.getOutputStream();generateAll(configurer, templateName, out, listVars);out.flush();out.close();}catch(Exception e){LOGGER.error(e.getMessage(),e);}}/*** 核心: 根据freemarker模板生成pdf文档** @param configurer freemarker配置* @param templateName freemarker模板名称* @param out 输出流* @param listVars freemarker模板参数* @throws Exception 模板无法找到、模板语法错误、IO异常*/private static void generateAll(FreeMarkerConfigurer configurer,String templateName, OutputStream out, List<Object> listVars)throws Exception {if(CollectionUtils.isEmpty(listVars)){LOGGER.warn("警告:freemarker模板参数为空!");return;}ITextRenderer renderer =new ITextRenderer();Document doc =generateDoc(configurer, templateName, listVars.get(0));renderer.setDocument(doc, null);//设置字符集(宋体),此处必须与模板中的<body style="font-family: SimSun">一致,区分大小写,不能写成汉字"宋体"ITextFontResolver fontResolver = renderer.getFontResolver();fontResolver.addFont("simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//展现和输出pdfyout();renderer.createPDF(out,false);//根据参数集个数循环调用模板,追加到同一个pdf文档中//(注意:此处从1开始,因为第0是创建pdf,从1往后则向pdf中追加内容)for(int i =1; i < listVars.size(); i++){Document docAppend =generateDoc(configurer,templateName,listVars.get(i)); renderer.setDocument(docAppend, null);yout();renderer.writeNextDocument();//写下一个pdf}renderer.finishPDF();//完成pdf写入}5.前台界面的展示引入pdfjs配置文件(详见附录),在地址栏中请求后台接口(附件)右键点击下载。
java 生成 pdf 带大纲
java 生成 pdf 带大纲生成带有大纲的PDF文件在Java中通常需要使用特定的库,如iText或Apache PDFBox。
这些库提供了创建、编辑和处理PDF文件的API。
以下是使用iText库生成带有大纲(书签)的PDF文件的示例。
首先,确保你已经将iText库添加到你的项目中。
如果你使用Maven,可以在pom.xml文件中添加以下依赖:<dependency><groupId>com.itextpdf </groupId><artifactId>itext7-core </artifactId><version>7.x.x </version> <!-- 使用最新的版本号 --></dependency>然后,你可以使用以下代码来生成一个带有大纲的PDF文件:import com.itextpdf.kernel.pdf.*;import yout.*;import yout.element.Paragraph;import yout.property.TextAlignment; import java.io.FileOutputStream;import java.io.IOException;public class PdfWithOutlineExample {public static final String DEST = "./output.pdf"; public static void main (String[] args) throws Exception {new PdfWithOutlineExamplecreatePdf(DEST);}public void createPdf (String dest) throws IOException {PdfWriter writer = new PdfWriter( newFileOutputStream(dest));PdfDocument pdfDoc = new PdfDocument(writer); Document doc = new Document(pdfDoc);// 添加内容Paragraph p1 = new Paragraph( "第一章引言").setTextAlignment(TextAlignment.CENTER);doc.add(p1);Paragraph p2 = new Paragraph( "这是引言的内容...");; doc.add(p2);// 添加大纲(书签)PdfOutline root = pdfDoc.getOutlines( false); PdfOutline outline1 = root.addOutline( "引言");outline1.addDestination(PdfExplicitDestination.createFi t(pdfDoc.getPage( 1)));// 关闭文档doc.close}}上面的代码创建了一个简单的PDF文件,并在其中添加了一个大纲项(书签)。
结合java与latex 自动生成 pdf文档的方法
结合java与latex 自动生成 pdf文档的方法
1.使用 Java 语言和 iText 库来创建 PDF 文档:iText 库允许你
利用 Java 编程,将文档转换为 PDF 格式。
你可以在 Java 中编写任意文本,字体,表格,图像,彩色等内容,以便生成
PDF 文档。
2.使用 LaTeX 作为一种标记语言创建 PDF 文档:LaTeX 是一
种基于文本的格式化语言,可以用来创建专业级的文档,并以PDF格式进行存储和传输。
它允许用户插入键入方面的内容,如数学公式,图像,代码片段等,可以将结果以PDF格式进
行存储和传输。
3.使用 Apache FOP 来生成 PDF 文档:Apache FOP (Formatting Objects Processor) 是一个开源工具,旨在将 XSL-FO 文档转换
为 PDF,RTF,txt等格式。
XSL-FO 顾名思义是XML样式表格式,该语言支持处理XML数据,然后将其转换为PDF格式文档。
Java生成pdf文件或jpg图片的案例讲解
Java⽣成pdf⽂件或jpg图⽚的案例讲解在⼀些业务场景中,需要⽣成pdf⽂件或者jpg图⽚,有时候还需要带上⽔印。
我们可以事先⽤freemarker定义好html模板,然后把模板转换成pdf或jpg⽂件。
同时freemarker模板还⽀持变量的定义,在使⽤时可以填充具体的业务数据。
1、Maven导包<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version></parent><dependencies><!-- freemarker --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency><!-- pdf核⼼包 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version></dependency><!-- 适配中⽂字体 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><!-- html转pdf --><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.12</version></dependency><!-- pdf转图⽚ --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.5</version></dependency></dependencies>2、接⼝定义2.1、请求@Datapublic class GeneratePdfReq {/*** ⽣成pdf⽂件的绝对路径*/@NotBlank(message = "⽣成pdf⽂件的绝对路径不能为空")@Pattern(regexp = "^.*(\\.pdf|\\.jpg)$", message = "⽣成的⽂件必须以.pdf或.jpg结尾")private String absolutePath;/*** 使⽤html模板的绝对路径*/@NotBlank(message = "使⽤的模板路径不能为空")private String templateName;/*** 渲染模板的业务数据*/private Object dataModel;/*** ⽔印信息*/private WaterMarkInfo waterMarkInfo;/*** pdf⽂件的宽,默认A4*/private float width = 595;/*** pdf⽂件的⾼,默认A4*/private float height = 842;}2.2、⽔印@Datapublic class WaterMarkInfo {/*** 如果为null设置⽔印时会报错*/private String waterMark = "";/*** ⽔印透明度,值越⼩透明度越⾼*/private float opacity = 0.2F;/*** ⽔印字体,如果乱码设置为本地宋体字体:fonts/simsun.ttc,1*/private String fontName = "STSong-Light";/*** ⽔印编码格式,如果乱码设置为:BaseFont.IDENTITY_H*/private String encoding = "UniGB-UCS2-H";/*** 字体⼤⼩*/private float fontSize = 24;/*** 横坐标在页⾯宽度的百分⽐,左下⾓为原点*/private float x = 50;/*** 纵坐标在页⾯⾼度的百分⽐,左下⾓为原点*/private float y = 40;/*** ⽔印旋转⾓度*/private float rotation = 45;}2.3、响应@Datapublic class GeneratePdfResp {/*** ⽣成pdf的绝对路径*/private String absolutePath;}3、应⽤代码3.1、渲染freemarker模板获取html⽹页@Service("freeMarkerService")@Slf4jpublic class FreeMarkerServiceImpl implements FreeMarkerService {@Autowiredprivate FreeMarkerConfigurer freeMarkerConfigurer;/*** 渲染html后获取整个页⾯内容** @param templatePath 模板路径* @param dataModel 业务数据,⼀般以map形式传⼊* @return*/@Overridepublic String getHtml(String templatePath, Object dataModel) {("开始将模板{}渲染为html,业务数据{}", templatePath, JSONUtil.toJsonPrettyStr(dataModel));Configuration cfg = freeMarkerConfigurer.getConfiguration();cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // freemaker异常时仍旧抛出,统⼀异常处理 cfg.setClassicCompatible(true);// 不需要对null值预处理,否则需要在模板取值时判断是否存在,不然报错StringWriter stringWriter = new StringWriter();try {// 设置模板所在⽬录,绝对路径⽅式,不打进jar包// cfg.setDirectoryForTemplateLoading(new File(templatePath).getParentFile());// Template temp = cfg.getTemplate(new File(templatePath).getName());// 相对路径设置模板所在⽬录,模板打进jar包,默认就是resources⽬录下的/templates⽬录。
润乾java生成pdf参数
润乾java生成pdf参数
润乾Java是一种基于Java语言的开源报表工具,用于生成各种报表,包括PDF报表。
要生成PDF报表,您需要使用润乾Java的PDF 插件。
以下是使用润乾Java生成PDF报表时的一些常见参数:
1. 报表文件路径:指定要生成的报表的路径和文件名。
2. 输出路径:指定生成的PDF报表的输出路径和文件名。
3. 页面大小:指定PDF报表的页面大小,例如A4、A3等。
4. 边距:指定PDF报表的边距,例如上、下、左、右的边距。
5. 打印方向:指定PDF报表的打印方向,例如纵向或横向。
6. 分页设置:指定PDF报表的分页方式,例如自动分页或固定分页。
7. 打印范围:指定PDF报表的打印范围,例如单页或多页。
8. 样式设置:指定PDF报表的样式设置,例如字体、颜色、背景等。
9. 数据源:指定生成PDF报表所需的数据源,例如数据库、Excel 文件等。
10. 脚本设置:指定生成PDF报表所需的脚本设置,例如条件判断、循环等。
这些参数可以根据您的需求进行设置和调整,以满足您的具体要求。
java根据模板生成PDF文件
java根据模板⽣成PDF⽂件1,⾸先下载,安装 Adobe Acrobat DC 步骤⽅法:https:///article/c14654138d7a9c0bfcfc4ce9.html2,新建⼀个Word模板,转成PDF格式3,通过 Adobe Acrobat DC⼯具打开保存好的PDF⽂件4,点击右边准备表单*** (模板中的fell_*,这些变量需要删除重新写⼀遍,不然数据存不进去)4.准备好模板以后开始写Java代码 ⾸先导⼊所需jar包5.具体代码实现 1,模板 private static final String TEMPLATE_PATH="/template/XXX.pdf"; 2.读取模板位置 //Award award=数据对象; //===award==为要导出的对象数据 PdfReader reader=new PdfReader(TEMPLATE_PATH); ByteArrayOutputStream bos=new ByteArrayOutPutStream(); PdfStamper ps=new PdfStamper(reader,bos); AcroFields s=ps.getAcroFields(); //=====解决中⽂不显⽰的问题,注意需要引⼊itext-asian.jar包 BaseFont bf=BaseFont.createFont("STSong-Lignt","UniGB-USC2-H",BaseFont.Not_EMBEDDEL); //====填充PDF //姓名 s.setFieldProperty("fill_1","testfont",bf,null); if(award,getName()!=null){ s.setField("fill_1",award.getName()); } //性别 s.setFieldProperty("fill_2","testfont",bf,null); if(award.getSex()!=null){ if(award.getSex()==0){ s.setField("fill_2","男"); }else if(award.getSex()==1){ s.setField("fill_2:,"⼥"); } } //⾝份证号 s.setFieldProperty("fill_3","testfont",bf,null); if(award.getNumberID() != null) { s.setField("fill_3",award.getNumberID()); } //模板中的图⽚的位置--图⽚ AcroFields from=ps.getAcroFields(); String imgpath=declaration.getFilePath(); int pageNo=from.getFieldPositions("Text1").get(0).page; Rectangle signRect=from.getFieldPosition("Text1").get(0).position; float x=signRect.getLeft(); float y=signRect.getBottom(); //根据路径读取图⽚ Image image=Image.getInstance(imgpath); //获取图⽚页⾯ PdfContentByte under=ps.getOverContent(pageNo); //图⽚⼤⼩⾃适应 image.scaleToFit(signRect.getWidth(),signRect.getHeight()); //添加图⽚ image.setAbsolutePostion(x,y); unser.addImage(image); ps.setFormFlattening(true); ps.close(); //收尾--重新⽣成PDF File file=new File(Contants.ROOT_PATH+Contants.BASE_PATH+declaration.getDocumentPath(); if(!file.exists()) { file.mkdirs(); } String path=Contants.ROOT_PATH+Contants.BASE_PATH+ declaration.getDocumentPath()+File.separatorChar+declaaaration.getName()+".pdf"; FileOutputStream fos=new FileOutputStream(path); fos.write(bos.toByteArray()); fos.flush(); fos.close(); return path; 修改字体⼤⼩⽅式 打开Adobe acrobat pro dc ,双击表单字段。
java生成复杂pdf的方法
java生成复杂pdf的方法摘要:1.Java 生成复杂PDF 的方法1.1.Java 的优势1.2.生成复杂PDF 的方法1.2.1.使用iText 库1.2.2.使用Apache PDFBox 库1.2.3.使用Java 内置的PDF 支持1.3.选择合适的库1.4.总结正文:Java 作为一种广泛应用的编程语言,具有跨平台、可移植性强等优势。
在生成复杂PDF 方面,Java 同样具有很好的表现。
本文将介绍几种Java 生成复杂PDF 的方法。
首先,Java 的优势在于其跨平台性,这意味着在编写代码时,可以忽略底层操作系统和硬件的差异,从而更专注于业务逻辑。
此外,Java 有着丰富的开源库,可以帮助开发者轻松实现各种功能。
在生成复杂PDF 方面,Java 有多种方法可供选择。
其中,使用iText 库、Apache PDFBox 库以及Java 内置的PDF 支持是最常见的几种方式。
iText 库是一个功能强大的Java PDF 库,可以轻松地创建、编辑和处理PDF 文件。
它提供了丰富的API,支持各种PDF 对象的创建和操作。
使用iText 库,可以方便地实现复杂PDF 的生成,例如添加图片、表格、超链接等。
同时,iText 库还支持将PDF 文件转换为其他格式,如HTML、XML 等。
Apache PDFBox 库是另一个常用的Java PDF 库,它提供了一组工具,用于处理PDF 文档。
与iText 库相比,PDFBox 库更注重底层操作,可以实现对PDF 文件的无缝解析。
通过PDFBox 库,可以提取PDF 文件中的文本、图片等元素,并对其进行操作。
这使得Apache PDFBox 库在处理复杂PDF 时具有较高的灵活性。
此外,Java 内置的PDF 支持也是一个值得关注的领域。
随着Java 7 的发布,Java 引入了PDF 支持,使得开发者可以直接在Java 代码中处理PDF 文件。
JavaWeb项目生成PDF文件添加水印图片并导出
JavaWeb项⽬⽣成PDF⽂件添加⽔印图⽚并导出⼀、前⾔⾸先需要在Maven中添加相应的jar包依赖,若项⽬没⽤到Maven,也可⾃⾏下载相应所需的jar包(itextpdf.jar 与 itext-asian.jar),如下图所⽰。
Maven中添加依赖jar包如下所⽰:1<!-- pdf start -->2<dependency>3<groupId>com.itextpdf</groupId>4<artifactId>itextpdf</artifactId>5<version>5.3.2</version>6</dependency>7<dependency>8<groupId>com.itextpdf</groupId>9<artifactId>itext-asian</artifactId>10<version>5.2.0</version>11</dependency>12<!-- pdf end -->⼆、正⽂1、⾸先获取需要填写⾄PDF中的数据,如下述所⽰,realPath为添加图⽚的路径,test.pdf为未添加图⽚的PDF临时⽂件,在Tomcat服务器对应路径下,以及导出的PDF⽂件存⾄桌⾯: 1//点击下载获取企业信息并存⾄Pdf2 @RequestMapping(value="/downloadPdf.do")3 @ResponseBody4public String downloadPdf(@RequestParam(value = "download_corp_id") String download_corp_id, HttpServletRequest request) throws Exception {5 List<TCorp> corpIfs = searchCorpService.getCorpInfo(Integer.parseInt(download_corp_id));6 TCorp tCorp = new TCorp();7for (TCorp corpInfo: corpIfs){8 tCorp.setId(corpInfo.getId());9 tCorp.setRegNo(corpInfo.getRegNo());10 tCorp.setCorpName(corpInfo.getCorpName());11 tCorp.setCorpAddr(corpInfo.getCorpAddr());12 tCorp.setBelongOrg(corpInfo.getBelongOrg());13 tCorp.setBelongDistOrg(corpInfo.getBelongDistOrg());14 tCorp.setBelongTrade(corpInfo.getBelongTrade());15 tCorp.setEconKind(corpInfo.getEconKind());16 tCorp.setAdmitMain(corpInfo.getAdmitMain());17 tCorp.setStartDate(corpInfo.getStartDate());18 tCorp.setCheckDate(corpInfo.getCheckDate());19 tCorp.setOperManIdentNo(corpInfo.getOperManIdentNo());20 tCorp.setOperManName(corpInfo.getOperManName());21 tCorp.setCorpStatus(corpInfo.getCorpStatus());22 tCorp.setRegCapi(corpInfo.getRegCapi());23 tCorp.setPaidCapi(corpInfo.getPaidCapi());24 tCorp.setFareTermStart(corpInfo.getFareTermStart());25 tCorp.setFareTermEnd(corpInfo.getFareTermEnd());26 tCorp.setFareScope(corpInfo.getFareScope());27 tCorp.setUniScid(corpInfo.getUniScid());28 tCorp.setCorpTel(corpInfo.getCorpTel());29 tCorp.setCorpWebUrl(corpInfo.getCorpWebUrl());30 tCorp.setCorpLogo(corpInfo.getCorpLogo());31 tCorp.setCorpEmail(corpInfo.getCorpEmail());32 tCorp.setPracPersonNum(corpInfo.getPracPersonNum());33 tCorp.setOrgInstCode(corpInfo.getOrgInstCode());34 tCorp.setTaxpayNum(corpInfo.getTaxpayNum());35 tCorp.setStaffSize(corpInfo.getStaffSize());36 tCorp.setEnglishName(corpInfo.getEnglishName());37 tCorp.setFormerName(corpInfo.getFormerName());38 tCorp.setCorpInfo(corpInfo.getCorpInfo());39 tCorp.setCreateDate(corpInfo.getCreateDate());40 tCorp.setCreateOrg(corpInfo.getCreateOrg());41 }4243 String realPath = request.getSession().getServletContext().getRealPath("/") + "\\icon\\logo_64.png";44 PDFReport.settCorp(tCorp);45new PDFReport("test.pdf").generatePDF();46 PDFUtil.addImage("test.pdf", "C:\\Users\\Administrator\\Desktop\\"+tCorp.getCorpName()+".pdf",realPath);4748return "提⽰:数据导出成功!";49 }2、PDFReport类中申明⼀个⽂档类型建⽴Document对象,设置页⾯样式等:1package util;23import com.itextpdf.text.Document;4import com.itextpdf.text.PageSize;5import com.itextpdf.text.Rectangle;6import com.itextpdf.text.pdf.PdfPTable;7import com.itextpdf.text.pdf.PdfWriter;8import entity.TCorp;910import java.io.File;11import java.io.FileOutputStream;1213public class PDFReport {14private static TCorp tCorp;1516 Document document = new Document();// 建⽴⼀个Document对象1718public PDFReport(String out) {19try {20 File file = new File(out);21 file.createNewFile();22 Rectangle pageSize = new Rectangle(PageSize.A4);23 document.setPageSize(pageSize);24 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));25 PDFBuilder builder = new PDFBuilder();26 writer.setPageEvent(builder);27 document.open();28 PdfPTable table = generatePDF();29 document.add(table);30 document.close();31 } catch (Exception e) {32 e.printStackTrace();33 }34 }3536public static void settCorp(TCorp tCorp) {37 PDFReport.tCorp = tCorp;38 }394041public PdfPTable generatePDF() {42//设置单元格为5列43 PdfPTable table = PDFUtil.createTable(5);4445 table.addCell(PDFUtil.createHeadCell("企业信息列表"));46 table.addCell(PDFUtil.createTitleCell_1("企业名称"));47 table.addCell(PDFUtil.createCell_1(tCorp.getCorpName()));48 table.addCell(PDFUtil.createTitleCell_1("联系⽅式"));49 table.addCell(PDFUtil.createCell_1(tCorp.getCorpTel()));50 table.addCell(PDFUtil.createCell_2("Logo"));5152 table.addCell(PDFUtil.createTitleCell_1("企业邮箱"));53 table.addCell(PDFUtil.createCell_1(tCorp.getCorpEmail()));54 table.addCell(PDFUtil.createTitleCell_1("⽹址"));55 table.addCell(PDFUtil.createCell_1(tCorp.getCorpWebUrl()));5657 table.addCell(PDFUtil.createTitleCell_1("企业地址"));58 table.addCell(PDFUtil.createCell_1(tCorp.getCorpAddr()));59 table.addCell(PDFUtil.createTitleCell_1("注册/实缴"));60 table.addCell(PDFUtil.createCell_1(String.valueOf(tCorp.getRegCapi())+"万 / "+String.valueOf(tCorp.getPaidCapi())+"万")); 6162 table.addCell(PDFUtil.createTitleCell_1("成⽴⽇期"));63 table.addCell(PDFUtil.createCell_1(tCorp.getStartDate()));64 table.addCell(PDFUtil.createTitleCell_1("统⼀社会信⽤代码"));65 table.addCell(PDFUtil.createCell_3(tCorp.getUniScid()));6667 table.addCell(PDFUtil.createTitleCell_1("法定代表⼈"));68 table.addCell(PDFUtil.createCell_1(tCorp.getOperManName()));69 table.addCell(PDFUtil.createTitleCell_1("纳税⼈识别号"));70 table.addCell(PDFUtil.createCell_3(tCorp.getTaxpayNum()));7172 table.addCell(PDFUtil.createTitleCell_1("注册号"));73 table.addCell(PDFUtil.createCell_1(tCorp.getRegNo()));74 table.addCell(PDFUtil.createTitleCell_1("组织机构代码"));75 table.addCell(PDFUtil.createCell_3(tCorp.getOrgInstCode()));7677 table.addCell(PDFUtil.createTitleCell_1("公司类型"));78 table.addCell(PDFUtil.createCell_1(tCorp.getEconKind()));79 table.addCell(PDFUtil.createTitleCell_1("⼈员规模"));80 table.addCell(PDFUtil.createCell_3(tCorp.getStaffSize()));8182 table.addCell(PDFUtil.createTitleCell_1("营业期限"));83 table.addCell(PDFUtil.createCell_1(tCorp.getFareTermStart()+" ⾄ "+tCorp.getFareTermEnd()));84 table.addCell(PDFUtil.createTitleCell_1("登记机关"));85 table.addCell(PDFUtil.createCell_3(tCorp.getBelongOrg()));8687 table.addCell(PDFUtil.createTitleCell_1("核准⽇期"));88 table.addCell(PDFUtil.createCell_1(tCorp.getCheckDate()));89 table.addCell(PDFUtil.createTitleCell_1("所属⾏业"));90 table.addCell(PDFUtil.createCell_3(tCorp.getBelongTrade()));9192 table.addCell(PDFUtil.createTitleCell_1("英⽂名称"));93 table.addCell(PDFUtil.createCell_1(tCorp.getEnglishName()));94 table.addCell(PDFUtil.createTitleCell_1("曾⽤名"));95 table.addCell(PDFUtil.createCell_3(tCorp.getFormerName()));9697 table.addCell(PDFUtil.createTitleCell_2("经营范围"));98 table.addCell(PDFUtil.createCell_4(tCorp.getFareScope()));99100return table;101 }102 }3、PDFUtil类中设置字体、表格样式、以及⽔印⽂字样式,setColspan函数为设置所跨列数,setRowspan函数为设置所跨⾏数: 1package util;23import com.itextpdf.text.*;4import com.itextpdf.text.pdf.*;56import javax.imageio.ImageIO;7import java.io.BufferedOutputStream;8import java.io.File;9import java.io.FileOutputStream;1011public class PDFUtil {12private static Font headfont ; // 设置字体⼤⼩13private static Font keyfont; // 设置字体⼤⼩14private static Font textfont; // 设置字体⼤⼩1516static{17 BaseFont bfChinese;18try {19 bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);20 headfont = new Font(bfChinese, 24, Font.BOLD,BaseColor.BLACK);// 设置字体⼤⼩21 keyfont = new Font(bfChinese, 12, Font.BOLD,BaseColor.BLACK);// 设置字体⼤⼩22 textfont = new Font(bfChinese, 10, Font.NORMAL,BaseColor.BLACK);// 设置字体⼤⼩23 } catch (Exception e) {24 e.printStackTrace();25 }26 }2728//表格标题29public static PdfPCell createHeadCell(String value){30 PdfPCell cell = new PdfPCell();31 cell.setVerticalAlignment(15);32 cell.setHorizontalAlignment(15);33 cell.setColspan(5);34 cell.setPhrase(new Phrase(value,headfont));35 cell.setHorizontalAlignment(Element.ALIGN_CENTER); //⽔平居中36 cell.setPadding(10.0f);37 cell.setBorder(0);38 cell.setPaddingTop(5.0f);39 cell.setPaddingBottom(18.0f);40return cell;41 }4243//表格表头样式144public static PdfPCell createTitleCell_1(String value){45 PdfPCell cell = new PdfPCell();46 cell.setVerticalAlignment(Element.ALIGN_MIDDLE);47 cell.setHorizontalAlignment(Element.ALIGN_CENTER);48 cell.setPhrase(new Phrase(value, keyfont));49 cell.setBackgroundColor(new BaseColor(29, 181, 238));50 cell.setColspan(1);51 cell.setFixedHeight(35);52return cell;53 }5455//表格表头样式256public static PdfPCell createTitleCell_2(String value){57 PdfPCell cell = new PdfPCell();58 cell.setVerticalAlignment(Element.ALIGN_MIDDLE);59 cell.setHorizontalAlignment(Element.ALIGN_CENTER);60 cell.setPhrase(new Phrase(value, keyfont));61 cell.setBackgroundColor(new BaseColor(29, 181, 238));62 cell.setColspan(1);63 cell.setRowspan(3);64 cell.setFixedHeight(105);65return cell;66 }6768//表格内容样式169public static PdfPCell createCell_1(String value){70 PdfPCell cell = new PdfPCell();71 cell.setVerticalAlignment(Element.ALIGN_MIDDLE);72 cell.setHorizontalAlignment(Element.ALIGN_CENTER);73 cell.setPhrase(new Phrase(value,textfont));74 cell.setBackgroundColor(new BaseColor(255, 255, 255));75 cell.setColspan(1);76 cell.setFixedHeight(35);77return cell;78 }7980//表格内容样式281public static PdfPCell createCell_2(String value){82 PdfPCell cell = new PdfPCell();83 cell.setVerticalAlignment(Element.ALIGN_MIDDLE);84 cell.setHorizontalAlignment(Element.ALIGN_CENTER);85 cell.setPhrase(new Phrase(value,textfont));86 cell.setBackgroundColor(new BaseColor(255, 255, 255));87 cell.setColspan(1);88 cell.setRowspan(3);89 cell.setFixedHeight(105);90return cell;91 }9293//表格内容样式394public static PdfPCell createCell_3(String value){95 PdfPCell cell = new PdfPCell();96 cell.setVerticalAlignment(Element.ALIGN_MIDDLE);97 cell.setHorizontalAlignment(Element.ALIGN_CENTER);98 cell.setPhrase(new Phrase(value,textfont));99 cell.setBackgroundColor(new BaseColor(255, 255, 255));100 cell.setColspan(2);101 cell.setFixedHeight(35);102return cell;103 }104105//表格内容样式4106public static PdfPCell createCell_4(String value){107 PdfPCell cell = new PdfPCell();108 cell.setVerticalAlignment(Element.ALIGN_MIDDLE);109 cell.setHorizontalAlignment(Element.ALIGN_CENTER);110 cell.setPhrase(new Phrase(value,textfont));111 cell.setBackgroundColor(new BaseColor(255, 255, 255));112 cell.setColspan(4);113 cell.setRowspan(3);114 cell.setFixedHeight(105);115return cell;116 }117118//⽣成表格119public static PdfPTable createTable(int colNumber){120int widths[] = { 35,40,35,35,30 };121 PdfPTable baseTable = new PdfPTable(colNumber);122 baseTable.setWidthPercentage(100);123 baseTable.setSpacingBefore(10);124try {125 baseTable.setWidths(widths);126 } catch (DocumentException e) {127 e.printStackTrace();128 }129return baseTable;130 }131132133public static void addImage(String input,String output,String realPath) throws Exception{134 BufferedOutputStream out = new BufferedOutputStream(135new FileOutputStream(new File(output)));136 PdfReader reader = new PdfReader(input);137 PdfStamper stamper = new PdfStamper(reader, out);138 addWatermark(stamper,"测试添加⽔印⽂字");139int total = reader.getNumberOfPages();140try {141 Image image = Image.getInstance(realPath);142 image.setAbsolutePosition(350, 200);143 image.scaleToFit(160, 70);144 PdfContentByte content= stamper.getOverContent(total);// 在内容上⽅加⽔印145 content.addImage(image);146 }catch (Exception e){147 e.printStackTrace();148 }149150 stamper.close();151 reader.close();152 }153154public static void addWatermark(PdfStamper pdfStamper, String waterMarkName) throws Exception { 155 PdfContentByte content;156 BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",157 BaseFont.NOT_EMBEDDED);158 Rectangle pageRect;159 PdfGState gs = new PdfGState();160try {161if (base == null || pdfStamper == null) {162return;163 }164// 设置透明度为0.4165 gs.setFillOpacity(0.3f);166 gs.setStrokeOpacity(0.3f);167int toPage = pdfStamper.getReader().getNumberOfPages();168for (int i = 1; i <= toPage; i++) {169 pageRect = pdfStamper.getReader().getPageSizeWithRotation(i);170// 计算⽔印X,Y坐标171float x = pageRect.getWidth() / 2;172float y = pageRect.getHeight() / 2;173// 获得PDF最顶层174 content = pdfStamper.getOverContent(i);175 content.saveState();176// set Transparency177 content.setGState(gs);178 content.beginText();179 content.setColorFill(BaseColor.GRAY);180 content.setFontAndSize(base, 30);181// ⽔印⽂字成45度⾓倾斜182 content.showTextAligned(Element.ALIGN_CENTER, waterMarkName, x,183 y, 45);184 content.endText();185 }186 } catch (Exception ex) {187 ex.printStackTrace();188 }189 }190 }4、PDFBuilder类中为设置页⾯附加属性:1package util;23import com.itextpdf.text.*;4import com.itextpdf.text.pdf.*;56import java.io.IOException;78public class PDFBuilder extends PdfPageEventHelper {9/**10 * 页眉11*/12public String header = "";1314/**15 * ⽂档字体⼤⼩,页脚页眉最好和⽂本⼤⼩⼀致16*/17public int presentFontSize = 12;181920// 模板21public PdfTemplate total;2223// 基础字体对象24public BaseFont bf = null;2526// 利⽤基础字体⽣成的字体对象,⼀般⽤于⽣成中⽂⽂字27public Font fontDetail = null;2829/**30 *31 * Creates a new instance of PdfReportM1HeaderFooter ⽆参构造⽅法.32 *33*/34public PDFBuilder() {3536 }3738public void setHeader(String header) {39this.header = header;40 }4142/**43 *44 * TODO ⽂档打开时创建模板45 *46 * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter,47 * com.itextpdf.text.Document)48*/49public void onOpenDocument(PdfWriter writer, Document document) {50 total = writer.getDirectContent().createTemplate(50, 50);// 共页的矩形的长宽⾼51 }5253/**54 *55 * TODO 关闭每页的时候,写⼊页眉,写⼊'第⼏页共'这⼏个字。
java根据模板动态生成PDF实例
java根据模板动态⽣成PDF实例⼀、需求说明:根据业务需要,需要在服务器端⽣成可动态配置的PDF⽂档,⽅便数据可视化查看。
⼆、解决⽅案:iText+FreeMarker+JFreeChart⽣成可动态配置的PDF⽂档iText有很强⼤的PDF处理能⼒,但是样式和排版不好控制,直接写PDF⽂档,数据的动态渲染很⿇烦。
FreeMarker能配置动态的html模板,正好解决了样式、动态渲染和排版问题。
JFreeChart有这⽅便的画图API,能画出简单的折线、柱状和饼图,基本能满⾜需要。
三、实现功能:1、能动态配置PDF⽂档内容2、能动态配置中⽂字体显⽰3、设置⾃定义的页眉页脚信息4、能动态⽣成业务图⽚5、完成PDF的分页和图⽚的嵌⼊四、主要代码结构说明:1、component包:PDF⽣成的组件对外提供的是PDFKit⼯具类和HeaderFooterBuilder接⼝,其中PDFKit负责PDF的⽣成,HeaderFooterBuilder负责⾃定义页眉页脚信息。
2、builder包:负责PDF模板之外的额外信息填写,这⾥主要是页眉页脚的定制。
3、chart包:JFreeChart的画图⼯具包,⽬前只有⼀个线形图。
4、test包:测试⼯具类5、util包:FreeMarker等⼯具类。
五、关键代码说明:1、模板配置<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><meta http-equiv="Content-Style-Type" content="text/css"/><title></title><style type="text/css">body {font-family: pingfang sc light;}.center{text-align: center;width: 100%;}</style></head><body><!--第⼀页开始--><div class="page" ><div class="center"><p>${templateName}</p></div><div><p>iText官⽹:${ITEXTUrl}</p></div><div><p>FreeMarker官⽹:${freeMarkerUrl}</p></div><div><p>JFreeChart教程:${JFreeChartUrl}</p></div><div>列表值:</div><div><#list scores as item><div><p>${item}</p></div></#list></div></div><!--第⼀页结束--><!---分页标记--><span style="page-break-after:always;"></span><!--第⼆页开始--><div class="page"><div>第⼆页开始了</div><!--外部链接--><p>百度图标</p><div><img src="${imageUrl}" alt="百度图标" width="270" height="129"/></div><!--动态⽣成的图⽚--><p>⽓温变化对⽐图</p><div><img src="${picUrl}" alt="我的图⽚" width="500" height="270"/></div></div><!--第⼆页结束--></body></html>2、获取模板内容并填充数据/*** @description 获取模板*/public static String getContent(String fileName,Object data){String templatePath=getPDFTemplatePath(fileName);//根据PDF名称查找对应的模板名称String templateFileName=getTemplateName(templatePath);String templateFilePath=getTemplatePath(templatePath);if(StringUtils.isEmpty(templatePath)){throw new FreeMarkerException("templatePath can not be empty!");}try{Configuration config = new Configuration(Configuration.VERSION_2_3_25);//FreeMarker配置config.setDefaultEncoding("UTF-8");config.setDirectoryForTemplateLoading(new File(templateFilePath));//注意这⾥是模板所在⽂件夹,不是⽂件 config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);config.setLogTemplateExceptions(false);Template template = config.getTemplate(templateFileName);//根据模板名称获取对应模板StringWriter writer = new StringWriter();template.process(data, writer);//模板和数据的匹配writer.flush();String html = writer.toString();return html;}catch (Exception ex){throw new FreeMarkerException("FreeMarkerUtil process fail",ex);}}3、导出模板到PDF⽂件/*** @description 导出pdf到⽂件* @param fileName 输出PDF⽂件名* @param data 模板所需要的数据**/public String exportToFile(String fileName,Object data){String htmlData= FreeMarkerUtil.getContent(fileName, data);//获取FreeMarker的模板数据if(StringUtils.isEmpty(saveFilePath)){saveFilePath=getDefaultSavePath(fileName);//设置PDF⽂件输出路径}File file=new File(saveFilePath);if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}FileOutputStream outputStream=null;try{//设置输出路径outputStream=new FileOutputStream(saveFilePath);//设置⽂档⼤⼩Document document = new Document(PageSize.A4);//IText新建PDF⽂档PdfWriter writer = PdfWriter.getInstance(document, outputStream);//设置⽂档和输出流的关系//设置页眉页脚PDFBuilder builder = new PDFBuilder(headerFooterBuilder,data);builder.setPresentFontSize(10);writer.setPageEvent(builder);//输出为PDF⽂件convertToPDF(writer,document,htmlData);}catch(Exception ex){throw new PDFException("PDF export to File fail",ex);}finally{IOUtils.closeQuietly(outputStream);}return saveFilePath;}4、测试⼯具类public String createPDF(Object data, String fileName){//pdf保存路径try {//设置⾃定义PDF页眉页脚⼯具类PDFHeaderFooter headerFooter=new PDFHeaderFooter();PDFKit kit=new PDFKit();kit.setHeaderFooterBuilder(headerFooter);//设置输出路径kit.setSaveFilePath("/Users/fgm/Desktop/pdf/hello.pdf”);//设置出书路径String saveFilePath=kit.exportToFile(fileName,data);return saveFilePath;} catch (Exception e) {log.error("PDF⽣成失败{}", ExceptionUtils.getFullStackTrace(e));return null;}}public static void main(String[] args) {ReportKit360 kit=new ReportKit360();TemplateBO templateBO=new TemplateBO();//配置模板数据templateBO.setTemplateName("Hello iText! Hello freemarker! Hello jFreeChart!");templateBO.setFreeMarkerUrl("/chm/freemarker2_3_24/ref_directive_if.html");templateBO.setITEXTUrl("/examples-itext5");templateBO.setJFreeChartUrl("/jfreechart/jfreechart_referenced_apis.html");templateBO.setImageUrl("https:///5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png"); List<String> scores=new ArrayList<String>();scores.add("90");scores.add("95");scores.add("98");templateBO.setScores(scores);List<Line> lineList=getTemperatureLineList();TemperatureLineChart lineChart=new TemperatureLineChart();String picUrl=lineChart.draw(lineList,0);//⾃定义的数据画图templateBO.setPicUrl(picUrl);String path= kit.createPDF(templateBO,"hello.pdf");System.out.println(path);}六、⽣成效果图:七、项⽬完整代码⼋、遇到的坑:1、FreeMarker配置模板⽂件样式,在实际PDF⽣成过程中,可能会出现⼀些不⼀致的情形,⽬前解决⽅法,就是换种⽅式调整样式。
详解Java生成PDF文档方法
详解Java⽣成PDF⽂档⽅法最近项⽬需要实现PDF下载的功能,由于没有这⽅⾯的经验,从⽹上花了很长时间才找到相关的资料。
整理之后,发现有如下⼏个框架可以实现这个功能。
1. 开源框架⽀持1. iText,⽣成PDF⽂档,还⽀持将XML、Html⽂件转化为PDF⽂件;2. Apache PDFBox,⽣成、合并PDF⽂档;3. docx4j,⽣成docx、pptx、xlsx⽂档,⽀持转换为PDF格式。
⽐较:1. iText开源协议为AGPL,⽽其他两个框架协议均为Apache License v2.0。
2. 使⽤PDFBox⽣成PDF就像画图似的,⽂字和图像根据页⾯坐标画上去的,需要根据字数⼿动换⾏。
3. docx4j⽤来⽣成docx⽂档,提供了将WORD⽂档转换为PDF⽂档的功能,并不能直接⽣成PDF⽂档。
2. 实现⽅案—格式复杂格式简单数据量⼤docx4j+freemarker docx4j或PDFBox数据量⼩docx4j PDFBox2.1 纯数据⽣成PDF1.docx4j,适⽤于⽣成格式简单或格式复杂且数据量⼩的PDF⽂档;2.Apache PDFBox,适⽤于⽣成格式简单且数据量⼩的PDF⽂档。
1.docx4jdocx4j是⼀个开源Java库,⽤于创建和操作Microsoft Open XML(Word docx,Powerpoint pptx和Excel xlsx)⽂件。
它类似于Microsoft的OpenXML SDK,但适⽤于Java。
docx4j使⽤JAXB来创建内存中的对象表⽰,程序员需要花时间了解JAXB和Open XML⽂件结构。
// word对象WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();// ⽂档主体MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();// 换⾏符Br br = objectFactory.createBr();// 段落P p = objectFactory.createP();// 段落设置PPr ppr = objectFactory.createPPr();// ⽂字位置Jc jc = new Jc();jc.setVal(je);ppr.setJc(jc);// ⾏设置RPr rpr = objectFactory.createRPr();// 字体设置RFonts rFonts = objectFactory.createRFonts();rFonts.setAscii("Times New Roman");rFonts.setEastAsia("宋体");rpr.setRFonts(rFonts);// ⾏R r = objectFactory.createR();// ⽂本Text text = objectFactory.createText();text.setValue("这是⼀段普通⽂本");r.setRPr(rpr);r.getContent().add(br);r.getContent().add(text);p.getContent().add(r);p.setPPr(ppr);// 添加到正⽂中mainDocumentPart.addObject(p);// 导出//..2.Apache PDFBox Apache PDFBox是处理PDF⽂档的⼀个开源的Java⼯具。
java生成PDF,并下载到本地
java⽣成PDF,并下载到本地1、⾸先要写⼀个PDF⼯具类,以及相关⼯具2、PDF所需jar包iText是⼀种⽣成PDF报表的Java组件freemarker是基于模板来⽣成⽂本输出<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency>3、需要使⽤Adobe Acrobat pro软件把要⽣成的模板转换为PDF格式打开Adobe Acrobat pro,打开模板,选择 |—— 准备表单,它会⾃动检测并命名表单域,然后保存为pdf格式即可PDF⼯具类public class PDFTemplet {private String templatePdfPath;private String targetPdfpath;private ServiceOrder order ;public PDFTemplet() {}public void PDFTemplet(File file,String basePath)thows Exception{/*模板路径*/PdfReader reader = new PdfReader(templatePdfPath);ByteArrayOutputStream bos=new ByteArrayOutputStream();/* 读取*/PdfStamper pdfStamper= new PdfStamper(reader,bos);/*使⽤中⽂字体*/BaseFont baseFont=BaseFont.createFont(basePath+"WEB-INF/static/SIMHEI.TTF",BaseFont.IDENTITY_H,BaseFont.EMBEDDED); ArrayList<BaseFont> fontList=new ArrayList<>();fontList.add(baseFont);AcroFields s=pdfStamper.getAcroFields();s.setSubstitutionFonts(fontList);/*需要注意的是 setField的name和命名的表单域名字要⼀致*/s.setField("enterpriseName",order.getEnerpriseName());s.setField("incubatorName",order.getIncubatorName());s.setField("recommend","");//孵化器推荐s.setField("contacts",order.getContacts());s.setField("phone",order.getPhone());s.setField("email",order.getEmail());s.setField("category ","");//服务类别s.setField("demand",order.getDemand());SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");String createTime = formatter.format(order.getCreateTime());String updateTime = formatter.format(order.getUpdateTime());s.setField("createTime",createTime);s.setField("updateTime", updateTime);ps.setFormFlattenning(true);ps.close();FileOutputStream fileSteam =new FileOutPutStream(file);fos.write(bos.toByteArray);fos.close();}}调⽤⽅法@RequestMapping(value ="downloadPdf", method = RequestMethod.GET)public String downloadPDF(@PathVariable("id") Integer id,HttpServletRequest request) throws Exception {ServiceOrder serviceOrder = serviceOrderService.getById(id);PDFTemplet pdfTT = new PDFTemplet();pdfTT.setOrder(serviceOrder);String basePath = request.getSession().getServletContext().getRealPath("/");String template = request.getSession().getServletContext().getRealPath("/") + "WEB-INF/static/excel/confirmation.pdf"; pdfTT.setTemplatePdfPath(template);pdfTT.setTargetPdfpath("D:/企业服务确认单.pdf");pdfTT.setOrder(serviceOrder);File file = new File("D:/企业服务确认单.pdf");file.createNewFile();pdfTT.templetTicket(file,basePath);return "/master/serviceOrder/orderList";}。
itextpdfJAVA输出PDF文档
itextpdfJAVA输出PDF⽂档使⽤JAVA⽣成PDF的时候,还是有些注意事项需要处理的。
第⼀、中⽂问题,默认的itext是不⽀持中⽂的,想要⽀持,需要做些处理。
1、直接引⽤操作系统的中⽂字体库⽀持,由于此⽅案限制性强,⼜绑定了操作系统,所以此处不做实现,有兴趣可在⽹上搜索看看。
2、引⽤itext-asian.jar包的字体⽀持,代码稍后上。
itext pdf引⼊中⽂常见异常: com.itextpdf.text.DocumentException: Font 'STSongStd-Light' with 'UniGB-UCS2-H' is not recognized. 解决⽅案:a、引⼊操作系统字体;2、将字体维护进jar包中,如果没有,直接找到字体放⼊对应jar包中,如果是路径错误,则更改包路径;3、通过itext-asian.jar来加载中⽂包。
第⼆、表格中的设置,特别是上中下,左中右,不同的对象有不同的枚举实现,刚⼊⼿很容易混淆。
其外是前景⾊,背景⾊,表格颜⾊等等。
第三、输出图⽚,很容易报错。
itext pdf常见输出图⽚异常: An error exists on this page. Acrobat may not display the page correctly. Please contact the person who created the PDF document to correct the problem. 原因:PdfContentByte在addImage的时候需要在beginText()和endText()范围以外调⽤,否则⽣成的PDF就会报上述错误。
⽰例:1package com.itext.test;23import java.io.File;4import java.io.FileOutputStream;5import java.io.IOException;6import java.io.InputStream;7import java.util.ArrayList;8import java.util.List;9import java.util.Random;1011import com.itextpdf.text.BaseColor;12import com.itextpdf.text.Document;13import com.itextpdf.text.DocumentException;14import com.itextpdf.text.Element;15import com.itextpdf.text.Font;16import com.itextpdf.text.Image;17import com.itextpdf.text.PageSize;18import com.itextpdf.text.Paragraph;19import com.itextpdf.text.Rectangle;20import com.itextpdf.text.pdf.BarcodeQRCode;21import com.itextpdf.text.pdf.BaseFont;22import com.itextpdf.text.pdf.PdfContentByte;23import com.itextpdf.text.pdf.PdfGState;24import com.itextpdf.text.pdf.PdfPCell;25import com.itextpdf.text.pdf.PdfPTable;26import com.itextpdf.text.pdf.PdfPageEventHelper;27import com.itextpdf.text.pdf.PdfWriter;2829public class D {3031private static String path = "docs/"; // ⽣成PDF后的存放路径32private static final String logoPath = "logo.png";3334public static void main(String[] args) {35// T t = new T();36 initPDF(initData());37 }3839/**40 * 初始化PDF41 *42 * @param apis43*/44public static void initPDF(List<Api> apis) {45 File folder = new File(path);46if (!folder.exists())47 folder.mkdirs(); // 创建⽬录48 Document doc = null;49try {50// 中⽂字体,要有itext-asian.jar⽀持(默认的itext.jar是不⽀持中⽂的)51 BaseFont bfchinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);52 Rectangle pageSize = new Rectangle(PageSize.A4); // 页⾯⼤⼩设置为A453 doc = new Document(pageSize, 20, 20, 40, 40); // 创建doc对象并设置边距54 PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(folder.getAbsolutePath() + File.separator + "API⽂档.pdf"));55 writer.setPageEvent(new SdkPdfPageEvent());56 doc.open();57 doc.addAuthor("Ares-xby");58 doc.addSubject("SDK附属API⽂档");59 doc.addTitle("API⽂档");60 BaseColor borderColor = new BaseColor(90, 140, 200);61 BaseColor bgColor = new BaseColor(80, 130, 180);62for (Api api : apis) {63 PdfPTable table = new PdfPTable({0.25f, 0.25f, 0.25f, 0.25f});64// table.setWidthPercentage(100); // 设置table宽度为100%65// table.setHorizontalAlignment(PdfPTable.ALIGN_CENTER); // 设置table居中显⽰66for (int i = 0; i < api.getParams().size(); i++) {67if (i == 0) {68// row 169 table.addCell(createCell("API", bfchinese, borderColor, bgColor));70 table.addCell(createCell(api.getApiName(), 12, bfchinese, 3, null, borderColor, bgColor));71// row 272 table.addCell(createCell("描述", bfchinese, borderColor));73 table.addCell(createCell(api.getApiDesc(), 12, bfchinese, 3, null, borderColor));74 } else {75 table.addCell(createCell(api.getParams().get(i).getParamName(), 10, bfchinese, null, Paragraph.ALIGN_RIGHT, borderColor));76 table.addCell(createCell(api.getParams().get(i).getParamName(), 10, bfchinese, null, null, borderColor));77 table.addCell(createCell(api.getParams().get(i).getParamType(), 10, bfchinese, null, null, borderColor));78 table.addCell(createCell(api.getParams().get(i).getParamDesc(), 10, bfchinese, null, null, borderColor));79 }80 }81 doc.add(table);82 }83// ⼆维码84 BarcodeQRCode qrcode = new BarcodeQRCode("", 1, 1, null);85 Image qrcodeImage = qrcode.getImage();86 qrcodeImage.setAbsolutePosition(10, 600);87 qrcodeImage.scalePercent(200);88 doc.add(qrcodeImage);89 doc.close();90 System.out.println("init pdf over.");91 } catch (DocumentException e) {92 e.printStackTrace();93 } catch (IOException e) {94 e.printStackTrace();95 } finally {96if (doc != null)97 doc.close();98 }99100 }101102public static List<Api> initData() {103 List<Api> list = new ArrayList<Api>();104for (int i = 0; i < 100; i++) {105 Api api = new Api();106 api.setApiName("api-" + i);107 api.setApiDesc("描述-" + i);108int paramSize = new Random().nextInt(20);109 List<Params> paramList = new ArrayList<Params>();110for (int j = 0; j < paramSize; j++) {111 Params param = new Params();112 param.setParamName("param-" + i + "-" + j);113 param.setParamType("paramType-" + i + "-" + j);114 param.setParamDesc("描述-" + i + "-" + j);115 paramList.add(param);116 }117 api.setParams(paramList);118 list.add(api);119 }120 System.out.println("init data over. size=" + list.size());121return list;122 }123// ⽤於⽣成cell124private static PdfPCell createCell(String text, BaseFont font, BaseColor borderColor) {125return createCell(text, 12, font, null, null, borderColor, null);126 }127// ⽤於⽣成cell128private static PdfPCell createCell(String text, BaseFont font, BaseColor borderColor, BaseColor bgColor) {129return createCell(text, 12, font, null, null, borderColor, bgColor);130 }131// ⽤於⽣成cell132private static PdfPCell createCell(String text, int fontsize, BaseFont font, Integer colspan, Integer align, BaseColor borderColor) {133return createCell(text, fontsize, font, colspan, align, borderColor, null);134 }135136/**137 * ⽤於⽣成cell138 * @param text Cell⽂字内容139 * @param fontsize 字体⼤⼩140 * @param font 字体141 * @param colspan 合并列数量142 * @param align 显⽰位置(左中右,Paragraph对象)143 * @param borderColor Cell边框颜⾊144 * @param bgColor Cell背景⾊145 * @return146*/147private static PdfPCell createCell(String text, int fontsize, BaseFont font, Integer colspan, Integer align, BaseColor borderColor, BaseColor bgColor) { 148 Paragraph pagragraph = new Paragraph(text, new Font(font, fontsize));149 PdfPCell cell = new PdfPCell(pagragraph);150 cell.setFixedHeight(20);151 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 上中下,Element对象152if (align != null)153 cell.setHorizontalAlignment(align);154if (colspan != null && colspan > 1)155 cell.setColspan(colspan);156if (borderColor != null)157 cell.setBorderColor(borderColor);158if (bgColor != null)159 cell.setBackgroundColor(bgColor);160return cell;161 }162163/**164 * SDK中PDF相关的PageEvent165*/166static class SdkPdfPageEvent extends PdfPageEventHelper {167168 @Override169public void onStartPage(PdfWriter writer, Document document) {170// ⽔印(water mark)171 PdfContentByte pcb = writer.getDirectContent();172 pcb.saveState();173 BaseFont bf;174try {175 bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);176 pcb.setFontAndSize(bf, 36);177 } catch (DocumentException e) {178 e.printStackTrace();179 } catch (IOException e) {180 e.printStackTrace();181 }182// 透明度设置183 PdfGState gs = new PdfGState();184 gs.setFillOpacity(0.2f);185 pcb.setGState(gs);186187 pcb.beginText();188 pcb.setTextMatrix(60, 90);189 pcb.showTextAligned(Element.ALIGN_LEFT, "XX公司有限公司", 200, 300, 45);190191 pcb.endText();192 pcb.restoreState();193 }194195 @Override196public void onEndPage(PdfWriter writer, Document document) {197// 页眉、页脚198 PdfContentByte pcb = writer.getDirectContent();199try {200 pcb.setFontAndSize(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED), 10);201 } catch (Exception e) {202 e.printStackTrace();203 } // ⽀持中⽂字体204 pcb.saveState();205try {206// pcb.addImage()⽅法要在pcb.beginText();pcb.endText();之外调⽤,207// 否则⽣成的PDF打开时会报错: An error exists on this page. Acrobat may not display the page correctly. Please contact the person who created the PDF document to correct the problem.208byte[] logoBytes = new byte[1000 * 1024]; // 此处数组⼤⼩要⽐logo图⽚⼤⼩要⼤, 否则图⽚会损坏;能够直接知道图⽚⼤⼩最好不过.209 InputStream logoIs = getClass().getResourceAsStream(logoPath);210if(logoIs != null){211int logoSize = logoIs.read(logoBytes); // 尝试了⼀下,此处图⽚复制不完全,需要专门写个⽅法,将InputStream转换成Byte数组,详情参考org.apache.io.IOUtils.java的toByteArray(InputStream in)⽅法212if(logoSize > 0){213byte[] logo = new byte[logoSize];214 System.arraycopy(logoBytes, 0, logo, 0, logoSize);215 Image image = Image.getInstance(logo);// 如果直接使⽤logoBytes,并且图⽚是jar包中的话,会报图⽚损坏异常;本地图⽚可直接getInstance时候使⽤路径。
java利用Adobe模板生成pdf文件
java利⽤Adobe模板⽣成pdf⽂件1.引⽤的jar <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.6</version> </dependency>import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.Properties;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSON;import com.itextpdf.text.Document;import com.itextpdf.text.Image;import com.itextpdf.text.Rectangle;import com.itextpdf.text.pdf.AcroFields;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfContentByte;import com.itextpdf.text.pdf.PdfCopy;import com.itextpdf.text.pdf.PdfImportedPage;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;/*** Created by znh on 2020/03/16.*/public class PdfUtils {protected static final Logger logger = LoggerFactory.getLogger(PdfUtils.class);/*** @param map* @param templatePath* @param newPDFPath* @param baseFont*/@SuppressWarnings("unchecked")public static void pdfout(Map<String,Object> map,String templatePath,String newPDFPath,String baseFont) throws Exception{ PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper stamper;try {//设置字体BaseFont bf = BaseFont.createFont(baseFont, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);out = new FileOutputStream(newPDFPath);// 输出流reader = new PdfReader(templatePath);// 读取pdf模板bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);AcroFields form = stamper.getAcroFields();form.setGenerateAppearances(true);//⽂字类的内容处理Map<String,String> datemap = (Map<String,String>)map.get("datemap");for(String key : datemap.keySet()){form.setFieldProperty(key, "textfont", bf, null);}for(String key : datemap.keySet()){String value = datemap.get(key);form.setField(key,value);}//图⽚类的内容处理Map<String,String> imgmap = (Map<String,String>)map.get("imgmap");if(null != imgmap){for(String key : imgmap.keySet()) {String imgpath = imgmap.get(key);if(Util.isNotEmpty(imgpath)){int pageNo = form.getFieldPositions(key).get(0).page;Rectangle signRect = form.getFieldPositions(key).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();//根据路径读取图⽚Image image = Image.getInstance(imgpath);//获取图⽚页⾯PdfContentByte under = stamper.getOverContent(pageNo);//图⽚⼤⼩⾃适应image.scaleToFit(signRect.getWidth(), signRect.getHeight());//添加图⽚image.setAbsolutePosition(x, y);under.addImage(image);}}}stamper.setFormFlattening(false);// 如果为false,⽣成的PDF⽂件可以编辑,如果为true,⽣成的PDF⽂件不可以编辑 stamper.close();Document doc = new Document();PdfCopy copy = new PdfCopy(doc, out);doc.open();//pdf模版的页数int pagecount= reader.getNumberOfPages();for(int i=1 ;i<pagecount+1;i++){PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);copy.addPage(importPage);}doc.close();} catch (Exception e) {(e.getMessage());throw new Exception(e.getMessage());}}public static String getKeyValue(String key, String defaultval) {Properties props = new Properties();InputStream inputStream = Util.class.getClassLoader().getResourceAsStream("setting.properties");if (inputStream == null) {return null;}try {props.load(new InputStreamReader(inputStream,"UTF-8"));inputStream.close();String value = props.getProperty(key, defaultval);return value;} catch (IOException e) {e.printStackTrace();}return null;}/*** @param map* @param fileName* @throws Exception*/public static ImageObjectInfo archivalInfo(Map<String,Object> map,String fileName) throws Exception{String templatePath = getKeyValue("elePolicytemplatePath", "");String newPDFPath = getKeyValue("elePolicynewPDFPath", "");String baseFont = getKeyValue("elePolicybaseFont", "");("templatePath:"+templatePath);("baseFont:"+baseFont);SimpleDateFormat sdf = new SimpleDateFormat("yyyy");newPDFPath += sdf.format(new Date()) + "/";File dir = new File(newPDFPath);if (!dir.exists()) {dir.mkdirs();}sdf = new SimpleDateFormat("MM-dd");newPDFPath += sdf.format(new Date()) + "/";dir = new File(newPDFPath);if (!dir.exists()) {dir.mkdirs();}String times = DateFormat.convent_YYYYMMddHHmmss(new Date());newPDFPath = newPDFPath + fileName + "_" + times + ".pdf";("合成后的⽂件已输出到:" + newPDFPath);pdfout(map, templatePath, newPDFPath,baseFont);File f = new File(newPDFPath);ImageObjectInfo objectInfo = new ImageObjectInfo();objectInfo.setPath(newPDFPath);objectInfo.setType("elePolicy");objectInfo.setSize((int) f.length());objectInfo.setFilename(fileName+"_"+times+".pdf");(JSON.toJSONString(objectInfo));return objectInfo;}public static void main(String[] args) throws Exception {Map<String,String> map = new HashMap<String,String>();map.put("name","张三");map.put("areaName","浙江杭州");map.put("idCard","330103************");map.put("cellphone","131********");map.put("idCardDateE","2020-12-12");map.put("education","⼤学本科");map.put("practiceCode","45252525274525725725725725");map.put("homeAddress","安徽省⾩阳市颍东区别华办丰处梨树社区陈庄34亏1户");Map<String,String> map2 = new HashMap<String,String>();map2.put("agency_cardImagZ","C:\\1.jpg");map2.put("agency_cardImagF","C:\\2.jpg");map2.put("bankCardImg","C:\\3.jpg");map2.put("educatImg","C:\\4.jpg");Map<String,Object> o=new HashMap<String,Object>();o.put("datemap",map);o.put("imgmap",map2);archivalInfo(o,"z啧啧啧");}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public static void writeSimplePdf() throws Exception{
//1.新建document对象
//第一个参数是页面大小。
接下来的参数分别是左、右、上和下页边距。
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
//2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
//创建PdfWriter 对象第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。
PdfWriter writer = PdfWriter.getInstance(document, new
FileOutputStream("C:\\ITextTest.pdf"));
//3.打开文档
document.open();
//4.向文档中添加内容
//通过com.lowagie.text.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, 14, Font.BOLD, new Color(255, 150, 200))));
//5.关闭文档
document.close();
}
/**
* 添加含有章节的pdf文件
* @throws Exception
*/
public static void writeCharpter() throws Exception{
//新建document对象第一个参数是页面大小。
接下来的参数分别是左、右、上和下页边距。
Document document = new Document(PageSize.A4, 20, 20, 20, 20);
//建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("c:\\ITextTest.pdf"));
//打开文件
document.open();
//标题
document.addTitle("Hello mingri example");
//作者
document.addAuthor("wolf");
//主题
document.addSubject("This example explains how to add metadata.");
document.addKeywords("iText, Hello mingri");
document.addCreator("My program using iText");
// document.newPage();
//向文档中添加内容
document.add(new Paragraph("\n"));
document.add(new Paragraph("\n"));
document.add(new Paragraph("\n"));
document.add(new Paragraph("\n"));
document.add(new Paragraph("\n"));
document.add(new Paragraph("First page of the document."));
document.add(new Paragraph("First page of the document."));
document.add(new Paragraph("First page of the document."));
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.defaultEncoding, 10,Font.BOLD, new Color(0, 0, 0))));
Paragraph title1 = new Paragraph("Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new Color(0, 0,255)));
//新建章节
Chapter chapter1 = new Chapter(title1, 1);
chapter1.setNumberDepth(0);
Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD,new Color(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);
document.add(chapter1);
//关闭文档
document.close();
}。