接到任务是提取pdf图片修改并把修改后的图片放入pdf原来的位置。
经过2天的不断试验终于找到方法了。
1、使用pdfbox分析图片
2、在分析每个page的时候,对每个page元素做如下处理:
PDResources res = page.findResources();
// 获取页面图片信息
Map<String, PDXObjectImage> imgs = res.getImages();
imgs就是page中所有的图片。
3、修改imgs重新设置到res中,再重新设置page,如下:
res.setXObjects(newImgs);
page.setResources(res);
4、把page添加到新的document中
PDDocument newDcoument = new PDDocument();
newDcoument.addPage(page);
5、document保存
newDcoument.save(pdf保存文件名)
注意:
1、新的图片对象创建需要下面的方法,这样在document保存的时候才不会出现空指针错误。
PDXObjectImage image = new PDJpeg(newDcoument, new FileInputStream(imgPathBak));
2、图片颜色问题会影响pdf所以要用旧的img对象信息覆盖新的默认信息。
new FileInputStream(imgPathBak));
image.setStencilColor(img.getStencilColor());
image.setBitsPerComponent(img.getBitsPerComponent());
// 如果原本PDF图片是ICC_ColorSpace需要重新设定,否则不用
if (java.awt.color.ICC_ColorSpace.class.getName() .equals(img.getColorSpace()
.getJavaColorSpace().getClass().getName())) {
image.setColorSpace(img.getColorSpace());
}
image.setHeight(img.getHeight());
image.setWidth(img.getWidth());
image.setMetadata(img.getMetadata());
newImgs.put((String) obj, image);
img是从pdf读取的图片对象,image是修改后的图片对象。
经过测试是可以修改图片的,但是对pdfbox解析和修改pdf还未研究透。