JAVA生成PDF报表

合集下载

java根据模板生成pdf文件并导出

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的方法

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动态生成word和pdf

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根据模板动态生成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参数

润乾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的方法

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 文件。

java导出pdf接口的写法

java导出pdf接口的写法

java导出pdf接口的写法【1】导出PDF的需求背景在实际工作中,有许多场景需要将Java程序生成的数据以PDF格式导出,例如:报表统计、文档模板生成、用户数据导出等。

PDF格式具有跨平台、易于查看和打印等特点,因此成为了一种广泛应用的文档格式。

为了满足这一需求,Java提供了一些导出PDF的库,下面我们将介绍这些库及具体使用方法。

【2】Java导出PDF的常用库介绍Java导出PDF的常用库有以下几个:1.iText:Apache POI的一个组件,提供了强大的PDF生成和处理功能。

2.XDocReport:一款轻量级的Java PDF报告库,支持多种数据源(如数据库、Excel、XML等)生成PDF报告。

3.JasperReports:一款功能强大的报表生成工具,支持多种数据源和文件格式,包括PDF。

【3】详细步骤:编写导出PDF的代码以iText库为例,介绍如何编写导出PDF的代码:1.首先,需要在项目中引入iText依赖。

如果使用Maven,可以在pom.xml文件中添加以下依赖:```xml<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version></dependency>```2.创建一个PDF文档:```javaimport com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.PageSize;public class PdfExport {public static void main(String[] args) {try {// 创建PDF文档Document document = new Document(PageSize.A4);// 添加内容到文档// ...// 生成PDF文件document.save("output.pdf");// 关闭文档document.close();} catch (DocumentException e) {e.printStackTrace();}}}```3.添加文档内容,如标题、段落、图片等:```javaimport com.itextpdf.text.Paragraph;import com.itextpdf.text.Image;import com.itextpdf.text.pdf.PdfWriter;// ...document.open();// 添加标题document.add(new Paragraph("报表标题"));// 添加段落document.add(new Paragraph("这是一个段落"));// 添加图片Image image = Image.getInstance("path/to/your/image.jpg", null); image.setAutoScale(true);document.add(image);document.close();```【4】代码示例及解析以上代码演示了如何使用iText库创建一个简单的PDF文件。

java使用iText生成pdf表格

java使用iText生成pdf表格

