将pdf转换成图片在转换回pdf文件
之所有要这么做主要是曲线解决pdf文本内容增加覆盖层后依然可以复制出来的问题。查了不少资料发现通过覆盖层的方式并不能去除原有的文字内容,只是达到了掩耳盗铃的效果而已。于是我们打算将加密后的pdf文件转换成图片在转换会pdf,通过这样的方式达到我们需要的效果。
pdf转图片的过程中遇到了几个问题?
- 图片清晰度问题?
- 图片内容失真问题?
为了解决第一个问题,我在网上查找了不少资料,经过测试发现,以下代码pdf清晰度是解决了,但是却引进了一个新的问题,那就是pdf失真的问题。通过调整缩放比例来提高清晰度,会导致pdf中的文字错位
public static void pdf2Img2Pdf(String pdfPath) {
try {
Document document = new Document();
document.setFile(pdfPath);
float scale = 3.0F;
float rotation = 0F;
List<File> images = new ArrayList<>();
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage bufferedImage = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN, BOUNDARY_CROPBOX, rotation, scale);
bufferedImage.flush();
String imagePath = pdfPath.replace(".pdf", "") + "_" + i + ".jpg";
File file = new File(imagePath);
RenderedImage renderedImage = bufferedImage;
ImageIO.write(renderedImage, "jpg", file);
images.add(file);
}
document.dispose();
PdfUtil.imgMerge2Pdf(images, new File(pdfPath));
} catch (Exception e) {
Logs.error(e.getMessage(), e);
}
}
执行效果如图所示
换了一个方式实现
public static void pdfToImgToPdf(String pdfPath) {
File file = new File(pdfPath);
PDDocument pdDocument;
try {
pdDocument = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(pdDocument);
/* dpi越大转换后越清晰,相对转换速度越慢 */
List<File> files = new ArrayList<>();
for (int i = 0; i < pdDocument.getNumberOfPages(); i++) {
String imagePath = pdfPath.replace(".pdf", "") + "_" + i + ".png";
File dstFile = new File(imagePath);
BufferedImage image = renderer.renderImageWithDPI(i, 300);
ImageIO.write(image, "png", dstFile);
files.add(dstFile);
}
PdfUtil.imgMerge2Pdf(files, new File(pdfPath.replace(".pdf", "_1.pdf")));
System.out.println("PDF文档转PNG图片成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Pdf2Img2PdfUtil.pdfToImgToPdf("D:\\tmp\\11\\ROA-88122492.pdf");
}
这次成功了,pdf文档没有失真。感谢祖国,感谢人民