iTextSharp를 사용하여 PDF 파일에서 이미지를 추출하려고합니다./ASCIIHexDecode로 이미지를 디코딩하는 방법
이 프로세스는 대부분의 PDF 파일에서 작동하지만 일부 파일에서는 실패합니다.
특히, 실패한 PDF는 필터 /ASCIIHexDecode
및 /CCITTFaxDecode
의 이미지가 있음을 확인했습니다.
이 필터로 이미지를 디코딩하는 방법은 무엇입니까? 여기에 문제를 일으키는 샘플 PDF입니다 :
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
참고로, 내 이미지 추출 루틴 (pg
객체가 PdfReader.GetPageN
를 사용하여 얻을입니다)입니다 : test.pdf
예외가 발생한 pdf를 공유하십시오. – mkl
실제 오류 코드가 누락 된 재현 코드와 문제를 일으키는 샘플 PDF를 업데이트했습니다. –
샘플 파일에 ** ASCIIHexDecode ** 필터가 포함 된 스트림이 없습니다. Jacek Blaszczynski와 같은 필터에 집중할 수있는 사람들을 오해 할 수 있으므로 질문 제목에서이를 편집 할 수 있습니다. – mkl