iText 7提取的图像获取黑色背景

问题描述

我正在尝试使用自定义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 (将#修改为@)