java - iText 7提取的图像得到黑色背景
问题描述
我正在尝试从 PDF 中提取图像,并自定义ILocationExtractionStrategy
处理文本、形状和图像以及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, 0, 0, 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, 0, 0, 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);
}
解决方案
推荐阅读
- c# - 时间:2019-05-10 标签:c#application don't send requests without fiddler
- java - Java - JSON字符串操作期间的OutOfMemoryError
- python - login_required 和注销在 django 中不起作用
- node.js - 想要使用 axios 将 JWT 令牌与数据一起发送到标头中,但收到此错误:在将标头发送到客户端后无法设置标头
- php - 我怎样才能使两个数组的长度彼此相似?
- foursquare - 显示foursque场所图像作为图像响应
- python - 如何使用 selenium 和 python 按 Alt F4
- c - 无法创建 for 循环来查找二维数组中的数组元素
- c# - 如何在没有项目或任何其他补充文件的情况下为引用的 .NET 程序集获取 IntelliSense?
- javascript - GotJS - 获取响应属性和 JSON 正文