2016-05-25 7 views

Antwort

0

Warum itexptpdf Leerzeichen einfügen?

iText Räume einfügt, wenn es eine Lücke zwischen zwei aufeinanderfolgenden Textstücken ist, die größer ist als eine bestimmte Menge ist, oder wenn zwei aufeinanderfolgende Chunks Text überlappt. Dies signalisiert, dass die Blöcke nicht normal aufeinander folgen.

Bei Ihrem Dokument ein Punkt sieben oft folgenden wird so weit wie möglich nach links verschoben, so daß die Zeichenbegrenzungskästen überlappen:

Sample overlapping 7 and .

wie es entfernen?

Wenn Sie dies nicht möchten, müssen Sie die von Ihnen verwendete Textextraktionsstrategie entsprechend anpassen.

In der aktuellen 5.5.9 sieht der Code wie folgt aus:

if (result.charAt(result.length()-1) != ' ' && renderInfo.getText().length() > 0 && renderInfo.getText().charAt(0) != ' '){ // we only insert a blank space if the trailing character of the previous string wasn't a space, and the leading character of the current string isn't a space 
    float spacing = lastEnd.subtract(start).length(); 
    if (spacing > renderInfo.getSingleSpaceWidth()/2f){ 
     appendTextChunk(" "); 
     //System.out.println("Inserting implied space before '" + renderInfo.getText() + "'"); 
    } 
} 

Die Quelle Ihrer alten iText Version noch ähnlich aussehen hier könnten. Und hier müssen Sie die Logik ändern, um keine Leerzeichen für Rückschritte oder zumindest nur für größere einzufügen.


Als OP erklärte in einem Kommentar, in seinem Fall

float spaceWidth = renderInfo.getSingleSpaceWidth() * 3f/2f; 
float diffI1 = start.subtract(lastEnd).get(Vector.I1); 
if (spacing > spaceWidth && diffI1 > 0) 
{ 
    result.append(" "); 
} 

funktioniert gut mit. Dies bedeutet jedoch nicht, dass der Strategiecode generell so geändert werden sollte, da er ein Schreiben in Richtung der positiven Achse voraussetzt. Darüber hinaus hängt der optimale Wert der Konstante, mit der renderInfo.getSingleSpaceWidth() multipliziert wird, auch von dem vorliegenden Dokumententyp ab, vgl. z.B. this case.

+0

Danke für die Erklärung. Ich versuche es so zu machen float diffI1 = lastEndsubtract (start) .get (Vector.I1); if (diffI1> 0) {appendTextChunk();} aber nicht. – pogdan

+0

Was passiert stattdessen? – mkl

+0

das Ergebnis ist das gleiche wie zuvor http://185.49.12.119/~pogdan/7spacedot/7spacedot1.jpg \t \t // 127670. LELY OST -> LEL Y OST :( Float-Abstand = lastEndsubtract (Start). length(); float = renderInfo.getSingleSpaceWidth Zahnlücke()/2f; float diffI1 = lastEnd.subtract (Start) .get (Vector.I1); if (Abstand> Zahnlücken && diffI1> 0) { Ergebnis.anhängen (""); } – pogdan