文档章节

Java通过模板生成PDF再转换为图片

醉美閑聖
 醉美閑聖
发布于 09/16 19:20
字数 992
阅读 22
收藏 0

1、添加maven依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.1</version>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.16</version>
</dependency>

2.1、通过模板生成PDF文件

package com.hlwl.common.util;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.apache.commons.lang3.RandomUtils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * PDF工具类
 * @class com.hlwl.common.util.PdfUtil.java
 * @author happyran
 * @since 2019-09-09 09:09
 */
public class PdfUtil {
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");

    /**
     * 根据模板生成PDF
     * @param tempPdfPath
     * @param data
     */
    public static void createPdf(String tempPdfPath, Map<String, Object> data){
        //填充创建pdf
        PdfReader reader = null;
        PdfStamper stamp = null;
        try {
            //创建生成报告名称
            if (!new File(tempPdfPath).exists()) {
                new File(tempPdfPath).mkdirs();
            }

            File deskFile = new File(tempPdfPath, sdf.format(new Date()) + RandomUtils.nextInt(1000,9999) + ".pdf");

            reader = new PdfReader("D:\\pdfTest\\a.pdf");
            stamp = new PdfStamper(reader, new FileOutputStream(deskFile));

            // 取出报表模板中的所有字段
            AcroFields form = stamp.getAcroFields();
            BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            form.addSubstitutionFont(bf);
            // 填充数据
            form.setField("name", data.get("name").toString());
            form.setField("sex", data.get("sex").toString());
            form.setField("age", data.get("age").toString());
            form.setField("generationdate", data.get("generationdate").toString()); //报告生成日期

            stamp.setFormFlattening(true);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stamp != null) {
                try {
                    stamp.close();
                } catch (DocumentException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (reader != null) {
                reader.close();
            }
        }
    }

    // 利用模板生成pdf
    public static void pdfout(Map<String,Object> o) {
        // 模板路径
        String templatePath = "d:/pdfTest/b.pdf";
        // 生成的新文件路径
        String newPDFPath = "d:/pdfTest/b" + sdf.format(new Date()) + ".pdf";

        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {
            BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            Font FontChinese = new Font(bf, 5, Font.NORMAL);
            out = new FileOutputStream(newPDFPath);// 输出流
            reader = new PdfReader(templatePath);// 读取pdf模板
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();

            // 文字类的内容处理
            Map<String,String> datemap = (Map<String,String>)o.get("datemap");
            form.addSubstitutionFont(bf);
            for(String key : datemap.keySet()){
                form.setField(key,datemap.get(key));
            }

            // 图片类的内容处理
            Map<String,String> imgmap = (Map<String,String>)o.get("imgmap");
            for(String key : imgmap.keySet()) {
                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(imgmap.get(key));
                //获取图片页面
                PdfContentByte under = stamper.getOverContent(pageNo);
                //图片大小自适应
                image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                //添加图片
                image.setAbsolutePosition(x, y);
                under.addImage(image);
            }

            stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
            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);
        }
    }

    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Map<String, Object> data = new HashMap<>();
        data.put("name","zhangsan");
        data.put("sex","男");
        data.put("age","15");
        data.put("generationdate",sdf.format(new Date()));
        createPdf("D:\\pdfTest\\",data);

//        Map<String,String> map = new HashMap();
//        map.put("name","张三");
//        map.put("creatdate","2018年1月1日");
//        map.put("weather","晴朗");
//        map.put("sports","打羽毛球");
//
//        Map<String,String> map2 = new HashMap();
//        map2.put("img","D:\\pdfTest\\1.jpg");
//
//        Map<String,Object> o=new HashMap();
//        o.put("datemap",map);
//        o.put("imgmap",map2);
//        pdfout(o);
    }
}

2.2、将PDF转为图片

package com.hlwl.common.util;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

/**
 * PDF转图片工具类
 * @class com.hlwl.common.util.Pdf2ImgUtil.java
 * @author happyran
 * @since 2019-09-09 09:09
 */
public class Pdf2ImgUtil {
    //可自由确定起始页和终止页
    public static void pdf2png(String fileAddress,String filename,int indexOfStart,int indexOfEnd) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress+"\\"+filename+".pdf");
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = indexOfStart; i < indexOfEnd; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, "PNG", new File(fileAddress+"\\"+filename+"_"+(i+1)+".png"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //转换全部的pdf
    public static void pdf2png(String fileAddress,String filename) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress+"\\"+filename+".pdf");
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, "PNG", new File(fileAddress+"\\"+filename+"_"+(i+1)+".png"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入需要转换的pdf的地址,例如 E:\\软件\\代码:");
        String fileAddress = sc.nextLine();
        System.out.println("请输入需要转换的pdf的名称,不要加.pdf后缀,例如 操作系统概念:");
        String filename =sc.nextLine();
        System.out.println("请输入开始转换的页码,从0开始,例如 5:");
        int indexOfStart=sc.nextInt();
        System.out.println("请输入停止转换的页码,-1为全部,例如 10:");
        int indexOfEnd=sc.nextInt();
        if (indexOfEnd==-1) {
            pdf2png(fileAddress, filename);
        }
        else {
            pdf2png(fileAddress, filename, indexOfStart, indexOfEnd);
        }
    }
}

 

© 著作权归作者所有

醉美閑聖
粉丝 1
博文 72
码字总数 140483
作品 0
海淀
架构师
私信 提问
Aspose.Pdf for Java 3.3.0 发布

Aspose.Pdf for Java 3.3.0 改进和增强了 XML 到 PDF 的转换功能;基于 ImageIO 重写图像转换引擎,支持更多图片格式以及优化图像的操作;修复了图片到 PDF 转换的问题等等。 Aspose.Pdf 是一...

oschina
2012/10/19
487
0
示例演示:Aspose.PDF for Java最新版v19.8新功能——在标记PDF中实现表格支持

Aspose.PDF for Java是一种快速,轻量级的PDF处理控件,无需使用Adobe Acrobat即可生成,修改,转换,渲染,保护和打印PDF文档。同时支持使用PDF,XFA,TXT,HTML,PCL,XML,XPS和图像文件格...

mnrssj
09/05
16
0
SpringMVC使用iReport生成pdf

1.要生成pdf首先需要通过iReport生成pdf模板,详情自行百度。 2.生成pdf模板之后,将.jrxml和.jasper文件放在java项目的某个文件夹中。.jrxml文件是可编辑的文件,.jasper文件不可编辑。 3....

大河向东流啊
2017/08/15
738
2
支持多页PDF转换为单个SVG的PDF文档管理工具Spire.PDF for Java v2.9.1上线啦!

Spire.PDF for Java(点击下载)是一款专门对 PDF 文档进行操作的 Java 类库。该类库的主要功能在于帮助开发人员在 Java 应用程序(J2SE和J2EE)中生成 PDF 文档和操作现有 PDF 文档,并且运...

mnrssj
10/09
8
0
GrapeCity Documents for Excel 文档API组件 V2.2 新特性介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/powertoolsteam/article/details/96150843 GrapeCity Documents for ...

powertoolsteam
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
12
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部