Чтение PDF-содержимого с помощью itextsharp dll в VB.NET или C # - PullRequest
74 голосов
/ 31 марта 2010

Как я могу читать содержимое PDF с помощью itextsharp с классом Pdfreader. Мой PDF может содержать обычный текст или изображения текста.

Ответы [ 6 ]

175 голосов
/ 15 февраля 2011
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System.IO;

public string ReadPdfFile(string fileName)
{
    StringBuilder text = new StringBuilder();

    if (File.Exists(fileName))
    {
        PdfReader pdfReader = new PdfReader(fileName);

        for (int page = 1; page <= pdfReader.NumberOfPages; page++)
        {
            ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
            string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

            currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
            text.Append(currentText);
        }
        pdfReader.Close();
    }
    return text.ToString();
}
19 голосов
/ 31 марта 2010

Вы не можете читать и анализировать содержимое PDF-файла, используя iTextSharp, как вы хотели бы.

Из учебника iTextSharp SourceForge :

Вы не можете "проанализировать" существующий файл PDF используя iText, вы можете только «прочитать» его страница на страницу.

Что это значит?

Формат PDF - это просто холст, где текст и графика размещаются без любая структура информации. В качестве таких нет никаких 'iText-объектов' в PDF файл На каждой странице будет вероятно, будет ряд «строк», но Вы не можете восстановить фразу или абзац с использованием этих строк. Там вероятно, несколько нарисованных линий, но вы не можете получить объект Table основываясь на этих линиях. Короче: Разбор содержимого PDF-файла НЕ ВОЗМОЖНО с iText. Опубликуйте свой вопрос в группе новостей новости: //comp.text.pdf и, возможно, вы получит некоторые ответы от людей, которые есть встроенные инструменты, которые могут анализировать PDF и извлечь часть его содержимого, но не ожидайте инструментов, которые будут выполнять пуленепробиваемое преобразование в структурированный текст.

15 голосов
/ 04 ноября 2014

LGPL / FOSS iTextSharp 4.x

var pdfReader = new PdfReader(path); //other filestream etc
byte[] pageContent = _pdfReader .GetPageContent(pageNum); //not zero based
byte[] utf8 = Encoding.Convert(Encoding.Default, Encoding.UTF8, pageContent);
string textFromPage = Encoding.UTF8.GetString(utf8);

Ни один из других ответов не был мне полезен, похоже, что все они нацелены на AGPL v5 iTextSharp. Я никогда не мог найти ссылку на SimpleTextExtractionStrategy или LocationTextExtractionStrategy в версии FOSS.

Что-то еще, что может быть очень полезно в сочетании с этим:

const string PdfTableFormat = @"\(.*\)Tj";
Regex PdfTableRegex = new Regex(PdfTableFormat, RegexOptions.Compiled);

List<string> ExtractPdfContent(string rawPdfContent)
{
    var matches = PdfTableRegex.Matches(rawPdfContent);

    var list = matches.Cast<Match>()
        .Select(m => m.Value
            .Substring(1) //remove leading (
            .Remove(m.Value.Length - 4) //remove trailing )Tj
            .Replace(@"\)", ")") //unencode parens
            .Replace(@"\(", "(")
            .Trim()
        )
        .ToList();
    return list;
}

Это извлечет только текстовые данные из PDF, если отображаемый текст будет Foo(bar), он будет закодирован в PDF как (Foo\(bar\))Tj, этот метод вернет Foo(bar), как и ожидалось. Этот метод удалит много дополнительной информации, такой как координаты местоположения из необработанного содержимого PDF.

6 голосов
/ 01 сентября 2011

Вот решение VB.NET на основе решения ShravankumarKumar.

Это даст вам ТОЛЬКО текст. Изображения это отдельная история.

Public Shared Function GetTextFromPDF(PdfFileName As String) As String
    Dim oReader As New iTextSharp.text.pdf.PdfReader(PdfFileName)

    Dim sOut = ""

    For i = 1 To oReader.NumberOfPages
        Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy

        sOut &= iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its)
    Next

    Return sOut
End Function
5 голосов
/ 28 мая 2015

В моем случае я просто хотел получить текст из определенной области документа PDF, поэтому я использовал прямоугольник вокруг этой области и извлек из него текст. В приведенном ниже примере координаты для всей страницы. У меня нет инструментов для редактирования PDF, поэтому, когда пришло время сузить прямоугольник до определенного места, я сделал несколько предположений по координатам, пока не была найдена область.

Rectangle _pdfRect = new Rectangle(0f, 0f, 612f, 792f); // Entire page - PDF coordinate system 0,0 is bottom left corner.  72 points / inch
RenderFilter _renderfilter = new RegionTextRenderFilter(_pdfRect);
ITextExtractionStrategy _strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), _filter);
string _text = PdfTextExtractor.GetTextFromPage(_pdfReader, 1, _strategy);

Как отмечено в приведенных выше комментариях, полученный текст не поддерживает форматирование, найденное в документе PDF, однако я был рад, что он сохранил возврат каретки. В моем случае в тексте было достаточно констант, чтобы я смог извлечь нужные значения.

0 голосов
/ 10 октября 2013
Public Sub PDFTxtToPdf(ByVal sTxtfile As String, ByVal sPDFSourcefile As String)
        Dim sr As StreamReader = New StreamReader(sTxtfile)
    Dim doc As New Document()
    PdfWriter.GetInstance(doc, New FileStream(sPDFSourcefile, FileMode.Create))
    doc.Open()
    doc.Add(New Paragraph(sr.ReadToEnd()))
    doc.Close()
End Sub
...