问题描述
我正在尝试使用自定义的ILocationExtractionStrategy
从PDF中提取图像,以与PdfCanvasProcessor
一起处理文本,形状和图像。关闭源文件后,我需要重用此图像(复制到另一个文档或另存为
PNG文件)。
我正在使用ImageRenderInfo#getimage()#getimageBytes()
中的字节来获取byte[]
。
imageData = ImageDataFactory.create(bytes);
image = new Image(imageData);
pdfCanvas.add(image,rectangle,false);
并另存为PNG:
// Internal function to write bytes to file
FileUtility.writeBytesToFile(path,fileName,bytes);
当我将创建的图像添加到PdfCanvas
或将其另存为PNG时,背景会变成黑色。
编辑:
我设法从文档中提取图像和透明图像。但是,无法将它们合并为一张图像。
我的尝试使我在两个图像中都使用了ImageData
:
ImageData image = ImageDataFactory.create(imageBytes);
ImageData transparency = ImageDataFactory.create(transparencyBytes);
transparency.makeMask();
image.setimageMask(transparency);
当我将图像另存为PDF时,符合预期,但是当我将其另存为PNG时,背景仍然是黑色。
我将透明图像保存为PNG,黑色背景也存在。
编辑: 我成功解决了我的问题。 这是我的提取器中的完整代码:
private void readImage(ImageRenderInfo data) {
try {
BufferedImage inputimage = data.getimage().getBufferedImage();
BufferedImage dest = new BufferedImage(inputimage.getWidth(),inputimage.getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = dest.createGraphics();
graphics.drawImage(inputimage,null);
// Transparency comes as another image in PDF format.
if (data.getimage().getPdfObject().containsKey(PdfName.SMask)) {
// The getRefersTo() initiate the mask image.
PdfObject refersTo = data.getimage().getPdfObject().get(PdfName.SMask).getIndirectReference()
.getRefersTo();
if (refersTo != null && refersTo.isstream()) {
BufferedImage maskImage = new PdfImageXObject((PdfStream) refersTo).getBufferedImage();
java.awt.Image transparency = transformTransparency(maskImage);
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.DST_IN,1.0F);
graphics.setComposite(ac);
graphics.drawImage(transparency,null);
}
}
graphics.dispose();
Image image = new Image(ImageDataFactory.create(dest,null));
// dest and image are Now fully transparent and ready for save.
} catch (IOException e) {
e.printstacktrace();
}
}
/**
* Create transparent background.
* @param image
* @return
*/
private java.awt.Image transformTransparency(BufferedImage image) {
ImageFilter filter = new RGBImageFilter() {
@Override
public final int filterRGB(int x,int y,int rgb) {
return (rgb << 8) & 0xFF000000;
}
};
ImageProducer ip = new FilteredImageSource(image.getSource(),filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)