如何使用/ ASCIIHexDecode

时间:2017-11-03 17:19:19

标签: c# itext invalidargumentexception pdfobject

我尝试使用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

1 个答案:

答案 0 :(得分:0)

不深入您的代码示例,有一些PDF过滤器的替代实现,特别是一个非常简单的实现是以下PDFSharp - AsciiHexDecode.cs。希望它有所帮助,因为替换Adds a transform, such as an audio or video effect, to a stream.中实现的编码器和解码器应该是直截了当的,并且应该允许验证数据是否已损坏或者解码器/编码器之一是否存在错误。不幸的是,在撰写本文时,How create Source Reader还没有任何示例。

iTextSharp