• java根据pdf模版动态生成pdf


    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();
    //         }
        }
    }
    爱生活,更爱给我带来生活的人
  • 相关阅读:
    C#实现任意源组播与特定源组播
    张灵甫此人性格偏激,赌性重,喜欢冒险,做事不留后路,更适合担任中下层军官(要自己掌控着自己的命运)
    Delphi 中 断言 Assert 用法
    桌面程序阻止Windows关机(使用Message.Result取得DefWindowProc API函数的返回值,非常重要)
    Asp.net vnext的IIS部署
    Asp.net vNext 学习3
    EasyUI的后台界面
    C#框架
    前端分离规范
    AngularJS html5Mode与ASP.NET MVC路由
  • 原文地址:https://www.cnblogs.com/chenyq/p/7807857.html
Copyright © 2020-2023  润新知