事情起因是这样的因工作需要需要识别pdf文件内容,但是偶尔会出现识别问题,最终发现是水印遮挡问题,这边特别记录一下解决方法,网上找了很多去水印的方法但是大多数都是spire.pdf的,确实去水印效果很好但是项目运行中会产生无法识别区域设置的问题,然找不到报错原因最终放弃,后面发现了另外一种解决方法,使用pdfbox。
1、引入pdfbox的依赖包
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.22</version>
</dependency>
2、自己写了一个工具类,使用了一个伪删除
image.setHeight(10);
image.setWidth(10);
设置pdf中的图片的长宽,这样虽然图片还是pdf原来的位置但是已经是透明的了。
package com.fjqwkj.commons.utils;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.File;
import java.util.Iterator;
public class DeleteImage {
public static void main(String[] args) {
try{
removalFirstImg("E:\\java\\tomcat\\apache-tomcat-9.0.27\\webapps\\upload\\real_file\\9999.pdf","E:\\java\\tomcat\\apache-tomcat-9.0.27\\webapps\\upload\\real_file\\9990.pdf");
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 去除文件列表里图片的水印并替换
*
* @Param fileList 文件列表
*/
public static void removalFirstImg(String sourPath ,String savePath) throws Exception {
PDDocument document = null;
try {
File file = new File(sourPath);
document = PDDocument.load(file);
PDDocumentCatalog catalog = document.getDocumentCatalog();
for (Object pageObj : catalog.getPages()) {
PDPage page = (PDPage) pageObj;
PDResources resources = page.getResources();
Iterable xobjects = resources.getXObjectNames();
if (xobjects != null) {
Iterator imageIter = xobjects.iterator();
while (imageIter.hasNext()) {
COSName key = (COSName) imageIter.next();
if (resources.isImageXObject(key)) {
PDImageXObject image = (PDImageXObject)resources.getXObject(key);
image.setHeight(10);
image.setWidth(10);
}
}
}
}
document.save(savePath);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(null != document){
document.close();
}
}
}
}