Autor Beitrag
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Di 16.09.08 16:16 
Hallo,

ich habe zur Zeit folgendes Problem, wo ich nicht so recht weiter komm: ich habe ein Array von Buchstaben und deren Positionen bzgl. eines Koordinatensystems (als Offset bzgl. erstem Zeichen). Zusätzlich kenne ich noch den Fontnamen und die Fontgröße (und mit sehr sehr viel Aufwand würde ich zur Not noch an die Breiten der einzelnen Buchstaben bzgl. des verwendeten Fonts kommen).
Nun suche ich eine Möglichkeit, um zu erkennen, ob zwischen zwei Buchstaben ein Leerzeichen gehört (der Text soll extrahiert werden und bzgl Leerzeichen formatiert gespeichert werden). Gibt es da irgendwelche Algorithmen?

Hier mal ein vereinfachtes Beispiel:

ausblenden Quelltext
1:
2:
3:
4:
5:
 ('a','l','l','e','m','e','i','n','e','E','n','t','c','h','e','n')   <-- Zeichenarray

 ( 0,  5,  8, 11 , 19, 24, 27, 29, 33, 41, 46 , ...                  <-- Offsets

 alle meine Entchen                                                  <-- sollte erkannt werden


Es müßte hier also erkannt werden, daß zweimal ein großer Zwischenraum existiert und darum ein Blank eingefügt werden muß. Problem dabei, je nach verwendeten Font kann der Abstand für das Leerzeichen durchaus kleiner als eine Buchstabe sein.

Ich hab es mal damit probiert, mir pro Font die durchschnittliche Zeichenbreite zu bestimmen (aus den Offsets) und dann gesagt, wenn zwischen zwei Zeichen mehr als 1.2 mal die durchschnittliche Zeichenbreite Abstand ist, dann füge ein Leerzeichen ein. Auch wenn ich mit den Faktoren rumspiele: das Ergebnis enthält leider immer zu viele falsche Leerzeichen bzw. Leerzeichen werden nicht erkannt.

Hintergrund des Ganzen: Text soll aus einem PDF extrahiert und weggespeichert werden, wobei dir Formatierung erhalten bleiben soll (so weit es geht: also Zeilenumbrüche / Leerzeichen) und con der verwendeten PDF Lib bekomme ich die einzelnen Buchstaben zusammen mit ihren Koordinaten (blockweise)


Grüße,
Uli
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 16.09.08 16:26 
Ohne die einzelnen Zeichenbreiten kommst Du nicht weit. Sobald Du sie hast, ist der Rest ein Kinderspiel.

Bei einem Serifenlosen Font (z.B. Helvetica a.k.a. "Arial") ist ein 'i' sehr schmal, ein 'm' hingegen breit.

Wie willst du bei 'i m' vs. 'mi' erkennen, ob ein Leerzeichen vorhanden ist, wenn Du die Laufweite der Buchstaben nicht weisst? (Das 'm' im 'i m' hat einen kleineren Offset als das 'i' im 'mi')

_________________
Na denn, dann. Bis dann, denn.
uko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Di 16.09.08 16:31 
ich hab's befürchtet :( Und da PDF was Fonts betrifft ja ein Quell beliebiger Komplexität ist, wird das wohl eine längere Geschichte.

Grüße,
Uli
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 16.09.08 16:39 
Gibt es nicht die Möglichkeit, die Steuerzeichen (Space, Tab, etc.) wie die Zeichen aus dem PDF zu extrahieren? Ich kann mir ehrlich gesagt nach nicht vorstellen, dass es da nichts einfacheres gibt. Oder gibt die Komponente das einfach nicht her?

_________________
We are, we were and will not be.
uko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Di 16.09.08 17:00 
Das liegt nicht an der Komponente. PDF kann bei so was wirklich sehr ekelig sein. Ist ja als Druckformat konzipiert und nicht fuer Textweiterverarbeitung.
Hier mal ein kleines Beispiel für Text in PDF:

ausblenden Quelltext
1:
2:
8.51992 -4.31992 Td
[(t)-0.649399(h)1.95024(a)-2.26269(t)-351.968(c)3.56148(o)-2.26064(n)32.0472(t)-0.649399(a)-2.26064(i)0.970014(n)1.9482(s)-366.606(a)-2.26269(n)-359.408(o)-32.3617(d)1.9482(d)-359.412(h)1.9482(o)-2.26677(l)0.972056(e)3.56148(.)TJ


heißt:
that contains an odd hole.

Grüße,
Uli
uko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Mo 20.04.09 15:59 
So, nachdem ich nun mal wieder dazugekommen bin, hier weiterzumachen: einen etwas verbesserten Weg als den von mir zuerst beschriebenen hab ich nun gefunden: ich bestimme nun nicht mehr die durchschnittliche Zeichenbreite pro Font, sondern schau mir pro Font jeden Buchstaben an, der im Text auf einer Seite vorkommt. Für jeden Buchstaben rechne ich seine durchschnittliche Breite (= Abstand zum nächsten Buchstaben) aus den Offsets aus. Da die Buchstaben in der Regel nicht nur am Ende eines Wortes vorkommen, sollte ich so eine einigermaßen genaue Abschätzung kriegen, wie breit der Buchstabe nun wirklich ist.

Damit werden meine Leerzeichentreffer schon wesentlich besser und der Text schaut schon fast wie im Original aus :-) Aber auch hier muß ich wieder mit Skalierungsfaktoren arbeiten and je kleiner die Fonts werden, umso schlechter auch meine Treffergenauigkeit :-(
Falls also noch jemand weitere Ideen hat: jederzeit willkommen!


Grüße,
Uli