我尝试使用iTextSharp从PDF文件中提取图像。
这个过程适用于我所拥有的大部分PDF文件,但却失败了。
特别是,我观察到PDF失败的图像包含过滤器/ASCIIHexDecode
和/CCITTFaxDecode
。
如何使用此过滤器解码图像?
仅供参考,我的图像提取例程是(pg
对象使用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
答案 0 :(得分:0)
不深入您的代码示例,有一些PDF过滤器的替代实现,特别是一个非常简单的实现是以下PDFSharp - AsciiHexDecode.cs。希望它有所帮助,因为替换Adds a transform, such as an audio or video effect, to a stream.
中实现的编码器和解码器应该是直截了当的,并且应该允许验证数据是否已损坏或者解码器/编码器之一是否存在错误。不幸的是,在撰写本文时,How create Source Reader
还没有任何示例。
iTextSharp