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();
//         }
    }
}

 

posted @ 2017-11-09 09:34  青城杂文录  阅读(1771)  评论(0编辑  收藏  举报