java使⽤iText⽣成pdf表格⾸先导⼊如下jar包:package .pojo;import java.awt.Color;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import com.lowagie.text.BadElementException;import com.lowagie.text.Cell;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.Element;import com.lowagie.text.Font;import com.lowagie.text.PageSize;import com.lowagie.text.Paragraph;import com.lowagie.text.Phrase;import com.lowagie.text.Table;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.pdf.PdfWriter;public class POI {public static void main(String[] args) throws DocumentException, IOException {// 创建Document对象(页⾯的⼤⼩为A4,左、右、上、下的页边距为10)Document document = new Document(PageSize.A4, 10, 10, 10, 10);// 建⽴书写器PdfWriter.getInstance(document, new FileOutputStream("/Users/apple/Desktop/poi.PDF"));// 设置相关的参数POI.setParameters(document, "开发者测试", "测试", "测试开发者调试", "⽢⾬路", "⽢⾬路");// 打开⽂档document.open();// 使⽤iTextAsian.jar中的字体BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font font = new Font(baseFont);List<User> users = new ArrayList<User>();// 循环添加对象for (int i = 0; i < 5; i++) {User user = new User();user.setId(""+i);user.setInfo("开发者测试"+i);user.setName("测试"+i);users.add(user);}Table table = POI.setTable(users);document.add(new Paragraph("⽤户信息如下:",POI.setFont()));document.add(table);// 关闭⽂档document.close();}public static Table setTable(List<User> users) throws BadElementException{//创建⼀个有3列的表格Table table = new Table(3);table.setBorderWidth(1);table.setBorderColor(new Color(0, 0, 255));table.setPadding(5);table.setSpacing(5);// 创建表头Cell cell1 = POI.setTableHeader("编号ID");Cell cell2 = POI.setTableHeader("基本信息");Cell cell3 = POI.setTableHeader("姓名");table.addCell(cell1);table.addCell(cell2);table.addCell(cell3);// 添加此代码后每页都会显⽰表头table.endHeaders();for (int i = 0; i < users.size(); i++) {Cell celli1 = POI.setTableHeader(users.get(i).getId());Cell celli2 = POI.setTableHeader(users.get(i).getInfo());Cell celli3 = POI.setTableHeader(users.get(i).getName());table.addCell(celli1);table.addCell(celli2);table.addCell(celli3);}return table;}/*** 设置字体编码格式* @return*/public static Font setFont(){BaseFont baseFont = null;try {baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Font font = new Font(baseFont, 8, Font.NORMAL,Color.BLUE);return font;}/*** 设置cell* @param name* @return* @throws BadElementException*/public static Cell setTableHeader(String name) throws BadElementException{Cell cell = new Cell(new Phrase(name,POI.setFont()));//单元格⽔平对齐⽅式cell.setHorizontalAlignment(Element.ALIGN_CENTER);//单元格垂直对齐⽅式cell.setVerticalAlignment(Element.ALIGN_CENTER);// cell.setHeader(true);cell.setBackgroundColor(Color.RED);return cell;}/*** 设置相关参数* @param document* @return*/public static Document setParameters(Document document,String title,String subject,String keywords,String author, String creator){// 设置标题document.addTitle(title);// 设置主题document.addSubject(subject);// 设置作者document.addKeywords(keywords);// 设置作者document.addAuthor(author);// 设置创建者document.addCreator(creator);// 设置⽣产者document.addProducer();// 设置创建⽇期document.addCreationDate();return document;}}代码运⾏后产⽣的效果如下:。

详解Java生成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生成方案

flying sauser在这种情况下,我几乎已经燃起了自己编写一个支持CSS解析的HTML Parser的想法。

幸好,在一个非常偶然的情况下,我在google中搜到了这样一个开源项目,它能够满足我的一切需求。

这就是flying sauser,项目主页是:https:///项目的首页非常吸引人:An XML/XHTML/CSS 2.1 Renderer。

这不正是我要的东西么?仔细再看里面的文档:引用Flying Saucer is an XML/CSS renderer, which means it takes XML files as input, applies formatting and styling using CSS, and generates a rendered representation of that XML as output. The output may go to the screen (in a GUI), to an image, or to a PDF file. Because we believe most people will be interested in re-using their knowledge of web layout, our main target for content is XHTML 1.0 (strict), an XML document format that standardizes HTML.完美了。

这东西能解析HTML和CSS,而且能输出成image,PDF等格式。

哇!我们来看看sample代码(代码丑陋,不过已经能说明问题了):Java代码/** ITextRendererTest.java ** Copyright 2009 Shanghai TuDou.* All rights reserved.*/package itext;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import org.xhtmlrenderer.pdf.ITextFontResolver;import org.xhtmlrenderer.pdf.ITextRenderer;import com.lowagie.text.pdf.BaseFont;/*** TODO class description *** @author pcwang** @version 1.0, 上午11:03:26 create $Id$*/public class ITextRendererTest {public static void main(String[] args) throws Exception { String inputFile = "conf/template/test.html";String url = new File(inputFile).toURI().toURL().toStr ing();String outputFile = "firstdoc.pdf";OutputStream os = new FileOutputStream(outputFile);ITextRenderer renderer = new ITextRenderer();renderer.setDocument(url);// 解决中文支持问题ITextFontResolver fontResolver = renderer.getFontResolver();fontResolver.addFont("C:/Windows/Fonts/arialuni.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 解决图片的相对路径问题renderer.getSharedContext().setBaseURL("file:/D:/Work/Demo2do/Yoda/branch/Yoda%20-%20All/conf/template/");yout();renderer.createPDF(os);os.close();}}运行,成功!实在太简单了!API帮你完成了一切!有了这个东西,我们就可以将PDF的生成流程变成这样:1) 编写Freemarker或者Velocity模板,打造HTML,勾画PDF的样式(请任意使用CSS)2) 在你的业务逻辑层引入Freemarker的引擎或者Velocity的引擎,并将业务逻辑层中可以获取的数据和模板,使用引擎生成最终的内容3) 将我上面的sample代码做简单封装后,调用,生成PDF这样,我想作为一个web程序员来说,上面的3点,都不会成为你的绊脚石。

java根据模板生成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文件

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与latex 自动生成 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文档(表格、列表、添加图片等)

Java生成PDF文档(表格、列表、添加图片等)

Java⽣成PDF⽂档(表格、列表、添加图⽚等)1 import java.awt.Color;2 import java.io.FileOutputStream;3 import com.lowagie.text.Cell;4 import com.lowagie.text.Chapter;5 import com.lowagie.text.Document;6 import com.lowagie.text.Font;7 import com.lowagie.text.Image;8 import com.lowagie.text.List;9 import com.lowagie.text.ListItem;10 import com.lowagie.text.PageSize;11 import com.lowagie.text.Paragraph;12 import com.lowagie.text.Section;13 import com.lowagie.text.Table;14 import com.lowagie.text.pdf.BaseFont;15 import com.lowagie.text.pdf.PdfWriter;16 public class ITextDemo {17 public boolean iTextTest() {18 try {19 /** 实例化⽂档对象 */20 Document document = new Document(PageSize.A4, 50, 50, 50, 50);21 /** 创建 PdfWriter 对象 */22 PdfWriter.getInstance(document,// ⽂档对象的引⽤23 new FileOutputStream("d://ITextTest.pdf"));//⽂件的输出路径+⽂件的实际名称24 document.open();// 打开⽂档25 /** pdf⽂档中中⽂字体的设置,注意⼀定要添加iTextAsian.jar包 */26 BaseFont bfChinese = BaseFont.createFont("STSong-Light",27 "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);28 Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);//加⼊document:29 /** 向⽂档中添加内容,创建段落对象 */30 document.add(new Paragraph("First page of the document."));// Paragraph添加⽂本31 document.add(new Paragraph("我们是害⾍", FontChinese));32 /** 创建章节对象 */33 Paragraph title1 = new Paragraph("第⼀章", FontChinese);34 Chapter chapter1 = new Chapter(title1, 1);35 chapter1.setNumberDepth(0);36 /** 创建章节中的⼩节 */37 Paragraph title11 = new Paragraph("表格的添加", FontChinese);38 Section section1 = chapter1.addSection(title11);39 /** 创建段落并添加到⼩节中 */40 Paragraph someSectionText = new Paragraph("下⾯展⽰的为3 X 2 表格.",41 FontChinese);42 section1.add(someSectionText);43 /** 创建表格对象(包含⾏列矩阵的表格) */44 Table t = new Table(3, 2);// 2⾏3列45 t.setBorderColor(new Color(220, 255, 100));46 t.setPadding(5);47 t.setSpacing(5);48 t.setBorderWidth(1);49 Cell c1 = new Cell(new Paragraph("第⼀格", FontChinese));50 t.addCell(c1);51 c1 = new Cell("Header2");52 t.addCell(c1);53 c1 = new Cell("Header3");54 t.addCell(c1);55 // 第⼆⾏开始不需要new Cell()56 t.addCell("1.1");57 t.addCell("1.2");58 t.addCell("1.3");59 section1.add(t);60 /** 创建章节中的⼩节 */61 Paragraph title13 = new Paragraph("列表的添加", FontChinese);62 Section section3 = chapter1.addSection(title13);63 /** 创建段落并添加到⼩节中 */64 Paragraph someSectionText3 = new Paragraph("下⾯展⽰的为列表.", FontChinese);65 section3.add(someSectionText3);66 /** 创建列表并添加到pdf⽂档中 */67 List l = new List(true, true, 10);// 第⼀个参数为true,则创建⼀个要⾃⾏编号的列表,68 // 如果为false则不进⾏⾃⾏编号69 l.add(new ListItem("First item of list"));70 l.add(new ListItem("第⼆个列表", FontChinese));71 section3.add(l);72 document.add(chapter1);73 /** 创建章节对象 */74 Paragraph title2 = new Paragraph("第⼆章", FontChinese);75 Chapter chapter2 = new Chapter(title2, 1);76 chapter2.setNumberDepth(0);77 /** 创建章节中的⼩节 */78 Paragraph title12 = new Paragraph("png图⽚添加", FontChinese);79 Section section2 = chapter2.addSection(title12);80 /** 添加图⽚ */81 section2.add(new Paragraph("图⽚添加: 饼图", FontChinese));82 Image png = Image.getInstance("D:/pie.png");//图⽚的地址83 section2.add(png);84 document.add(chapter2);85 document.close();86 return true;87 } catch (Exception e2) {88 System.out.println(e2.getMessage());89 }90 return false;91 }92 public static void main(String args[]) {93 System.out.println(new ITextDemo().iTextTest());94 }95 }。

Java生成PDF文件代码实现

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模板合并单元格表格的案例

java后端⽣成pdf模板合并单元格表格的案例这⾥只放部分⽚段的代码java中使⽤⼆维数组⽣成表格⾮常⽅便,但是每⼀维的数组都需要排好序,⽽且,在java中所谓的⼆维数组,三维数组等,其实都是多个⼀维数组组成的/*** 添加⼦⼥教育规划表。

* @param name ⼦⼥姓名* @param educationItems 某个孩⼦的教育规划的⼆维数组,每列依次是:学程阶段、年数、费⽤⽀出(元)/年、年增长率* @param spacing* @throws DocumentException* @throws IOException*/private void addEducationTable(String name, String[][] educationItems, float spacing) throws DocumentException, IOException{addParagraphText(name + "的教育⽀出规划如下:", getMainTextFont(), 0, SPACING_5, LEADING_MULT);//标题字段//以下是表头float[] colWidth = new float[] { mm2px_width(34f), mm2px_width(34f), mm2px_width(34f), mm2px_width(34f), mm2px_width(34f) };String[] colName = { "学程阶段", "年数", "规划值(⾸次)","发⽣值(⾸次)", "年增长率" };//表头列的⼀维数组int[] colAlignment = {Element.ALIGN_LEFT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT, Element.ALIGN_RIGHT }; //表头有⼏列就写⼏个对齐⽅式 float[] colPaddingLeft = { 3f, 3f, 3f, 3f, 3f };float[] colPaddingRight = { 3f, 3f, 3f, 3f, 3f };Font[] colFont = { getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont(), getTabCellTextFont() };//字体及颜⾊的设置educationItems=swap(educationItems, 3, 4);//这是排序⼆维数组,把第4列换到第3⾏(从0开始计数)PdfPTable table = tableTemplate(educationItems, colWidth, colName, colAlignment, colPaddingLeft, colPaddingRight, colFont);//⽣成表格table.setSpacingAfter(mm2px_height(spacing));this._document.add(table);//⽣成到PDF去,代码就不贴了}/*** @param items ⼆维数组表⽰的表* @param colWidth 各列的宽度(像素)* @param colName 各列的名称* @param colAlignment 各列的⽔平对齐⽅式* @param colPaddingLeft 各列的左padding* @param colPaddingRight 各列的右padding* @param colFont 各列的字体* @return* @throws DocumentException* @throws IOException*/private PdfPTable tableTemplates(String[][] items, float[] colWidth, String[] colName, int[] colAlignment,float[] colPaddingLeft, float[] colPaddingRight, Font[] colFont) throws DocumentException, IOException{PdfPTable intTable = new PdfPTable(colWidth.length);intTable.setTotalWidth(colWidth);intTable.setLockedWidth(true);intTable.getDefaultCell().setLeading(mm2px_height(LEADING_CELL_TEXT), 1f); //单元格内⽂字⾏间距intTable.getDefaultCell().setBorderColor(COLOR_CELL_BORDER); //边框颜⾊intTable.setHeaderRows(1); //第⼀⾏做表头,跨页再现表头//单元格可以跨页intTable.setSplitLate(false);intTable.setSplitRows(true);/*********************************************************************************************//***********************************以下是表头标题栏*******************************************/float headerHeight = mm2px_height(TABLE_HEADER_HEIGHT);intTable.getDefaultCell().setFixedHeight(headerHeight); //⾏⾼intTable.getDefaultCell().setBorder(Rectangle.NO_BORDER); //⽆边框for(int i = 0; i < colName.length; i++){intTable.getDefaultCell().setBackgroundColor(COLOR_TAB_HEADER); //表头背景intTable.getDefaultCell().setHorizontalAlignment(colAlignment[i]);intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[i]);intTable.getDefaultCell().setPaddingRight(colPaddingRight[i]);intTable.addCell(new Paragraph(colName[i], getTabHeaderTextFont()));}/*********************************************************************************************//***********************************以下是表格每⾏*********************************************/float rowHeight = mm2px_height(TABLE_ROW_HEIGHT);intTable.getDefaultCell().setMinimumHeight(rowHeight); //单元格内⽂字不确定,不能设置成固定⾏⾼intTable.getDefaultCell().setBackgroundColor(COLOR_CELL_BACK_WHITE);for(int i = 0; i < items.length; i++){if(i == items.length - 1) //最后⼀⾏有合并单元格{intTable.getDefaultCell().setColspan(6);//设置具体合并哪⼀列intTable.getDefaultCell().setHorizontalAlignment(colAlignment[0]);intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[0]);intTable.getDefaultCell().setPaddingRight(colPaddingRight[0]);intTable.getDefaultCell().setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);intTable.addCell(new Paragraph(items[i][0], colFont[0]));}else{for(int j = 0; j < items[i].length; j++){if(j == 0)intTable.getDefaultCell().setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);else intTable.getDefaultCell().setBorder(Rectangle.RIGHT | Rectangle.BOTTOM);if(j < colAlignment.length){intTable.getDefaultCell().setHorizontalAlignment(colAlignment[j]);intTable.getDefaultCell().setPaddingLeft(colPaddingLeft[j]);intTable.getDefaultCell().setPaddingRight(colPaddingRight[j]);intTable.addCell(new Paragraph(items[i][j], colFont[j]));}}}}/*********************************************************************************************/return intTable;}/**⼆维数组根据指定列排序到指定位置的⽅法,f2要⼤于f1*/public String[][] swap(String[][] data,int f1,int f2){for (int i = 0; i < data.length; i++) {String tamp=data[i][f2];for (int j = f2; j >f1; j--) {data[i][j]=data[i][j-1];}data[i][f1]=tamp;}return data;}/*** @return 获取表头标题栏字体。

java生成PDF,并下载到本地

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";}。

Java生成pdf文件或jpg图片的案例讲解

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⽬录。

使用模板引擎生成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模板更加友好地结合起来,支持服务器端和浏览器端使用,并使用标准语法进行渲染。

需要注意的是,不同的方法可能适用于不同的需求和场景,具体选择哪一种方法需要根据实际情况进行权衡和评估。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JAVA生成PDF报表JAVA生成PDF报表一、前言在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText。

通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到生成的报表,这样就很好的解决了B/S系统的报表处理问题。

二、iText简介iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。

通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html 文件转化为PDF文件。

iText的安装非常方便,在/iText/download.html - download 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

三、建立第一个PDF文档用iText生成PDF文档需要5个步骤:①建立com.lowagie.text.Document对象的实例。

Document document = new Document();②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。

PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF"));③打开文档。

document.open();④向文档中添加内容。

document.add(new Paragraph("Hello World"));⑤关闭文档。

document.close();通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为"Hello World"。

建立com.lowagie.text.Document对象的实例com.lowagie.text.Document对象的构建函数有三个,分别是:public Document();public Document(Rectangle pageSize);public Document(Rectangle pageSize,int marginLeft,int marginRight,int marginTop,int marginBottom);构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对于第三个构建函数,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距。

通过参数pageSize可以设定页面大小、面背景色、以及页面横向/纵向等属性。

iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA 和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144, 720);自定义纸张。

通过Rectangle方法rotate()可以将页面设置成横向。

书写器(Writer)对象一旦文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。

通过书写器(Writer)对象可以将具体文档存盘成需要的格式,如com.lowagie.text.PDF.PDFWriter可以将文档存成PDF文件,com.lowagie.text.html.HtmlWriter可以将文档存成html文件。

设定文档属性在文档打开之前,可以设定文档的标题、主题、作者、关键字、装订方式、创建者、生产者、创建日期等属性,调用的方法分别是:public boolean addTitle(String title)public boolean addSubject(String subject)public boolean addKeywords(String keywords)public boolean addAuthor(String author)public boolean addCreator(String creator)public boolean addProducer()public boolean addCreationDate()public boolean addHeader(String name, String content)其中方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息。

当新的页面产生之前,可以设定页面的大小、书签、脚注(HeaderFooter)等信息,调用的方法是:public boolean setPageSize(Rectangle pageSize)public boolean add(Watermark watermark)public void removeWatermark()public void setHeader(HeaderFooter header)public void resetHeader()public void setFooter(HeaderFooter footer)public void resetFooter()public void resetPageCount()public void setPageCount(int pageN)如果要设定第一页的页面属性,这些方法必须在文档打开之前调用。

对于PDF文档,iText还提供了文档的显示属性,通过调用书写器的setViewerPreferences方法可以控制文档打开时Acrobat Reader的显示属性,如是否单页显示、是否全屏显示、是否隐藏状态条等属性。

另外,iText也提供了对PDF文件的安全保护,通过书写器(Writer)的setEncryption方法,可以设定文档的用户口令、只读、可打印等属性。

添加文档内容所有向文档添加的内容都是以对象为单位的,如Phrase、Paragraph、Table、Graphic对象等。

比较常用的是段落(Paragraph)对象,用于向文档中添加一段文字。

四、文本处理iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。

文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。

如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:Chunk chunk1 = new Chunk("This text is underlined",FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。

通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase6.add(chunk);段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD 文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。

另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。

通过函数setAlignment可以设定段落的对齐方式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。

五、表格处理iText中处理表格的类为:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,这就需要com.lowagie.text.PDF.PDFPTable进行处理。

这里就类com.lowagie.text.Table进行说明。

类com.lowagie.text.Table的构造函数有三个:①Table (int columns)②Table(int columns, int rows)③Table(Properties attributes)参数columns、rows、attributes分别为表格的列数、行数、表格属性。

创建表格时必须指定表格的列数,而对于行数可以不用指定。

建立表格之后,可以设定表格的属性,如:边框宽度、边框颜色、衬距(padding space 即单元格之间的间距)大小等属性。

下面通过一个简单的例子说明如何使用表格,代码如下:1:Table table = new Table(3);2:table.setBorderWidth(1);3:table.setBorderColor(new Color(0, 0, 255));4:table.setPadding(5);5:table.setSpacing(5);6:Cell cell = new Cell("header");7:cell.setHeader(true);8:cell.setColspan(3);9:table.addCell(cell);10:table.endHeaders();11:cell = new Cell("example cell with colspan 1 and rowspan 2");12:cell.setRowspan(2);13:cell.setBorderColor(new Color(255, 0, 0));14:table.addCell(cell);15:table.addCell("1.1");16:table.addCell("2.1");17:table.addCell("1.2");18:table.addCell("2.2");19:table.addCell("cell test1");20:cell = new Cell("big cell");21:cell.setRowspan(2);22:cell.setColspan(2);23:table.addCell(cell);24:table.addCell("cell test2");运行结果如下:headerexample cell with colspan 1 and rowspan 2 1.1 2.11.22.2cell test1 big cellcell test2代码1-5行用于新建一个表格,如代码所示,建立了一个列数为3的表格,并将边框宽度设为1,颜色为蓝色,衬距为5。

相关文档
最新文档