各种转PDF

package com.cinc.messageservice.message.mail.util;
import com.cinc.messageservice.utils.EmptyUtils;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.styledxmlparser.css.media.MediaDeviceDescription;
import com.itextpdf.styledxmlparser.css.media.MediaType;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;

import java.io.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: hhr
 * @Despriction:
 * @CreatedTime: 2020/3/12 16:39
 * @ModifyBy:
 * @ModifyTime:
 * @ModifyDespriction:
 * @Version: V1.0.0
 */
public class PdfUtil {
    //默认中文字体
    private static final String FONT = "C:\Windows\Fonts\simhei.ttf";

    /**
     * 根据模板将数据输出pdf文件
     * @param tagetPath
     * @param templatePath
     * @param dataMap
     * @param imageMap
     * @throws Exception
     */
    public static void templeteToPdf(String tagetPath, String templatePath, Map<String, Object> dataMap, Map<String, Object> imageMap) throws Exception {
        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {
            BaseFont bf = BaseFont.createFont(FONT , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            Font fontChinese = new Font(bf, 5, Font.NORMAL);
            out = new FileOutputStream(tagetPath);// 输出流
            reader = new PdfReader(templatePath);// 读取pdf模板
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            //文字类的内容处理
            form.addSubstitutionFont(bf);
            if (!EmptyUtils.isMapEmpty(dataMap)){
                for(String key : dataMap.keySet()){
                    String value = (String)dataMap.get(key);
                    form.setField(key,value);
                }
            }
            //图片类的内容处理
            if (!EmptyUtils.isMapEmpty(imageMap)){
                for(String key : imageMap.keySet()) {
                    String value = (String)imageMap.get(key);
                    String imgpath = value;
                    int pageNo = form.getFieldPositions(key).get(0).page;
                    Rectangle signRect = form.getFieldPositions(key).get(0).position;
                    float x = signRect.getLeft();
                    float y = signRect.getBottom();
                    //根据路径读取图片
                    Image image = Image.getInstance(imgpath);
                    //获取图片页面
                    PdfContentByte under = stamper.getOverContent(pageNo);
                    //图片大小自适应
                    image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                    //添加图片
                    image.setAbsolutePosition(x, y);
                    under.addImage(image);
                }
            }
            // 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
            stamper.setFormFlattening(true);
            stamper.close();
            Document doc = new Document();
            Font font = new Font(bf, 32);
            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(e);
        } catch (DocumentException e) {
            System.out.println(e);
        }
    }

    /**
     * html转pdf
     * @param sourcePath
     * @param tagetPath
     * @param pageSize
     * @param baseuri
     * @throws Exception
     */
    public static void htmlToPdf(String sourcePath, String tagetPath, PageSize pageSize, String baseuri) throws Exception {

        PdfWriter writer = new PdfWriter(tagetPath);
        PdfDocument pdfDocument = new PdfDocument(writer);

        pdfDocument.setTagged();
        //设置页面大小
        pdfDocument.setDefaultPageSize(pageSize);
        ConverterProperties converterProperties = new ConverterProperties();
        converterProperties.setBaseUri(baseuri);

        MediaDeviceDescription mediaDeviceDescription = new MediaDeviceDescription(MediaType.SCREEN);
        mediaDeviceDescription.setWidth(pageSize.getWidth());
        converterProperties.setMediaDeviceDescription(mediaDeviceDescription);

        URL url = new URL(sourcePath);
        InputStream inputStream = url.openStream();
        //InputStream inputStream = new FileInputStream(sourcePath);
        HtmlConverter.convertToPdf(inputStream, pdfDocument, converterProperties);
        inputStream.close();
    }

    /**
     * 对图片转pdf
     * @param picturePath
     * @param os
     */
    public static void imageToPDF(String picturePath, OutputStream os) {
        try {
            Document document = new Document(com.itextpdf.text.PageSize.A4);
            com.itextpdf.text.pdf.PdfWriter.getInstance(document, os);
            document.open();
            //重新设置宽高
            Image image = Image.getInstance(picturePath);
            float documentWidth = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin();
            float documentHeight = documentWidth / 580 * 320;
            image.scaleAbsolute(documentWidth, documentHeight);
            document.add(image);
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * txt文件转pdf文件
     * @param text
     * @param os
     * @throws DocumentException
     * @throws IOException
     */
    public static void textToPDF(String text,  OutputStream os) throws DocumentException, IOException {
        Document document = new Document();
        com.itextpdf.text.pdf.PdfWriter.getInstance(document, os);
        document.open();
        //方法一:使用Windows系统字体(TrueType)
        BaseFont baseFont = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        Font font = new Font(baseFont);
        InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(text)), "GBK");
        BufferedReader bufferedReader = new BufferedReader(isr);String str = "";
        while ((str = bufferedReader.readLine()) != null) {
           document.add(new Paragraph(str,font));
        }
        document.close();
}

    public static void main(String[] args) throws Exception{

       /* HashMap<String, Object> dataMap = new HashMap<>();
        HashMap<String,Object> imageMap = new HashMap<>();
        imageMap.put("image", "E:\aaa\11.jpg");
        dataMap.put("name", "测试Test");
        dataMap.put("projectName", "西山采购项目");
        dataMap.put("stock", "前山库房");
        dataMap.put("code", "001");
        dataMap.put("fill_4", "水浒");
        dataMap.put("fill_5", "1");
        dataMap.put("fill_6", "1");
        dataMap.put("fill_7", "1");
        dataMap.put("fill_8", "2");
        dataMap.put("fill_9", "11");
        dataMap.put("fill_10", "12");

        templeteToPdf("E:\aaa\tp.pdf","E:\aaa\toPDF.pdf",dataMap, imageMap);

        String image = "E:\aaa\aa.txt";
        OutputStream os = new FileOutputStream("E:\aaa\b.pdf");*/
        htmlToPdf("https://wenku.baidu.com/view/6f1509a5d0f34693daef5ef7ba0d4a7303766c5b.html?rec_flag=default",  "E:\aaa\p.pdf", PageSize.A2, "https://blog.csdn.net/erlian1992/article/details/82631290");
    }
}

    /**
     * 用于中文显示的Provider
     */
    class AsianFontProvider extends XMLWorkerFontProvider {
        @Override
        public Font getFont(final String fontname, String encoding, float size, final int style) {
            try {
                BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                return new Font(bfChinese, size, style);
            } catch (Exception e) {

            }
            return super.getFont(fontname, encoding, size, style);
    }

}

  

dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>html2pdf</artifactId>
            <version>2.1.5</version>
        </dependency>

  模板生成pdf文件时,需要用Adobe Acrobat DC工具编辑模板

原文地址:https://www.cnblogs.com/HHR-SUN/p/12597488.html