java根据pdf模版动态生成pdf
package com.utils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.io.FileUtils; import org.xhtmlrenderer.pdf.ITextFontResolver; import org.xhtmlrenderer.pdf.ITextRenderer; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.PageSize; import com.itextpdf.text.Phrase; import com.itextpdf.text.pdf.AcroFields; import com.itextpdf.text.pdf.AcroFields.Item; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import com.itextpdf.text.pdf.PdfWriter; /** * 根据pdf模版动态生成pdf工具类 */ public class PDFReplaceUtils { 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 * @param fileName * 模版路径 * @param outFileName * 生成pdf路径 * @param map * 动态赋值pdf文本域名称和值 * @throws IOException * @throws DocumentException */ public static void pdf(String fileName, String outFileName, Map<String, String> map) throws IOException, DocumentException { PdfReader reader = new PdfReader(fileName); ByteArrayOutputStream bos = new ByteArrayOutputStream(); PdfStamper ps = new PdfStamper(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 = new FileOutputStream(outFileName); fos.write(bos.toByteArray()); fos.flush(); fos.close(); bos.close(); reader.close(); } /** * 创建pdf表格 * * @ * @date 2017年11月5日 下午8:48:07 * @param fileName * 表格名称 * @param columnNum * 列数 * @param lists * 单元格内容 * @throws DocumentException * @throws IOException */ public static void createPdfTable(String fileName, int columnNum, List<Map<String, String>> lists) throws DocumentException, IOException { Document document = new Document(PageSize.A4); PdfWriter.getInstance(document, new FileOutputStream(fileName)); document.open(); PdfPTable table = new PdfPTable(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 = new Phrase(maps.getValue(), chinese); cell = new PdfPCell(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 * @param fileList * 要合并的pdf集合 * @param newFile * 新文件 * @param isDelete * 是否删除参与合并的pdf文件 * @param numFileName * 将新pdf文件名改为 第几个 参与合并pdf名 * @throws DocumentException * @throws IOException */ public static void mergePdfFiles(List<String> fileList, String newFile, Boolean isDelete, Integer numFileName) throws DocumentException, IOException { PdfReader[] readers = new PdfReader[fileList.size()]; readers[0] = new PdfReader(fileList.get(0)); PdfStamper stamp = new PdfStamper(readers[0], new FileOutputStream(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) { new File(file).delete(); } } if (numFileName != null && numFileName > 0) { // 将新文件名改为第N个文件的路径 File modifyFileName = new File(newFile); modifyFileName.renameTo(new File(fileList.get(numFileName - 1))); } } /** * 富文本生成pdf文件 * * @param context * html格式文本数据 * @param outputFile * 输出pdf文件的路径 * @return * @throws Exception */ public static boolean convertHtmlToPdf(String context, String outputFile,String fontPath) throws Exception { OutputStream os = new FileOutputStream(outputFile); ITextRenderer renderer = new ITextRenderer(); 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) throws IOException, 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(); // } } }