java根据pdf模版动态生成pdf
java根据pdf模版动态生成pdf
packagecom.utils;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.LinkedList;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;importorg.apache.commons.io.FileUtils;importorg.xhtmlrenderer.pdf.ITextFontResolver;importorg.xhtmlrenderer.pdf.ITextRenderer;importcom.itextpdf.text.Document;importcom.itextpdf.text.DocumentException;importcom.itextpdf.text.Element;importcom.itextpdf.text.Font;importcom.itextpdf.text.PageSize;importcom.itextpdf.text.Phrase;importcom.itextpdf.text.pdf.AcroFields;importcom.itextpdf.text.pdf.AcroFields.Item;importcom.itextpdf.text.pdf.BaseFont;importcom.itextpdf.text.pdf.PdfContentByte;importcom.itextpdf.text.pdf.PdfPCell;importcom.itextpdf.text.pdf.PdfPTable;importcom.itextpdf.text.pdf.PdfReader;importcom.itextpdf.text.pdf.PdfStamper;importcom.itextpdf.text.pdf.PdfWriter;/*** 根据pdf模版动态生成pdf工具类*/ public classPDFReplaceUtils {public static final String htmlPreffix = "<!DOCTYPE html [<!ENTITY nbsp \" \"> ]><html><head><meta charset=\"UTF-8\"></meta><title></title></head><body>";public static final String htmlSuffix = "</body></html>";/*** 动态生成pdf** @* @date 2017年11月5日 上午11:40:44*@paramfileName* 模版路径*@paramoutFileName* 生成pdf路径*@parammap* 动态赋值pdf文本域名称和值*@throwsIOException*@throwsDocumentException*/public static void pdf(String fileName, String outFileName, Map<String, String>map)throwsIOException, DocumentException {PdfReader reader= newPdfReader(fileName);ByteArrayOutputStream bos= newByteArrayOutputStream();PdfStamper ps= newPdfStamper(reader, bos);BaseFont bf= BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();fontList.add(bf);AcroFields s=ps.getAcroFields();s.setSubstitutionFonts(fontList);Map<String, Item> fieldMap = s.getFields(); //pdf表单相关信息展示for (Entry<String, Item>entry : fieldMap.entrySet()) {String name= entry.getKey(); //name就是pdf模版中各个文本域的名字Item item =entry.getValue();}//给pdf文本域赋值for (Entry<String, String>maps : map.entrySet()) {s.setField(maps.getKey(), maps.getValue());}ps.setFormFlattening(true); //不能少 ps.close();OutputStream fos= newFileOutputStream(outFileName);fos.write(bos.toByteArray());fos.flush();fos.close();bos.close();reader.close();}/*** 创建pdf表格** @* @date 2017年11月5日 下午8:48:07*@paramfileName* 表格名称*@paramcolumnNum* 列数*@paramlists* 单元格内容*@throwsDocumentException*@throwsIOException*/public static void createPdfTable(String fileName, int columnNum, List<Map<String, String>>lists)throwsDocumentException, IOException {Document document= newDocument(PageSize.A4);PdfWriter.getInstance(document,newFileOutputStream(fileName));document.open();PdfPTable table= newPdfPTable(columnNum);table.setTotalWidth(50);table.setHeaderRows(0);table.setSpacingBefore(10f);BaseFont bf= BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font chinese= new Font(bf, 12, Font.NORMAL);Phrase phrase;PdfPCell cell;for (Map<String, String>map : lists) {for (Entry<String, String>maps : map.entrySet()) {phrase= newPhrase(maps.getValue(), chinese);cell= newPdfPCell(phrase);cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);}}document.add(table);document.close();}/*** 多个pdf合并,根据参数选择是否删除参与合并的pdf、 将合并后的pdf名称改为第几个参与合并的名称 注:需参与合并的pdf文件 请按需求正序排序** @* @date 2017年11月7日 下午8:46:43*@paramfileList* 要合并的pdf集合*@paramnewFile* 新文件*@paramisDelete* 是否删除参与合并的pdf文件*@paramnumFileName* 将新pdf文件名改为 第几个 参与合并pdf名*@throwsDocumentException*@throwsIOException*/public static void mergePdfFiles(List<String>fileList, String newFile, Boolean isDelete, Integer numFileName)throwsDocumentException, IOException {PdfReader[] readers= newPdfReader[fileList.size()];readers[0] = new PdfReader(fileList.get(0));PdfStamper stamp= new PdfStamper(readers[0], newFileOutputStream(newFile));PdfContentByte under;int pageNum = 1;for (int i = 1; i < fileList.size(); i++) {readers[i]= new PdfReader(fileList.get(i), null);pageNum+=readers[i].getNumberOfPages();stamp.insertPage(pageNum, PageSize.A4);under=stamp.getUnderContent(pageNum);under.addTemplate(stamp.getImportedPage(readers[i],1), 1, 0, 0, 1, 0, 0);}stamp.close();for(PdfReader pdfReader : readers) {pdfReader.close();}if (isDelete != null && isDelete == true) {//循环删除文件for(String file : fileList) {newFile(file).delete();}}if (numFileName != null && numFileName > 0) {//将新文件名改为第N个文件的路径File modifyFileName = newFile(newFile);modifyFileName.renameTo(new File(fileList.get(numFileName - 1)));}}/*** 富文本生成pdf文件**@paramcontext* html格式文本数据*@paramoutputFile* 输出pdf文件的路径*@return*@throwsException*/public static boolean convertHtmlToPdf(String context, String outputFile,String fontPath) throwsException {OutputStream os= newFileOutputStream(outputFile);ITextRenderer renderer= newITextRenderer();renderer.setDocumentFromString(context);//解决中文支持问题ITextFontResolver fontResolver =renderer.getFontResolver();fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//解决图片的相对路径问题//renderer.getSharedContext().setBaseURL("file:/D:/"); renderer.layout();renderer.createPDF(os);os.flush();os.close();return true;}public static void main(String[] args) throwsIOException, DocumentException {//List<String> list = new LinkedList<String>();//list.add("D:/1.pdf");//list.add("D:/2.pdf");//list.add("D:/3.pdf");//String newFile = "D:/4.pdf";//try {//PDFReplaceUtils.mergePdfFiles(list, newFile, true, 2);//} catch (DocumentException e) {// //TODO Auto-generated catch block//e.printStackTrace();//} catch (IOException e) {// //TODO Auto-generated catch block//e.printStackTrace();//}byte[] bytes;try{//bytes = FileUtils.readFileToByteArray(new File("D:/pdftest.html"));//convertHtmlToPdf(new String(bytes),"D:/lc.pdf","D:/simsun.ttc");} catch(Exception e) {//TODO Auto-generated catch block e.printStackTrace();}Map<String, String> map = new HashMap<String, String>();map.put("ProtocolNo", "jj");map.put("Borrower", "qq");map.put("Mobile", "12345678912");pdf("D:/jcsBorrow.pdf", "D:/test.pdf", map);//try {//List<Map<String, String>> list = null;//Map<String, String> map = new HashMap<String, String>();//list = new LinkedList<Map<String, String>>();//map.put("出借人(会员号)", "出借人(会员号)");//map.put("出借人身份证号", "出借人身份证号");//map.put("出借金额", "出借金额");//map.put("借款开始日", "借款开始日");//map.put("月截止还款日", "月截止还款日");//map.put("年利率", "年利率");//map.put("还款方式", "还款方式");//list.add(map);//createPdfTable("D:/test.pdf", 7, list);//} catch (DocumentException e) {// //TODO Auto-generated catch block//e.printStackTrace();//} catch (IOException e) {// //TODO Auto-generated catch block//e.printStackTrace();//} } }
转载于:https://www.cnblogs.com/chenyq/p/7807857.html
java根据pdf模版动态生成pdf相关推荐
- java使用world模板动态生成PDF文件
根据项目需求,需要用到一个功能,根据页面参数需要动态的生成一个world,并将world生成两份PDF文件,一份正式文件,一份临时的电子文件(带有二维码,扫描可以下载正式文件的电子版本).同时上传到文 ...
- java maven 读写pdf_Java动态生成pdf文件(使用itext编辑pdf)
一.创建pdf模板 使用PDFelement制作pdf模板(数据域的名称对应后面插入的key) 二.导入maven依赖 com.itextpdf itextpdf 5.5.13 com.itextpd ...
- java在linux生成pdf文件,从 Java 应用程序动态生成 PDF 文件
简介: 如果您的应用程序需要动态生成 PDF 文档,那么您需要 iText 库.开源的 iText 库使得 PDF 的创建变得轻松易行.本文介绍了 iText 并提供了一个使用它从 Java 技术应用 ...
- java基于word模板动态生成word及转pdf实践
在项目中很容易会遇到需要动态生成pdf的应用场景,其实现方式也比较多 由于项目的关系,对于这种组件性的开发方式我想的是怎么方便怎么来,怎么快就怎么来 在咨询了之前做政务系统的同学后,他们都一致推荐我使 ...
- java动态生成pdf文件的方法
java动态生成pdf文件 文章目录 java动态生成pdf文件 前言 一.生成pdf模板 二.使用步骤 1.使用jar包 2.pdf实现方法 总结 前言 java开发过程中难免会遇到生成文件的需求, ...
- Java读取pdf模板,并动态生成pdf文件,如动态生成准考证
Java读取pdf模板,并动态生成pdf文件,如动态生成准考证 前几天遇到了一个生成准考证的需求,并提供用户下载,然后百度了一圈还是觉得使用itextpdf这个框架好用点.但是还需要找到一个能创建 ...
- Java 读取 Excel 文件内容, 根据 pdf 模板动态生成对应的 pdf 文件
1. 下载 adobe acrobat https://www.cr173.com/soft/11135.html 2. 编辑 pdf 模板 1用 acrobat 打开 pdf 编辑模板 添加表单元素 ...
- 如何动态生成pdf文件?
pdfService系统 一. 背景 在许多开发需求中都有动态生成pdf文件的需求,例如根据已有的json字符串渲染到一个表格中,然后生成对应的PDF文档,以往的解决方法是调用许多个接口生产pdf文件 ...
- django生成文件txt、pdf(在生成 PDF 文件之前,需要安装 ReportLab 库)
from django.http import HttpResponse def download_file(request): # Text file #response = HttpRespons ...
最新文章
- 观察者模式(Observer)
- 【总结】IE和Firefox的Javascript兼容性总结
- python3-Python3 zip() 函数
- php+ajax简单实现跨域(http+https)请求调用
- 7 个建议让 Code Review 高效又高质
- 最最最最终极办法!解决Idea乱码问题
- 软件测试工程师笔试总结
- LeetCode--34.在排序数组中查找元素第一个和最后一个位置(二分法)
- C++STL笔记(八):set和multiset详解
- MySQL学习记录 (二) ----- SQL数据查询语句(DQL)
- es管理kabina_ES和Kibana在Linux上的安装
- 基于python及图像识别的围棋棋盘棋子识别2——定位棋子位置及识别棋子颜色
- 《天才在左、疯子在右》随笔
- c语言实现审查元素,如何删除qq空间说说?一键自动删除QQ空间说说审查元素代码分享(超简单)...
- PHP上传文件大小限制大全
- MINIS FORUM U820黑苹果安装教程
- 微博数据解析:国产彩妆品牌对比 | 完美日记 VS 花西子
- android studio manifest merger failed,android studio 引用第三方工程Manifest merger failed
- 导出IOS工程出错:DXT1 compressed textures are not supported when publishing to iPhone
- 不敲代码用ChatGPT开发一个App