• 各种转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工具编辑模板

  • 相关阅读:
    [LeetCode] Best Time to Buy and Sell Stock III
    [LeetCode] Implement strStr()
    [LeetCode] Wildcard Matching
    [LeetCode] Gray Code
    [LeetCode] Divide Two Integers
    [LeetCode] Flatten Binary Tree to Linked List
    [LeetCode] Binary Tree Maximum Path Sum
    [TopCoder][SRM] SRM 562 DIV 2
    推荐博客文章
    检测两点所确定直线上的像素坐标
  • 原文地址:https://www.cnblogs.com/HHR-SUN/p/12597488.html
Copyright © 2020-2023  润新知