PDF和图片互转,图片转pdf(一)

105 阅读1分钟

为了防止数据被复制使用,将数据生成图片,供用户使用,这里做一下总计:

pom.xml

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>fontbox</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.1.7</version>
</dependency>

核心代码逻辑:

package com.yfhx.tools;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import sun.misc.BASE64Decoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.List;

/**
 * 图片合并为pdf文档工具类
 */
public class Image2Pdf {

    /**
     * 使用pdfbox将图片转成pdf
     *
     * @param imageFilePaths 图片文件路径
     * @param pdfFilePath    pdf文件存储路径
     * @param rootPath       文件存储根目录
     * @return 新pdf文件的路径
     * @throws IOException IOException
     */
    public static String image2Pdf(String imageFilePaths, String pdfFilePath, String rootPath) throws IOException {
        PDDocument pdDocument = new PDDocument();

        //去除null
        if (rootPath == null) rootPath = "";

        String[] pngPathArr = imageFilePaths.split(",");
        InputStream pngStream = null;
        PDPageContentStream contentStream = null;
        for (int i = 0; i < pngPathArr.length; i++) {
            //图片文件数据转换为图片对象数据
            String pngPath = pngPathArr[i];
            File pngFile = new File(rootPath + pngPath);
            pngStream = new FileInputStream(pngFile);
            BufferedImage image = ImageIO.read(pngStream);

            //图片格式化为 pdf文档页面
            PDPage pdPage = new PDPage(new PDRectangle(image.getWidth(), image.getHeight()));
            pdDocument.addPage(pdPage);

            //输出为pdf数据
            contentStream = new PDPageContentStream(pdDocument, pdPage);
            PDImageXObject pdImageXObject = LosslessFactory.createFromImage(pdDocument, image);
            contentStream.drawImage(pdImageXObject, 0, 0, image.getWidth(), image.getHeight());
            contentStream.close();
            pngStream.close();
        }
        pdDocument.save(rootPath + pdfFilePath);
        pdDocument.close();
        return rootPath + pdfFilePath;
    }

    /*---------------------------------------- 华 丽 的 分 割 线 ----------------------------------------*/

    public static void base64DecoderImage2Pdf(List<String> base64Decoder, OutputStream outputStream) throws IOException {
        PDDocument pdDocument = new PDDocument();

        PDPageContentStream contentStream = null;
        ByteArrayInputStream byteIn = null;

        for (int i = 0; i < base64Decoder.size(); i++) {
            //base64Decoder 解析为图片
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] decoderBytes = decoder.decodeBuffer(base64Decoder.get(i).split(",")[1]);
            byteIn = new ByteArrayInputStream(decoderBytes);    //将b作为输入流;
            BufferedImage image = ImageIO.read(byteIn);

            //图片格式化为 pdf文档页面
            PDPage pdPage = new PDPage(new PDRectangle(image.getWidth(), image.getHeight()));
            pdDocument.addPage(pdPage);

            //输出为pdf数据
            contentStream = new PDPageContentStream(pdDocument, pdPage);
            PDImageXObject pdImageXObject = LosslessFactory.createFromImage(pdDocument, image);
            contentStream.drawImage(pdImageXObject, 0, 0, image.getWidth(), image.getHeight());

            //
            contentStream.close();
            byteIn.close();
        }
        //保存文件 或则 字节流
        //pdDocument.save(filename);
        pdDocument.save(outputStream);
        pdDocument.close();
    }


}