Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
itextsharp 5.4.4-GetDrawingImage以错误的方式解码此图像-为什么?_Image_Pdf_Itext_Extract - Fatal编程技术网

itextsharp 5.4.4-GetDrawingImage以错误的方式解码此图像-为什么?

itextsharp 5.4.4-GetDrawingImage以错误的方式解码此图像-为什么?,image,pdf,itext,extract,Image,Pdf,Itext,Extract,这在我的Firefox上显示得非常好,但是在我使用itextsharp5.4.4编写的C#程序中,我使用了PdfImageObject的GetDrawingImage方法,得到了一张抓取的图像 我使用itextsharp的方式如下: PdfReader reader = new PdfReader(filename); PdfReaderContentParser parser = new PdfReaderContentParser(reader); ImageRenderListener l

这在我的Firefox上显示得非常好,但是在我使用
itextsharp
5.4.4编写的
C#
程序中,我使用了
PdfImageObject
GetDrawingImage
方法,得到了一张抓取的图像

我使用itextsharp的方式如下:

PdfReader reader = new PdfReader(filename);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
ImageRenderListener listener = new ImageRenderListener();
parser.ProcessContent(pageNumber, listener);
    public void RenderImage(ImageRenderInfo renderInfo)
    {
        PdfImageObject image = renderInfo.GetImage();

        PdfObject obj = image.Get(PdfName.FILTER);

        PdfName filter = null;

        if (obj is PdfName)
        {
            filter = (PdfName)obj;
        }
        else if (obj is PdfArray)
        {
            foreach(var o in (PdfArray)obj)
            {
                if (o is PdfName)
                {
                    filter = o as PdfName;
                    break;
                }
            }
        }

        if (filter != null)
        {
            System.Drawing.Image drawingImage = image.GetDrawingImage();
...
...
...
        }
其中,
ImageRenderListener
是一个
IRenderListener
,它通过以下方式实现
RenderImage
方法:

PdfReader reader = new PdfReader(filename);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
ImageRenderListener listener = new ImageRenderListener();
parser.ProcessContent(pageNumber, listener);
    public void RenderImage(ImageRenderInfo renderInfo)
    {
        PdfImageObject image = renderInfo.GetImage();

        PdfObject obj = image.Get(PdfName.FILTER);

        PdfName filter = null;

        if (obj is PdfName)
        {
            filter = (PdfName)obj;
        }
        else if (obj is PdfArray)
        {
            foreach(var o in (PdfArray)obj)
            {
                if (o is PdfName)
                {
                    filter = o as PdfName;
                    break;
                }
            }
        }

        if (filter != null)
        {
            System.Drawing.Image drawingImage = image.GetDrawingImage();
...
...
...
        }
绘图图像存储在监听器中,然后绘制到屏幕等


我试图理解这一点,我发现过滤器是一个
/CCITTFaxDecode
,但
streamContentType
在某种程度上是一个
png
,有人能告诉我这个问题吗?

下面的视频解释了这个问题的原因:。如果你不想坐在那里看完整的视频,快进到第24分钟,然后看到第27分钟。请注意第27分钟的结论:一般来说,PDF中没有图像。(这有点夸张,但如果你理解了3分钟的解释,你就理解了马克·斯蒂芬斯的意思。)


如果您想了解为什么CCITTFaxDecode更改为PNG的详细信息,请阅读的第10章。

过滤器是一个/CCITTFaxDecode,但是
streamContentType
在某种程度上是一个PNG-iText图像提取结果将是PNG或tiff,具体取决于图像的颜色深度,参见
PdfImageObject.decodeImageBytes
的文档;也就是说,iText(或图像数据)中似乎存在问题,因为在我的测试设置中,您的PDF的png结果看起来已损坏。@mkl thanx为了解释,无论如何,我的目的是问为什么iTextSharp使此PDF看起来已损坏,当使用其他工具时,它看起来很好…这篇演讲非常有助于理解PDF中的图像确实是一个复杂的主题(是的,没有图像:-)),但我仍然不理解为什么我给出的示例PDF在iText中看起来是不完整的…我试着挖掘iTextSharp的代码,以找到为什么会发生这种情况,到目前为止,我还不知道为什么,我怀疑1D T4解码中有一个bug,我暂时通过了这个,在
TiffWriter
类的帮助下,我真的很想知道,但我的时间有限。。。无论如何,谢谢你的这个伟大的库…也谢谢你强大的库。我对/ccitttfax解码图像也有类似的问题。我将它们压缩了2次(作为*.png,使用FreeImage lib),将其保存到文件系统并进行检查。但是,当我要使用stamper.Writer.AddDirectImageSimple()将压缩图像插入回PDF时(之前称为KillInderect()),生成的压缩PDF文件大小几乎保持不变。顺便说一下,我调试了ITextSharp源代码,但仍然找不到根本原因。。。