Text-PDF extrahieren

Das PDF Dateiformat ist beliebt, da Dateiinhalte im Vergleich zu anderen Textverarbeitungsdateiformaten nicht einfach geändert werden können. Sie können jedoch mit Aspose.PDF for .NET API Text aus PDF Dokumenten extrahieren. Lassen Sie uns in diesem Artikel einige der vielen Möglichkeiten zum Suchen und Extrahieren von Text aus PDF Dateien mit C# untersuchen. Im Folgenden finden Sie eine Liste der Funktionen, die wir in diesem Blog besprechen werden:

Extrahieren Sie Text aus einem ganzen PDF Dokument mit C#

Das Lesen von Textinhalten aus einem PDF Dokument ist eine häufig verwendete Funktion. Sie können den gesamten Text aus allen Seiten des Dokuments extrahieren, indem Sie die folgenden Schritte ausführen:

  1. PDF Dokument laden
  2. Erstellen Sie das Objekt TextAbsorber.
  3. Akzeptieren Sie den Absorber für alle Seiten
  4. Extrahierten Text in eine Datei schreiben und speichern

Das folgende code snippet folgt diesen Schritten und zeigt, wie Sie Text aus einem ganzen PDF Dokument mit C# extrahieren:

// PDF Dokument öffnen
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Erstellen Sie ein TextAbsorber objekt, um Text zu extrahieren
TextAbsorber textAbsorber = new TextAbsorber();
// Akzeptieren Sie den Absorber für alle Seiten
pdfDocument.Pages.Accept(textAbsorber);
// Holen Sie sich den extrahierten Text
string extractedText = textAbsorber.Text;
// Erstellen Sie einen Writer und öffnen Sie die Datei
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Schreiben Sie eine Textzeile in die Datei
tw.WriteLine(extractedText);
// Schließen Sie den Stream
tw.Close();

Suchen und extrahieren Sie Text von einer bestimmten Seite in PDF in C#

Nachdem wir die Textextraktion auf Dokumentebene untersucht haben, lassen Sie uns Text aus einer bestimmten Seite eines PDF Dokuments extrahieren. Befolgen Sie einfach die folgenden Schritte, um Ihre Anforderungen zu erfüllen:

  1. PDF Dokument laden
  2. Erstellen Sie das Objekt TextAbsorber.
  3. Akzeptieren Sie den Absorber für eine bestimmte Seite
  4. Extrahierten Text in eine Datei schreiben und speichern

Das folgende code snippet folgt diesen Schritten, um Text von einer beliebigen Seite einer PDF Datei mit C# zu lesen:

// PDF Dokument öffnen
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Greifen Sie auf die erforderliche Seite im PDF Dokument zu
Page page = pdfDocument.Pages[1];
// Erstellen Sie ein TextAbsorber objekt, um Text zu extrahieren
TextAbsorber textAbsorber = new TextAbsorber();
// Akzeptieren Sie den Absorber für die angegebene Seite
page.Accept(textAbsorber);
// Holen Sie sich den extrahierten Text
string extractedText = textAbsorber.Text;
// Erstellen Sie einen Writer und öffnen Sie die Datei
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Schreiben Sie eine Textzeile in die Datei
tw.WriteLine(extractedText);
// Schließen Sie den Stream
tw.Close();

Suchen und extrahieren Sie Text aus einem bestimmten Bereich einer PDF-Seite in C#

Gehen wir bei dieser Textextraktion noch einen Schritt weiter. Erwägen Sie, Text aus einem bestimmten Bereich der Seite zu finden. Es ist wichtig zu verstehen, dass die grundlegende Maßeinheit in Aspose.PDF for .NET Punkt ist, wobei 72 Punkte 1 Zoll entsprechen. Außerdem wird die linke untere Ecke als Ursprung (0,0) der Seite betrachtet. Im Folgenden sind die Schritte zum Lesen von Text aus einem bestimmten Bereich oder Abschnitt einer Seite in einem PDF Dokument aufgeführt:

  1. Quell-PDF Dokument laden
  2. Erstellen Sie das Objekt TextAbsorber.
  3. Legen Sie TextSearchOptions fest und geben Sie rechteckige Koordinaten an
  4. Akzeptieren Sie den Absorber für eine bestimmte Seite
  5. Extrahierten Text in eine Datei schreiben

