为了防止数据被复制使用,将数据生成图片,供用户使用,这里做一下总计:
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();
}
}