PDF-Inhalt mit iTextSharp in C # lesen

Ich benutze diesen Code, um PDF-Inhalte mit iTextSharp zu lesen. Es funktioniert gut, wenn Inhalt Englisch ist, aber es funktioniert nicht, wenn Inhalt Persisch oder Arabisch ist
Ergebnis ist etwa so:
Hier ist Beispiel nicht-Englisch PDF für Test.

KarlŽ>>>> Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl Karl KarlÛŒ com www.codebetter.com 1 1 “” “” “”

همانرب لوصا یسیون مرن دیلوت رتهب رازÙا 

Was ist die Lösung ?

  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(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText))); text.Append(currentText); pdfReader.Close(); } } return text.ToString(); } 

In .Net, sobald Sie eine Zeichenfolge haben, haben Sie eine Zeichenfolge , und es ist immer Unicode. Die tatsächliche In-Memory-Implementierung ist UTF-16, aber das spielt keine Rolle. Zerlegen Sie die Zeichenfolge niemals in Bytes und versuchen Sie, sie als eine andere Codierung neu zu interpretieren und als Zeichenfolge zurückzuschlagen, da dies keinen Sinn ergibt und fast immer fehlschlägt.

Dein Problem ist diese Zeile:

 currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText))); 

Ich werde es in ein paar Zeilen auseinander ziehen, um zu illustrieren:

 byte[] bytes = Encoding.UTF8.GetBytes("ی"); //bytes now holds 0xDB8C byte[] converted = Encoding.Convert(Encoding.Default, Encoding.UTF8, bytes);//converted now holds 0xC39BC592 string final = Encoding.UTF8.GetString(converted);//final now holds ÛŒ 

Der Code wird alles über der 127-ASCII-Grenze mischen. Lass die Re-Encoding-Zeile fallen und du solltest gut sein.

Randbemerkung, es ist durchaus möglich, dass alles, was eine Zeichenkette erzeugt, es falsch macht, das ist nicht wirklich ungewöhnlich. Aber Sie müssen dieses Problem beheben, bevor es zu einer string , auf der byte Ebene.

BEARBEITEN

Der Code sollte exakt der gleiche wie oben sein, außer dass eine Zeile entfernt werden sollte. Stellen Sie außerdem sicher, dass Unicode unterstützt wird, was auch immer Sie verwenden, um den Text anzuzeigen. Stellen Sie außerdem, wie @kuujinbo sagte, sicher, dass Sie eine aktuelle Version von iTextSharp verwenden. Ich habe das mit 5.2.0.0 getestet.

  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); text.Append(currentText); } pdfReader.Close(); } return text.ToString(); } 

BEARBEITEN 2

Der obige Code behebt das Codierungsproblem, aber nicht die Reihenfolge der Zeichenfolgen selbst. Leider scheint dieses Problem auf der PDF-Ebene selbst zu sein.

Folglich erfordert das Anzeigen von Text in solchen Rechts-nach-Links-Schreibsystemen jedes Glyphen einzeln zu positionieren (was mühsam und kostspielig ist) oder Text mit Showstrings darzustellen (siehe 9.2, "Organisation und Verwendung von Schriften"), deren Zeichencodes angegeben sind umgekehrte Reihenfolge.

PDF 2008 Spec - 14.8.2.3.3 - Strings umgekehrter Reihenfolge anzeigen

Bei der Neuordnung von Strings wie oben wird der Inhalt (wenn ich die Spezifikation richtig verstehe), der einen Abschnitt "Markierter Inhalt" verwenden soll, BMC . Die wenigen Beispiel-PDFs, die ich angeschaut und generiert habe, scheinen dies jedoch nicht zu tun. Ich könnte mich auf diesem Teil absolut irren, weil das nicht meine Spezialität ist, also musst du mehr herumstochern.