itextsharp 5.4.4-GetDrawingImage以错误的方式解码此图像-为什么?
这在我的Firefox上显示得非常好,但是在我使用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
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源代码,但仍然找不到根本原因。。。