Das folgende code snippet zeigt diese Schritte zum Extrahieren von Text aus einer bestimmten Region mit C#:

// Dokument öffnen
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Erstellen Sie ein TextAbsorber objekt, um Text zu extrahieren
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// Akzeptieren Sie den Absorber für die erste Seite
pdfDocument.Pages[1].Accept(absorber);
// Holen Sie sich den extrahierten Text
string extractedText = absorber.Text;
// Erstellen Sie einen Writer und öffnen Sie die Datei
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Schreiben Sie eine Textzeile in die Datei
tw.WriteLine(extractedText);
// Schließen Sie den Stream
tw.Close();

Suchen oder extrahieren Sie bestimmten Text aus einer PDF Datei mit regulären Ausdrücken unter Verwendung von C#

Sie können bestimmten Text aus einem PDF Dokument extrahieren, der einem bestimmten Muster entspricht. Beispielsweise möchten Sie möglicherweise einige bestimmte Wörter oder Zahlen extrahieren. Zu diesem Zweck müssten Sie einen regulären Ausdruck entwerfen. Die API verwendet diesen regulären Ausdruck, um übereinstimmenden Text im PDF Dokument zu finden. Die folgenden Schritte sind die Richtlinien zum Suchen und Extrahieren von bestimmtem Text aus PDF Dateien:

  • Eingabe PDF Dokument laden
  • Erstellen Sie das Objekt TextAbsorber.
  • Entwerfen und legen Sie einen regulären Ausdruck fest, der mit Text übereinstimmt
  • Durchlaufen Sie jedes extrahierte Textfragment

Das folgende C# code snippet verwendet eine Regex, die auf allen Seiten des Dokuments nach dem Text sucht, der 4 Ziffern enthält, z. B. 1999,2000 usw.

// Dokument öffnen
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// Erstellen Sie ein TextAbsorber objekt, um alle Instanzen des eingegebenen Suchausdrucks zu finden
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// Akzeptieren Sie den Absorber für alle Seiten
pdfDocument.Pages.Accept(textFragmentAbsorber);
// Holen Sie sich die extrahierten Textfragmente
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// Schleife durch die Fragmente
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

Extrahieren Sie Text aus Tabellenzellen in einem PDF Dokument mit C#

Das Extrahieren von Text aus Tabellen auf einer PDF-Seite ist etwas anders. Wir haben in den vorherigen Beispielen mit der TextAbsorber Klasse gearbeitet, aber das Extrahieren von Text aus einer Tabelle ist etwas anders. Daher müssen Sie die folgenden Schritte ausführen, um Text aus Tabellenobjekten zu extrahieren:

  1. Quell-PDF Datei laden
  2. Erstellen Sie ein Objekt der Klasse TableAbsorber.
  3. Iteriere durch AbsorbedTable
  4. Durchlaufen Sie jede Zelle in jeder Zeile der Tabelle

Das folgende code snippet folgt diesen Schritten und extrahiert effizient den Text aus Tabellenzellen im PDF Dokument mit C#:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

Suchen und extrahieren Sie markierten Text aus PDF Dokumenten mit C#

Hervorgehobener Text ist als Anmerkung in PDF Dateien vorhanden. Sie enthalten markierten Text, wodurch sie sich vom herkömmlichen Text in einem Dokument unterscheiden. Die folgenden Schritte beschreiben, wie Sie hervorgehobenen Text mit C# lesen:

  1. Quelldokument laden
  2. Durchlaufen Sie alle Anmerkungen
  3. Filter TextMarkupAnnotation
  4. Hervorgehobene Textfragmente abrufen

