【发布时间】:2018-04-16 12:10:40
【问题描述】:
我正在尝试使用 iTextSharp 从 PDF 文件中提取图像。
该过程适用于我拥有的大多数 PDF 文件,但其他一些文件失败。
特别是,我观察到失败的 PDF 包含带有过滤器 /ASCIIHexDecode 和 /CCITTFaxDecode 的图像。
如何使用此过滤器解码图像?
仅供参考,我的图像提取例程是(pg object is get using PdfReader.GetPageN):
private static FindImages(PdfReader reader, PdfDictionary pdfPage)
{
var imgPdfObject = FindImageInPDFDictionary(pdfPage);
foreach (var image in imgPdfObject)
{
var xrefIndex = ((PRIndirectReference)image).Number;
var stream = reader.GetPdfObject(xrefIndex);
// Exception occurs here :
var pdfImage = new PdfImageObject((PRStream)stream);
img = (Bitmap)pdfImage.GetDrawingImage();
// Do something with the image
}
}
private static IEnumerable<PdfObject> FindImageInPDFDictionary(PdfDictionary pg)
{
PdfDictionary res =
(PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
PdfDictionary xobj =
(PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
if (xobj != null)
{
foreach (PdfName name in xobj.Keys)
{
PdfObject obj = xobj.Get(name);
if (obj.IsIndirect())
{
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
PdfName type = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
//image at the root of the pdf
if (PdfName.IMAGE.Equals(type))
{
yield return obj;
}// image inside a form
else if (PdfName.FORM.Equals(type))
{
foreach (var nestedObj in FindImageInPDFDictionary(tg))
{
yield return nestedObj;
}
} //image inside a group
else if (PdfName.GROUP.Equals(type))
{
foreach (var nestedObj in FindImageInPDFDictionary(tg))
{
yield return nestedObj;
}
}
}
}
}
}
确切的例外是:
iTextSharp.text.exceptions.InvalidImageException: **Invalid code encountered while decoding 2D group 4 compressed data.**
à iTextSharp.text.pdf.codec.TIFFFaxDecoder.DecodeT6(Byte[] buffer, Byte[] compData, Int32 startX, Int32 height, Int64 tiffT6Options)
à iTextSharp.text.pdf.FilterHandlers.Filter_CCITTFAXDECODE.Decode(Byte[] b, PdfName filterName, PdfObject decodeParams, PdfDictionary streamDictionary)
à iTextSharp.text.pdf.PdfReader.DecodeBytes(Byte[] b, PdfDictionary streamDictionary, IDictionary`2 filterHandlers)
à iTextSharp.text.pdf.parser.PdfImageObject..ctor(PdfDictionary dictionary, Byte[] samples, PdfDictionary colorSpaceDic)
à iTextSharp.text.pdf.parser.PdfImageObject..ctor(PRStream stream)
à MyProject.MyClass.MyMethod(PdfReader reader, PdfDictionary pdfPage) dans c:\\sopmewhere\\PdfProcessor.cs:ligne 161
仅供参考:这是一个导致问题的示例 PDF:test.pdf
【问题讨论】:
-
请分享出现异常的pdf。
-
我更新了缺少实际失败代码的重现代码,以及导致问题的示例 PDF。
-
您的示例文件不包含任何带有 ASCIIHexDecode 过滤器的流。您可能希望从问题标题中编辑此内容,因为它可能会误导人们专注于该过滤器,例如 Jacek Blaszczynski 在他的回答中。
-
我可以重现您的问题,确实 iText 不认为有问题的图像是有效的。不幸的是,我对图像格式没有那么深入,无法判断图像数据是否确实被破坏或 iText 图像解码代码不完整。但是,由于格式是 TIFF 变体,两者都可能是真的。
标签: c# itext invalidargumentexception pdfobject