首页 > 解决方案 > 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);
    }

标签: javapdfitext7

解决方案


推荐阅读