Можно ли получить структурные элементы из PDF-файла с помощью iTextSharp? - PullRequest
18 голосов
/ 16 февраля 2012

Мы используем iTextSharp с приложением C # WinForms для анализа PDF-файла.Используя iTextSharp, я могу легко извлечь текстовые данные из файла PDF.Предположим, файл PDF содержит изображение, окруженное двумя строками текста.В этом случае я не смог извлечь информацию об изображении.

Мое требование:

  1. Получить структурные элементы файла PDF
  2. Обработать, является ли каждыйтипа text, image, table или другого

Например, структурные элементы похожи на следующие:

text :paragraph1
text :paragraph2
Image:Image
text :paragraph3
Table:table info
text :Paragraph4

Если я смогу получить информацию в таком формате, как этот,Я легко могу понять информацию о тексте, изображении, таблице, верхнем или нижнем колонтитуле.

Итак, возможно ли получить такую ​​информацию, используя iTextSharp?Если да, пожалуйста, просветите меня об этом.В противном случае, не могли бы вы предложить другие инструменты, способные удовлетворить это требование?

Спасибо всем,

Сараванан

1 Ответ

5 голосов
/ 19 января 2014

Я имел такую ​​потребность некоторое время назад.Я использовал эту функцию (из Извлечение изображений с помощью iTextSharp ):

private static 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))
                {
                    return obj;
                }// image inside a form
                else if (PdfName.FORM.Equals(type))
                {
                    return FindImageInPDFDictionary(tg);
                } //image inside a group
                else if (PdfName.GROUP.Equals(type))
                {
                    return FindImageInPDFDictionary(tg);
                }

            }
        }
    }

    return null;
}

Как вы можете видеть в выражении foreach (PdfName name in xobj.Keys), я думаю, что вы можете легко проанализировать весь PDF и обработать каждыйвид данных из него.Но я не уверен насчет "вертикальности" вашей потребности.

Надеюсь, это поможет вам.

...