Autor |
Beitrag |
uko
      
Beiträge: 220
Erhaltene Danke: 1
Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
|
Verfasst: 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:
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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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 
      
Beiträge: 220
Erhaltene Danke: 1
Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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 
      
Beiträge: 220
Erhaltene Danke: 1
Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
|
Verfasst: 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:
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 
      
Beiträge: 220
Erhaltene Danke: 1
Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
|
Verfasst: 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
|
|
|