Dieselbe Textzeile wird von PyMuPDF in mehr als zehn Bereiche aufgeteilt? Dies bestimmt, ob es zusammengeführt werden soll
PyMuPDF unterteilt dieselbe Wortzeile in mehr als ein Dutzend Abschnitte. Meistens hat sich die Schriftart, Schriftgröße oder der Stil geändert, nicht unbedingt die Segmentierung. In diesem Artikel wird erläutert, wie Stiländerungen und Absatzgrenzen unterschieden werden können, und es werden Beispiele für die Zusammenführung von Logik und ein Akzeptanzformular gegeben, um das Zerhacken eines Satzes während der Übersetzung zu vermeiden.
Wenn Sie extractDICT() von PyMuPDF zum Extrahieren von PDF-Text verwenden, stellen Sie möglicherweise fest, dass ein zusammenhängender Satz im zurückgegebenen Ergebnis in sieben, acht oder mehr span zerlegt wird. Dabei handelt es sich in der Regel nicht um einen Parsing-Fehler, sondern um eine echte Widerspiegelung der zugrunde liegenden Struktur der PDF-Datei: Schriftartwechsel, Farbänderungen oder lokale Stilanpassungen können den Textfluss beim Rendern unterbrechen.
Wenn dieses „Style-Slicing"mit „Absatzsegmentierung"verwechselt wird, führt eine spätere Bereinigung, Übersetzung oder ein späteres Abrufen leicht zu Fehlern bei der Satzsegmentierung. In diesem Artikel wird erläutert, wie Sie Stiländerungen von Absatzgrenzen unterscheiden können, es wird ein zusammengeführtes Beispiel für die Zusammenführungslogik gegeben und ein Akzeptanzformular bereitgestellt, das Ihnen dabei hilft, das Zerhacken eines Satzes zu vermeiden.
Eine Textzeile im PDF ist in viele Abschnitte aufgeteilt. Sollten sie zusammengelegt werden? Fazit in einem Satz
Wenn sich mehrerespan im selben line befinden und die y-Koordinaten gleich sind, können hauptsächlich Schriftart, Schriftgröße oder Farbwechsel sicher zusammengefügt werden. Die Absatzgrenze sollte auf der Struktur von block und line basieren, nicht auf der Anzahl von span.
| Ihre Situation | Empfohlene Praktiken | Grund |
|---|---|---|
| Mehrere Spannen innerhalb derselben Linie haben dieselben y-Koordinaten | Sicheres Spleißen von span.text | Meistens Schriftart- oder Farbwechsel |
| Es gibt offensichtlich eine horizontale Lücke zwischen den Spannweiten | Überprüfen Sie den Abstand der B-Boxen und fügen Sie bei Bedarf Leerzeichen oder Tabulatoren ein | Kann ein Tabulatorzeichen oder ein Spaltenumbruchrest sein, es sind Regeln erforderlich |
| Der Unterschied in den Y-Koordinaten der Spannen innerhalb derselben Zeile übersteigt 10 % der Schriftgröße | Behalten Sie die ursprüngliche Span-Struktur bei, ohne sie zusammenzuführen | Dies können Inline-Formeln oder Indizes sein |
| Einzelwortspanne und Bbox sind ungeordnet | Als minderwertige Qualität markieren, in manuell oder OCR konvertieren | Fehlende verlässliche Grundlage für Sortierung und Gruppierung |
| Semantisch fortlaufender Text über Blöcke hinweg | Eine kontextbezogene Beurteilung ist erforderlich und eine automatische Zusammenführung wird nicht durchgeführt. | Möglicherweise handelt es sich um ein Paging-Fragment |
Klären Sie zunächst die hierarchische Beziehung zwischen Block, Linie und Spanne
Wörterbuchstruktur von PyMuPDF
Die Wörterbuchausgabe von PyMuPDF folgt strikt der Inhaltsflussstruktur von PDF und die Hierarchie von außen nach innen ist wie folgt:
block: Ein unabhängiger Satzbereich auf der Seite, z. B. ein Textabsatz, eine Tabellenzelle oder eine Legende.line: Visuelle einzelne Textzeile innerhalb vonblock.span:lineist eine interne Folge aufeinanderfolgender Zeichen mit derselben Schriftart, Größe, Farbe und demselben Stil.
Weitere Beschreibungen der Felder auf jeder Ebene finden Sie unter Offizielle Dokumentation von PyMuPDF TextPage.
Warum erzeugt der Stilwechsel eine neue Spanne?
Solange in der Mitte einer Textzeile eine Fett- oder Kursivschrift, eine Farbänderung oder eine Schriftart-Rücksetzung vorhanden ist (z. B. werden chinesische Schriftzeichen mit Englisch und Zahlen gemischt), wird ein neues span generiert. Diese spans gehören zum selben line und haben dieselbe Grundlinie und vertikale Position.
Was bei Absatzgrenzen zu beachten ist
Das wahre Ende eines Absatzes wird durch das Ende der line-Liste und den Anfang eines neuen block markiert, nicht durch die Nummer von span. Eine Verwechslung der beiden kann zu praktischen Problemen führen: Beispielsweise wird „Wichtiger Tipp"fälschlicherweise als zwei separate Sätze erkannt, was dazu führt, dass das Translation Memory nicht in der Lage ist, den vollständigen Begriff abzugleichen.
Synthesebeispiel: Korrekte Ausgabe und Randfälle
Korrekte Ausgabe
Um das Problem zu veranschaulichen, konstruieren wir ein synthetisches Szenario. Angenommen, das Eingabe-PDF enthält eine Textzeile: „Bitte beachten Sie: Das System wird in 5 Minuten neu gestartet."Unter anderem verwendet „Bitte beachten Sie:"die Fettschrift, „Das System wird in 5 Minuten neu gestartet"und kehrt zur Song-Schriftart zurück.
Die korrekteextractDICT()-Ausgabe sollte vier span unter einem line-Objekt enthalten. Die bbox jedes span überlappen sich in vertikaler Richtung stark, und die y-Koordinaten von origin sind grundsätzlich konsistent. Diese vier Fragmente werden zu einer vollständigen semantischen Einheit zusammengefügt.
Eingabe von geringer Qualität
Eine typische Fehlersituation besteht darin, dass das gescannte PDF nicht mit OCR bearbeitet wurde oder der PDF-Generator jedes chinesische Zeichen als separates Textobjekt schreibt. In diesem Fall kann extractDICT() Dutzende von Einzelwort-spans zurückgeben, und es kann kleine Lücken oder unregelmäßige Überlappungen zwischen ihren bboxs geben.
Diese Situation kann nicht einfach durch die Verkettung von Zeichenfolgen behoben werden, da es keine zuverlässige Grundlage für die Sortierung und Gruppierung gibt. Es ist sicherer, die Seite als „strukturierte Daten von geringer Qualität"zu kennzeichnen und sie an eine manuelle Korrekturlesung oder einen speziellen OCR-Prozess zu senden, als eine Zusammenführung zu erzwingen.
Span-Merge-Logik basierend auf geometrischen Merkmalen
Beispielcode
Das folgende Python-Beispiel zeigt, wie die Ausgabestruktur vonextractDICT() im Speicher emuliert und eine sichere Peer-Span-Merging-Funktion implementiert wird. Hinweis: In diesem Beispiel werden synthetische Daten ausschließlich aus dem Speicher erstellt und keine echten PDF-Dateien gelesen. Es wird nur verwendet, um die Logik des Zusammenführungsalgorithmus zu überprüfen.
Für die tatsächliche Verwendung bestätigen Sie bitte, dass die PyMuPDF-Version die extractDICT-Methode unterstützt (1.23.x und höher empfohlen) und führen Sie sie in Ihrer eigenen gesperrten Abhängigkeitsumgebung aus.
# 合成示例:演示同行span合并逻辑,非真实PDF解析结果
# 依赖: PyMuPDF (pymupdf) >= 1.23.0,仅用于类型参考,本例纯内存构造
def merge_spans_in_line(line_dict, y_tolerance=2.0):
"""合并同一line内y坐标相近的span,保留原始顺序"""
if not line_dict.get("spans"):
return ""
spans = sorted(line_dict["spans"], key=lambda s: s["bbox"][0]) # 按x排序
merged_text = []
current_y = spans[0]["origin"][1]
buffer = [spans[0]["text"]]
for span in spans[1:]:
y = span["origin"][1]
if abs(y - current_y) <= y_tolerance:
buffer.append(span["text"])
else:
merged_text.append("".join(buffer))
buffer = [span["text"]]
current_y = y
merged_text.append("".join(buffer))
return "\n".join(merged_text)
# 构造合成line数据,模拟四种字体混排(正常情况)
synthetic_line = {
"spans": [
{"text": "请注意:", "bbox": (100, 200, 160, 220), "origin": (100, 215)},
{"text": "系统将在", "bbox": (160, 200, 220, 220), "origin": (160, 215)},
{"text": "5", "bbox": (220, 200, 230, 220), "origin": (220, 215)},
{"text": "分钟后重启。", "bbox": (230, 200, 310, 220), "origin": (230, 215)}
]
}
result = merge_spans_in_line(synthetic_line)
assert result == "请注意:系统将在5分钟后重启。", f"合并失败: {result}"
# 边界测试:y坐标差异超过容差,应视为不同行片段(即使在同一line dict中也应分隔)
bad_line = {
"spans": [
{"text": "上行", "bbox": (100, 200, 140, 220), "origin": (100, 215)},
{"text": "下行", "bbox": (100, 230, 140, 250), "origin": (100, 245)}
]
}
bad_result = merge_spans_in_line(bad_line, y_tolerance=2.0)
# y差值30 > 2.0,应被分隔为两行
assert bad_result == "上行\n下行", f"异常行未正确分隔: {repr(bad_result)}"
Vorsichtsmaßnahmen vor der Verwendung
- Ein Wert von 2,0 für
y_toleranceist nur eine synthetische Beispieleinstellung und kein Industriestandard. - In tatsächlichen Projekten kann dieser Wert dynamisch basierend auf der durchschnittlichen Schriftgröße des Dokuments berechnet werden; Wenn
lineselbst korrekt geteilt wurde, ist normalerweise keine zusätzliche Überprüfung der Y-Koordinaten erforderlich. - Die Beispiele in diesem Artikel stellen lediglich Demonstrationen auf Codeebene dar und stellen keine Garantie für alle tatsächlichen Dateien oder Produkteffekte dar.
📊 Kernvergleich
In der folgenden Tabelle werden verschiedene Verarbeitungsmethoden verglichen und anhand der oben genannten Akzeptanzregeln anhand der beobachteten Situation geprüft, ob sie für die automatische Zusammenführung geeignet sind.
| Beobachtete Situation | Verarbeitungsmethode | Ist es für die automatische Zusammenführung geeignet? |
|---|---|---|
| Die Y-Koordinaten der Spannen innerhalb derselben Linie sind konsistent | Sicheres Spleißen | Ja |
| Es gibt offensichtlich eine horizontale Lücke zwischen den Spannweiten | Fügen Sie Leerzeichen oder Tabulatoren ein, nachdem Sie den Abstand überprüft haben | Seien Sie vorsichtig und brauchen Sie Regeln |
| Inline-Formeln, hochgestellte und tiefgestellte Zeichen führen zu großen Unterschieden in den Y-Koordinaten | Behalten Sie die ursprüngliche Spannweitenstruktur bei | NEIN |
| Einzelwortspanne und Bbox sind ungeordnet | Niedrige Qualität kennzeichnen, in manuell oder OCR konvertieren | NEIN |
| Semantisch fortlaufender Text über Blöcke hinweg | Urteil basierend auf dem Kontext | Nein, NLP-Unterstützung ist erforderlich |
Akzeptanzkriterien und manuelle Überprüfungsgrenzen
| Phänomene beobachten | Mögliche Gründe | Verarbeitungsentscheidung | Ob die automatische Zusammenführung angewendet werden soll |
|---|---|---|---|
| Mehrere Spannen innerhalb derselben Linie haben dieselben y-Koordinaten | Schriftart-/Farbwechsel | Sicheres Spleißen von span.text | Ja |
| Es gibt eine offensichtliche horizontale Lücke zwischen den Spannweiten (>Raumbreite). | Tabulatorzeichen und Spaltenreste | Überprüfen Sie den Bbox-Abstand, fügen Sie Leerzeichen oder Tabulatoren ein | Seien Sie vorsichtig und brauchen Sie Regeln |
| Unterschied in den Spannen-Y-Koordinaten innerhalb derselben Zeile > Schriftgröße 10 % | Inline-Formeln, hochgestellte und tiefgestellte Zeichen | Behalten Sie die ursprüngliche Span-Struktur bei, ohne sie zusammenzuführen | NEIN |
| Einzelwortspanne und Bbox sind ungeordnet | Gescanntes oder beschädigtes PDF | Als minderwertige Qualität markieren, in manuell oder OCR konvertieren | NEIN |
| Textsemantische Kontinuität zwischen Blöcken | Seitenumbruch | Die blockübergreifende Zusammenführung erfordert eine kontextbezogene Beurteilung | Nein, NLP-Unterstützung ist erforderlich |
In dieser Tabelle wird nur die Strukturüberprüfung auf Code-Demonstrationsebene behandelt. Der End-to-End-Effekt muss mit Sprachmodellen oder manueller Stichprobe kombiniert werden. Die automatische Zusammenführung sollte nicht für formatempfindliche Dokumente wie Rechtsverträge, Krankenakten usw. verwendet werden, es sei denn, dies wurde von einem Domänenexperten überprüft.
Bitte bereiten Sie vor der Verwendung selbst das Desensibilisierungstest-PDF vor, führen Sie page.get_text("dict", sort=True) aus, um JSON zu exportieren, und überprüfen Sie dann jedes Element.
Wird zur Überprüfung vor der Dokumentübersetzung verwendet
Überprüfen Sie zunächst die Seitenreihenfolge, den Quellort und die Textintegrität und senden Sie dann das gleiche desensibilisierte Beispiel an den Übersetzungsprozess. Nach der Übersetzung müssen Sie noch prüfen, ob Titel, Text und Abbildungen korrekt übereinstimmen und nicht nur, ob der Text glatt ist.
OmniDoc (Produktportal) bietet ein Multiformat-Dokumentübersetzungsportal und auf der offiziellen Website werden OCR-, Glossar- und zweisprachige Vergleichsfunktionen eingeführt. Für Teams, die direkt mit den Dateien arbeiten möchten, ist dies ein Weg, den es wert ist, mit realen Beispielen evaluiert zu werden. Bitte verwenden Sie desensibilisierte Dateien, für deren Hochladen Sie berechtigt sind, und verwenden Sie die Prüfpunkte in diesem Artikel, um die Ergebnisse zu überprüfen. Es besteht hier kein Anspruch darauf, dass OmniDoc die Open-Source-Bibliotheken oder internen Algorithmen in diesem Artikel verwendet, noch ersetzt das Beispiel Produktleistungstests.
🎯 Welche Methode ist für Dich geeignet?
Wenn Sie nur Text in derselben Zeile organisieren möchten
- Gruppieren Sie nach
lineund verbinden Siespan.textsicher, wenn die y-Koordinaten konsistent sind.
Wenn Sie auf Inline-Formeln oder hochgestellte Zeichen stoßen
- Behalten Sie die ursprüngliche
span-Struktur bei, ohne sie zusammenzuführen.
Wenn Sie es mit Scans oder PDFs mit vielen Einzelwortspannen zu tun haben
- Zuerst als minderwertig markieren und dann zum manuellen Korrekturlesen oder einem speziellen OCR-Prozess übertragen.
Wenn Sie eine block- oder seitenübergreifende Übersetzung durchführen möchten
- Aufgrund einer kontextbezogenen Beurteilung ist eine direkte automatische Zusammenführung nicht angemessen.
❓ Häufig gestellte Fragen (FAQ)
1. Eine Textzeile wird in viele Abschnitte aufgeteilt. Muss es eine Segmentierung sein?
Nicht unbedingt, es wird meist durch Änderungen der Schriftart, Schriftgröße oder -farbe verursacht. span innerhalb desselben line haben dieselbe Grundlinie und vertikale Position.
2. Was soll ich am Ende des Absatzes lesen?
Sehen Sie, ob die line-Liste endet und ein neues block beginnt, nicht die Anzahl der span.
3. Kann die Zeichenfolgenverkettung verwendet werden, um das Problem der Einzelwortspanne zu beheben?
Nicht empfohlen. Solche Fälle verfügen nicht über eine verlässliche Grundlage für die Sortierung und Gruppierung und es ist sinnvoller, sie als qualitativ minderwertig zu kennzeichnen und an einen manuellen oder OCR-Prozess weiterzuleiten.
4. Wie viel sollte y_tolerance beim Zusammenführen eingestellt werden?
Die 2.0 im Beispiel ist nur eine synthetische Beispieleinstellung und kein Industriestandard. Tatsächliche Elemente können dynamisch basierend auf der durchschnittlichen Schriftgröße berechnet werden oder direkt der Gruppierung von line vertrauen.
5. Kann die automatische Fusion in Rechtsverträgen verwendet werden?
Nicht geeignet, es sei denn, dies wurde von Domain-Experten bestätigt.
📝 Zusammenfassung
Der Schlüssel zur Beurteilung, ob span zusammengeführt werden kann, besteht darin, zunächst die Struktur von line und block und dann die geometrische Position zu betrachten. Wenn Sie auf Formeln, gescannte Dokumente oder blockübergreifende Semantik stoßen, ist es besser, sie so zu belassen, wie sie sind, oder sie manuell zu konvertieren, anstatt sie gewaltsam zusammenzufügen.


