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

62

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

Теги:
pdf
itextsharp

6 ответов

143
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();
}
  • 14
    Это должно быть помечено как решение! Это прекрасно работает для меня.
  • 0
    Согласен, это работает, отметьте это как ответ.
Показать ещё 6 комментариев
18

Вы не можете читать и анализировать содержимое PDF с помощью iTextSharp, как вы хотели бы.

Из iTextSharp Учебник SourceForge:

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

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

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

  • 4
    +1 Спасибо за выдержку из учебника. Это единственное наиболее информативное объяснение (действительно, откровение), которое я когда-либо видел о файлах PDF. Прежде чем читать его, я думал, что в PDF-файлах присутствует некая Word-подобная структура.
  • 0
    @Sabuncu Рад быть в состоянии помочь!
9

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-контента.

  • 1
    Вы правы, до того как текстовое извлечение 5.xx присутствовало в iText просто как подтверждение концепции, а в iTextSharp - вовсе нет. Это , как говорится, код , который вы только представить работы в очень примитивно встроенные PDF - файлы ( с использованием шрифтов с кодировкой ASCII'ish и Tj в качестве оператора рисования только текста). Он может быть использован в очень контролируемых средах (в которых вы можете гарантировать получение только таких примитивных PDF-файлов), но не в целом.
6

Вот решение 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
  • 0
    Когда я пытаюсь это сделать в своем PDF-файле, появляется сообщение об ошибке «Значение не может быть нулевым. Имя параметра: значение». Есть идеи, о чем это?
  • 0
    Можете ли вы сказать мне, какая строка кода дает вам эту ошибку?
Показать ещё 6 комментариев
3

В моем случае я просто хотел текст из определенной области документа 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
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню