wie können wir extrahieren von text aus pdf mit itextsharp mit Leerzeichen?
Bin ich mit dem folgenden Verfahren zu extrahieren pdf-text Zeile für Zeile. Aber das problem, dass es keine lese-Leerzeichen zwischen den Wörtern und zahlen. was könnte die Lösung für dieses ??
Ich will einfach nur das erstellen einer Liste von Strings, jeder string in der Liste Objekt hat einen text-Zeile aus der pdf, wie es in pdf einschließlich Leerzeichen.
public void readtextlinebyline(string filename) {
List<string> strlist = new List<string>();
PdfReader reader = new PdfReader(filename);
string text = string.Empty;
for (int page = 1; page <= 1; page++)
{
text += PdfTextExtractor.GetTextFromPage(reader, page ,new LocationTextExtractionStrategy())+" ";
}
reader.Close();
string[] words = text.Split('\n');
foreach (string word in words)
{
strlist.Add(word);
}
foreach (string st in strlist)
{
Response.Write(st +"<br/>");
}
}
Habe ich versucht diese Methode durch änderung der Strategie zu SimpleTextExtractionStrategy als gut, aber es ist auch nicht für mich arbeiten.
Dieses Antwort auf "itext-java-pdf-Erstellung der Texte" soll der Veranschaulichung der Grund-und der Hinweis auf eine Lösung: Kopieren Sie den text extration-Strategie und optimieren Sie die internen Parameter, in deinem Fall die minimale Breite einer Lücke zu erkennen, wie ein Raum,
So bieten Sie eine Prämie, die Sie sicherlich unterliegen diesem problem. So, Ihr könnt Euch sicherlich Versorgung einer oder mehrerer Proben PDF-Dateien dienen als Testfälle für die vorgeschlagenen Lösungen. Der gegenwärtige Stand der Frage macht die Beantwortung Reine Vermutung.
Im sorry für die späte Antwort, meine Verbindung brach.Was ich nicht mag ist nicht Ihre Lösung (es funktioniert) - was ärgert mich ist, dass diese Lösung wahrscheinlich nicht zuverlässig. F. E: es funktioniert mit einer Datei, aber vielleicht auf eine andere Datei, die es erzeugen würde, zu viel Leerzeichen (Ursache das Dokument muss renderInfo.getSingleSpaceWidth()/2f oder eine total unterschiedliche Teiler). Ich habe nicht ein Beispiel für das, aber seine etwas könnte ich mir vorstellen, dass es passieren kann. Also bat ich um Antworten von einem "mehr" zuverlässige Quelle.
Leider ist Sie nicht leicht eine generische 100% zuverlässige Lösung. Manche Probleme machen es schwer, um es zu bekommen sind erwähnt in der Antwort, die ich darauf hingewiesen. Es kann wirklich schwer sein, zu unterscheiden zwischen kerning und eng Worte.
Yep, ich dachte so etwas wie, dass. Traurig, aber nicht änderbar. ich habe auch versucht, viele Dinge wie versuchen Sie, die Berechnung der spacesize basiert auf der schriftart usw, aber nichts funktioniert so gut wie Ihr bereits geschrieben-Lösung. Wenn Sie nach Ihrer Lösung wieder als answear kann ich dir die Ruf.
renderInfo.getSingleSpaceWidth()/2f
standardmäßig; die person, die fragte zurück, es habe bessere Ergebnisse mit renderInfo.getSingleSpaceWidth()/4f
.So bieten Sie eine Prämie, die Sie sicherlich unterliegen diesem problem. So, Ihr könnt Euch sicherlich Versorgung einer oder mehrerer Proben PDF-Dateien dienen als Testfälle für die vorgeschlagenen Lösungen. Der gegenwärtige Stand der Frage macht die Beantwortung Reine Vermutung.
Im sorry für die späte Antwort, meine Verbindung brach.Was ich nicht mag ist nicht Ihre Lösung (es funktioniert) - was ärgert mich ist, dass diese Lösung wahrscheinlich nicht zuverlässig. F. E: es funktioniert mit einer Datei, aber vielleicht auf eine andere Datei, die es erzeugen würde, zu viel Leerzeichen (Ursache das Dokument muss renderInfo.getSingleSpaceWidth()/2f oder eine total unterschiedliche Teiler). Ich habe nicht ein Beispiel für das, aber seine etwas könnte ich mir vorstellen, dass es passieren kann. Also bat ich um Antworten von einem "mehr" zuverlässige Quelle.
Leider ist Sie nicht leicht eine generische 100% zuverlässige Lösung. Manche Probleme machen es schwer, um es zu bekommen sind erwähnt in der Antwort, die ich darauf hingewiesen. Es kann wirklich schwer sein, zu unterscheiden zwischen kerning und eng Worte.
Yep, ich dachte so etwas wie, dass. Traurig, aber nicht änderbar. ich habe auch versucht, viele Dinge wie versuchen Sie, die Berechnung der spacesize basiert auf der schriftart usw, aber nichts funktioniert so gut wie Ihr bereits geschrieben-Lösung. Wenn Sie nach Ihrer Lösung wieder als answear kann ich dir die Ruf.
InformationsquelleAutor shailendra | 2013-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Hintergründe auf, warum die Leerzeichen zwischen den Wörtern manchmal nicht richtig erkannt von iText(Scharf) oder andere PDF-text-Extraktoren, erklärt wurden, in Antwort auf "itext-java-pdf-Erstellung der Texte": Diese 'Räume' sind nicht unbedingt erstellt mit Leerzeichen sondern mit einem Betrieb, erstellen einen kleinen Spalt. Diese Operationen werden auch für andere Zwecke verwendet (die nicht brechen Wörter), aber, und so ein text-Extraktor muss mit Heuristiken, um zu entscheiden, ob eine solche Lücke ist ein Wort zu brechen oder nicht...
Dies vor allem besagt, dass Sie nie eine 100% sichere word-break-Erkennung.
Was Sie allerdings tun können, ist die Verbesserung der Heuristiken verwendet.
iText und iTextSharp standard-extrahieren von text - - Strategien, die z.B. davon ausgehen, ein Wort zu brechen, die in einer Linie, wenn
a) es ist ein Leerzeichen oder
b) es gibt eine Lücke, die zumindest so breit ist wie die Hälfte einer Leerstelle.
Element a ist ein sicher hit, aber Punkt b kann oft nicht im Fall von dicht-Satz-text. Die OP von der Frage der Antwort auf den oben verwiesen wird habe sehr gute Ergebnisse mit einem Viertel der Breite eines Leerzeichens statt.
Können Sie zwicken diese Kriterien durch kopieren und ändern der text-Extraktion-Strategie Ihrer Wahl.
In der
SimpleTextExtractionStrategy
Sie finden dieses Kriterium eingebettet in dierenderText
Methode:Im Falle der
LocationTextExtractionStrategy
dieses Kriterium inzwischen gebracht worden ist, in eine Methode der eigenen:Die Absicht, für die Umsetzung dieser in eine Methode, die seine eigene war, nur erfordern einfache Unterklassen der Strategie und überschreiben Sie diese Methode zum einstellen der Heuristik Kriterien. Dies funktioniert im Falle des gleichwertigen iText Java-Klasse, die aber in den port zu iTextSharp leider keine
virtual
wurde Hinzugefügt, um die Deklaration (ab version 5.4.4). So werden derzeit kopiert die gesamte Strategie ist immer noch notwendig für iTextSharp.@Bruno, wollen Sie vielleicht sagen, das iText -> iTextSharp-porting-team zu diesem.
Während Sie können eine Feinabstimmung der text-Extraktion auf diese code-Positionen, die Sie sollten sich bewusst sein, dass Sie nicht finden, eine 100 - % - Kriterium hier. Einige Gründe sind:
Können Sie besser als die iText-Heuristik und denen der daraus abgeleiteten Verwendung von anderen Konstanten, die unter Berücksichtigung der tatsächlichen visuellen Freiraum zwischen alle Zeichen (mit PDF-rendering oder die font-information-Analyse-Mechanismen), aber für eine wahrnehmbare Verbesserung, die Sie haben zu viel Zeit investieren.
Soweit ich weiß, die iTextSharp-Port mittlerweile Hinzugefügt hat
virtual
dieserLocationTextExtractionStrategy
Methode. Eigentlich nicht nur diese Methode, aber praktisch jederpublic
Methode.Brillante Antwort. Genau die Informationen, die ich brauchte und geschrieben, sehr komplett und klar. Ich danke Ihnen so sehr.
InformationsquelleAutor mkl
Habe ich meine eigene Implementierung, und es funktioniert sehr gut.
SimpleTextExtractionStrategy
während der OP verwendet es mit derLocationTextExtractionStrategy
. Während dies ist sicherlich ein Unterschied, Sie verwenden im wesentlichen die gleiche Heuristik, um zu bestimmen, ein Wort zu brechen (ein Leerzeichen oder eine Lücke, die mindestens halb so breit wie ein Leerzeichen). So, dies wird kaum besser als die der original-code.mkl ist richtig. Dies kann in einigen Fällen arbeiten, können aber nicht in einigen anderen wie mir. (Ich nicht Darstellbare Zeichen durch unterschiedliche Codierung) Auch die SimpleTextExtractionStrategy nicht einfügen '\n' richtig in meinem Fall, also ich Baue meine benutzerdefinierte RenderListener (wie ich brauchen, um zu extrahieren Bild) und den code optimieren, zu erfüllen meine Anforderung, z.B. eine änderung der Bedingung, dass erkennt neue Linie von orientationMagnitude == andere. OrientationMagnitude der Mathematik.Abs(orientationMagnitude - andere.OrientationMagnitude) < 10. Natürlich wird es nicht in allen Fällen funktionieren.
InformationsquelleAutor Jaderson Linhares
InformationsquelleAutor Swapnil Somkuwar