Pdf iTextSharp透明图像提取

Pdf iTextSharp透明图像提取,pdf,itextsharp,itext,Pdf,Itextsharp,Itext,我正在使用iTextSharp并试图从PDF中提取具有透明度的图像。当我提取图像时,透明度变为纯黑色并丢失。我发现了多个图像提取的例子,但它们似乎都有相同的问题。下面是我正在使用的代码 另一个例子来自itextpdf.com/examples/iia.php?id=284。此示例包括顶部“结果”部分中的图像。如果单击,您将在图像中看到黑色边框,但是在页面底部有一个指向原始图像的链接,该链接显示了其应有的透明度。这正是我遇到的问题。任何帮助或想法都将不胜感激 public void Extract

我正在使用iTextSharp并试图从PDF中提取具有透明度的图像。当我提取图像时,透明度变为纯黑色并丢失。我发现了多个图像提取的例子,但它们似乎都有相同的问题。下面是我正在使用的代码

另一个例子来自itextpdf.com/examples/iia.php?id=284。此示例包括顶部“结果”部分中的图像。如果单击,您将在图像中看到黑色边框,但是在页面底部有一个指向原始图像的链接,该链接显示了其应有的透明度。这正是我遇到的问题。任何帮助或想法都将不胜感激

public void ExtractImage(string pdfFile)
        {
            const int pageNumber = 1; //Page number to extract the image from
            PdfReader pdf = new PdfReader(pdfFile);
            PdfDictionary pg = pdf.GetPageN(pageNumber);
            PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
            PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
            foreach (PdfName name in xobj.Keys)
            {
                PdfObject obj = xobj.Get(name);
                if (obj.IsIndirect())
                {
                    PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
                    string width = tg.Get(PdfName.WIDTH).ToString();
                    string height = tg.Get(PdfName.HEIGHT).ToString();
                    ImageRenderInfo imgRI =
                            ImageRenderInfo.CreateForXObject(new Matrix(float.Parse(width), float.Parse(height)),
                                                             (PRIndirectReference)obj, tg);

                    var fileType= imgRI.GetImage().GetFileType();
                    RenderImage(imgRI, imgPath + +imgRI.GetRef().Number + "_" + imgRI.GetRef().Generation + "test." + fileType);
                }
            }
            pdf.Close();
        }

        private void RenderImage(ImageRenderInfo renderInfo, string saveImageLocation)
        {
            PdfImageObject image = renderInfo.GetImage();

            using (var dotnetImg = image.GetDrawingImage())
            {
                if (dotnetImg != null)
                {
                    dotnetImg.Save(saveImageLocation);
                }
            }
        }

请阅读PDF规范(ISO-32000-1)。您假设,例如,一个透明的PNG,可以作为一个透明的PNG存储在PDF中。这种假设是错误的

PDF中不支持图像类型PNG。将透明PNG添加到PDF文档时,它将转换为两个压缩位图。一个位图就是您所指的图像:据称失去透明度的图像。另一个位图,一个你没有告诉我们任何关于它的图像,但是它就是这个图像的一个遮罩。当您检查图像XObject时,您会注意到它引用了这个掩码。我在第10.3.2节“掩蔽图像”中对此进行了解释


你声称你的PDF文档中存储了一个透明图像是错误的。相反,您有两个不透明图像,其中一个图像是另一个的遮罩,以实现透明度。不能将这些图像提取为单个透明图像。您需要提取两个不透明图像并将它们合并为一个透明图像。这超出了iText(Sharp)的范围。

一个快速的解决方案可能是购买或找到一些不需要你睡觉时枕头下放着PDF规范的东西,否则你应该按照Bruno的回答去做。我有你的书,并且用了很多来帮助我的开发。我的想法是,既然支持.png,它支持透明性,我就认为也支持透明性。感谢您的输入,在合并两幅图像后,我能够达到预期的效果。