背景:前天遇到一个问题,本来使用的程序pdf转图片,没有问题,突然出现pdf转图片出现乱码,不全的问题。
解决方案一:使用spire.pdf.jar包,免费版会出现水印,效率不高,但转换图片稳定。
//maven仓库下载地址
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>http://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependency>
<groupId> e-iceblue </groupId>
<artifactId>spire.pdf</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf.free</artifactId>
<version>2.6.3</version>
</dependency>
自己封装的工具类
import com.spire.pdf.PdfDocument;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Iterator;
public class Pdf2Imges {
/**
* 截图
* @param input 原图片
* @param out 最终图片
* @param x 起始x坐标
* @param y 起始y坐标
* @throws IOException
*/
public static void cutPNG(InputStream input, OutputStream out , int x, int y) throws IOException {
ImageInputStream imageStream = null;
try {
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("png");
ImageReader reader = readers.next();
imageStream = ImageIO.createImageInputStream(input);
reader.setInput(imageStream, true);
ImageReadParam param = reader.getDefaultReadParam();
Rectangle rect = new Rectangle(x, y, reader.getWidth(0), reader.getHeight(0)-y);
param.setSourceRegion(rect);
BufferedImage bi = reader.read(0, param);
ImageIO.write(bi, "png", out);
}finally {
imageStream.close();
}
}
/**
* 将pdf转成图片
* @param fileAddress 文件地址
* @param filename 文件名
* @param type 图片类型
* @throws IOException
*/
public static void pdfToPng(String fileAddress, String filename, String type) throws IOException {
//加载PDF文件
PdfDocument doc = new PdfDocument();
doc.loadFromFile(fileAddress+"\\"+filename+".pdf");
//保存PDF的每一页到图片
BufferedImage image;
for (int i = 0; i < doc.getPages().getCount(); i++) {
//此方法效率慢
image = doc.saveAsImage(i);
//方案二:将水印同背景化
//将水印同背景颜色化
int rgb = image.getRGB(20,5);
for(int y=0; y<21; y++){
for(int x=30; x<680; x++){
image.setRGB(x,y,rgb);
}
}
File file = new File(fileAddress+"\\"+filename+"_"+(i+1)+"."+type);
ImageIO.write(image, type, file);
//方案一:将水印部分截取掉
// Pdf2Imges.cutPNG(new FileInputStream(fileAddress+"\\"+filename+"_"+(i+1)+"."+type),
// new FileOutputStream(fileAddress+"\\"+filename+"-"+(i+1)+"."+type),0,20);
//file.delete();
}
doc.close();
}
public static void main(String[] ags) throws IOException {
String fileAddress = "文件地址";
String filename = "文件名";
String type = "图片类型";
Pdf2Imges.pdfToPng(fileAddress,filename,type);
}
}
方案二:下载xpdf工具,使用该工具进行pdf转图片,效率高,效果好,推荐使用(后续会写一篇关于这个的)
https://blog.csdn.net/BluerCat/article/details/107855588