Das Folgende ist ein code snippet, das auf den obigen Schritten basiert. Es kann verwendet werden, um Hervorhebungstext aus PDF Dateien zu erhalten:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Durchlaufen Sie alle Anmerkungen
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // TextMarkupAnnotation filtern
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Hervorgehobene Textfragmente abrufen
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Hervorgehobenen Text anzeigen
            Console.WriteLine(tf.Text);
        }
    }
}

Extrahieren Sie PDF-Text mit geringem Speicherverbrauch mit C#

Im Folgenden finden Sie zwei verschiedene Ansätze zum Optimieren des Speicherverbrauchs beim Extrahieren von Text aus PDF Dokumenten mithilfe der C# Sprache.

i) Verwendung der Methoden Reset() und FreeMemory()

Manchmal kann die Textextraktion viel Speicher und Prozessor verbrauchen. Möglicherweise, wenn die Eingabedatei sehr groß ist und viel Text enthält. Denn das Objekt TextFragmentAbsorber speichert alle gefundenen Textfragmente im Speicher.

Daher empfehlen wir hier die Lösung, die Methode absorber.Reset() nach der Verarbeitung jeder Seite aufzurufen. Wenn Sie nur Lesevorgänge durchführen, können Sie außerdem den von Seitenobjekten gehaltenen Speicher mit der methode page.FreeMemory() freigeben. Sie müssen also die folgenden Schritte ausführen, um minimale Ressourcen zu nutzen:

  1. Quell-PDF Dokument laden
  2. Geben Sie TextEditOptions an
  3. Lies TextFragment
  4. Rufen Sie die Methode Reset() auf
  5. Rufen Sie die Methode FreeMemory() auf

Das folgende code snippet demonstriert die Textextraktion aus PDF Dokumenten mit C#:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //Lesen Sie etwas aus Fragmenten
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

Wir haben dieses code snippet mit einer riesigen Beispieldatei getestet, die 450 Seiten, 24500 Textfragmente und viele Raster und Vektorbilder enthält. Der Prozess verbrauchte nur 500 MB Speicher. Ein weiterer Tipp hier ist, dass Sie den .NET-Garbage Collector aufladen können, um den maximalen Speicherverbrauch auf etwa 250 MB zu senken, wobei zusätzliche Kosten von 10 Sekunden Verarbeitungszeit anfallen.

ii) Verwenden der MemorySaving-Enumeration

Aspose.PDF for .NET API unterstützt die Konfiguration des Speichersparmodus beim Lesen von Text aus einer PDF Datei. Die Enumeration TextExtractionOptions.TextFormattingMode dient dem Zweck des optimalen Ressourcenverbrauchs. Die folgenden Schritte fassen die Schritte zusammen, die Sie für diesen Ansatz befolgen müssen:

  1. Quell-PDF Datei laden
  2. Erstellen Sie das Objekt TextDevice.
  3. Legen Sie TextExtractionOptions fest
  4. Text extrahieren und Text in eine Datei schreiben

Das folgende code snippet demonstriert den speichersparenden Ansatz mit C#:

// Dokument öffnen
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// Zeichenfolge zum Speichern von extrahiertem Text
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Textgerät erstellen
        TextDevice textDevice = new TextDevice();

        // Textextraktionsoptionen festlegen - Textextraktionsmodus festlegen (Raw oder Pure)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Konvertieren Sie eine bestimmte Seite und speichern Sie Text im Stream
        textDevice.Process(pdfPage, textStream);
        // Konvertieren Sie eine bestimmte Seite und speichern Sie Text im Stream
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Speicherstrom schließen
        textStream.Close();
        // Holen Sie sich Text aus dem Speicherstrom
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Speichern Sie den extrahierten Text in einer Textdatei
File.WriteAllText(dataDir, builder.ToString());

Fazit

Wir haben einige der vielen nützlichen Anwendungsfälle in diesem Artikel untersucht, es gibt endlose Möglichkeiten, Text aus PDF Dokumenten mit C# mit Aspose.PDF for .NET API zu extrahieren. Weitere Informationen finden Sie in der API-Dokumentation. Wenden Sie sich bei Fragen bitte unter Free Support Forums an uns.

Siehe auch