【问题标题】:iTextSharp Image Extraction with Transparency具有透明度的 iTextSharp 图像提取
【发布时间】:2013-12-27 17:54:52
【问题描述】:

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

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

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 规范睡觉的东西,否则您应该遵循 Bruno 的回答。

标签: pdf itextsharp itext


【解决方案1】:

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

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

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

【讨论】:

  • 我有你的书,并且经常使用它来帮助我的发展。我的想法是,因为支持透明度的 .png 是受支持的,所以我假设也支持透明度。感谢您的意见,合并两张图片后,我能够达到预期的效果。
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 2012-03-06
  • 2019-05-18
  • 2015-05-15
  • 2017-12-18
相关资源
最近更新 更多