Wat moet ik doen als ik op de inhoudsopgave van een PDF kan klikken, maar na extractie het niveau kwijtraak?
De bladwijzerhiërarchie moet vóór het schrijven worden gecontroleerd. Het eerste item is één niveau, en daaropvolgende items kunnen maximaal met één niveau worden verhoogd; het voorbeeld verwerpt illegale niveaus en paginanummers die buiten het bereik vallen, en verandert niet automatisch het niveau om de mapstructuur te vervalsen. Bladwijzerpaginanummers beginnen bij één, en pagina-indexen beginnen meestal bij nul.
De inhoudsopgavepagina van de PDF kan normaal worden omgeleid in de lezer, maar nadat deze is geëxtraheerd met behulp van een script, kan de hiërarchie plat zijn, kunnen de paginanummers verkeerd zijn geplaatst of kan zelfs de index abnormaal zijn. Dit type probleem komt vaak voor bij het samenvoegen van gescande bestanden of bestanden met onregelmatige bladwijzerstructuren. Als de extractieresultaten rechtstreeks aan downstreamgebruikers worden doorgegeven, kunnen er fouten optreden in de vertalingssegmentatie en koppeling.
Dit artikel is bedoeld voor ontwikkelaars en documentatieteams die PDF-catalogi batchgewijs moeten verwerken. Na het lezen kunt u de betekenis van de get_toc()-retourwaarde begrijpen, de verificatieregels voor niveaus en paginanummers beheersen en weten welke situaties moeten worden omgezet naar handmatige verificatie. Dit artikel maakt gebruik van een synthetisch voorbeeld om de verwerkingsmethode te demonstreren, en de code is door het voorbeeld gecontroleerd in een geïsoleerde omgeving, maar dit biedt geen garantie voor alle echte bestanden of producteffecten. Voordat u belangrijke documenten verwerkt, dient u de originelen te bewaren en deze te controleren op basis van de grenzen en acceptatie-items in de tekst.
Wat moet ik doen als er op de PDF-inhoudsopgave kan worden geklikt, maar de hiërarchie na extractie verloren gaat? Conclusie in één zin
Eerst verifiëren, dan schrijven: het bladwijzerniveau moet eerst worden gecontroleerd, het eerste item wordt als het eerste niveau beschouwd, de daaropvolgende niveaus mogen het vorige item plus één niet overschrijden, en vermeldingen met paginanummers die buiten het bereik vallen, worden niet geschreven.
| jouw situatie | Aanbevolen praktijken | reden |
|---|---|---|
| Er kan op de mappagina worden geklikt en de hiërarchie is na extractie vlak of niet goed uitgelijnd. | Gebruik eerst get_toc() om de originele lijst op te halen en verifieer deze vervolgens één voor één voordat u deze gebruikt. | De originele lijst die door get_toc() wordt geretourneerd, heeft geen gestructureerde validatie |
| Het paginanummer is 0 of overschrijdt het totale aantal pagina's | Gooi de vermelding weg en log in | Paginanummers die buiten het bereik vallen, veroorzaken een sprongfout |
get_toc() retourneert een lege lijst | Gebruik in plaats daarvan tekstlay-outanalyse en probeer het niet blindelings opnieuw | Het bestand bevat mogelijk geen bladwijzermetagegevens |
| Dezelfde titel komt overeen met meerdere verschillende paginanummers | Markeer als dubbelzinnig, ga over op handmatige verificatie | Kan niet automatisch bepalen welk paginanummer correct is |
Waarom verliest het extractieresultaat niveaus?
get_toc() geeft standaard een lijst met [level, title, page]-triples uit. Onder hen is page het fysieke paginanummer beginnend bij 1, en level vertegenwoordigt alleen de nestdiepte en garandeert geen continuïteit of wettigheid.
Als de bron-PDF is gegenereerd door een tool voor het samenvoegen van scans, zijn veelvoorkomende problemen onder meer:
- Niveausprong: spring bijvoorbeeld rechtstreeks van 1 naar 3
- Paginanummeruitzondering: het paginanummer is 0 of overschrijdt het totale aantal pagina's
- Titeluitzondering: de titel bevat controletekens
Als het rechtstreeks voor downstream-taken wordt gebruikt, zal het verwarring veroorzaken in vertaalsegmenten of het mislukken van koppelingen. Nog verraderlijker is dat sommige PDF's een visuele inhoudsopgave hebben, maar geen ingebedde bladwijzermetagegevens. Het is normaal dat get_toc() op dit moment een lege lijst retourneert, en in plaats daarvan moet tekstlay-outanalyse worden gebruikt.
Op zichzelf staand compositievoorbeeld
Zie de importlijst voor bijvoorbeeld afhankelijkheden. De code vormt invoer in het geheugen, en runrecords worden afzonderlijk geleverd en vertegenwoordigen geen garantie voor alle echte bestanden.
import pymupdf
def validate(rows, pages):
previous = 0
for level, title, page in rows:
if type(level) is not int or level < 1 or level > previous + 1:
raise ValueError("invalid hierarchy")
if type(page) is not int or not 1 <= page <= pages:
raise ValueError("invalid destination")
if not isinstance(title, str) or not title.strip():
raise ValueError("empty title")
previous = level
return rows
with pymupdf.open() as doc:
for _ in range(3):
doc.new_page()
rows = [[1, "Chapter", 1], [2, "Section", 2], [1, "Appendix", 3]]
doc.set_toc(validate(rows, doc.page_count))
assert doc.get_toc() == rows
assert len(doc.get_toc()) == 3
for bad in [[[2, "Bad", 1]], [[1, "Bad", 99]], [[1, "", 1]]]:
try:
validate(bad, doc.page_count)
except ValueError:
pass
else:
raise AssertionError("invalid outline accepted")
Verwerkingsregels voor legale en illegale inbreng
Correcte invoer moet voldoen aan: een lijst met triples met doorlopende niveaus en paginanummers in het bereik [1, doc.page_count]. [[1, "引言", 1], [2, "背景", 2], [1, "方法", 5]] is bijvoorbeeld legaal, het tweede niveau verschijnt na het eerste niveau en voldoet aan de syntaxis van de PDF-contouren.
Veelvoorkomende onjuiste invoer is onder meer:
- Niveaus van 0 of negatief
- Paginanummer is 0
- Paginanummers overtreffen het totale aantal pagina's
- De titel is een lege string of bevat slechts een spatie
De afhandelingsmethoden voor deze situaties zijn als volgt:
- Sla pagina's over met ongeldige pagina's en registreer waarschuwingen.
- Plaatsvervangers zoals
[untitled]bewaren voor lege titels om structurele integriteit te behouden. - Onderbreek de resolutie van de hele map niet door één enkele fout.
Voor gevallen met niveaus kleiner dan 1 moeten twee strategieën worden overwogen: de samenvatting van het voorbeeld pleit voor het afwijzen van illegale niveaus en het niet automatisch corrigeren ervan, terwijl de regels in de tekst 1 handhaven. De keuze tussen de twee is aan je eigen proces. Het moet ook worden opgemerkt dat deze regels zijn ontworpen om de robuustheid van downstreamprocessen te waarborgen en geen verplichte vereisten zijn van de PDF-standaard. Tests tonen aan dat wanneer paginanummers buiten de grenzen gaan, PyMuPDF waarschuwingen afdrukt maar geen uitzonderingen geeft, dus de validatiefunctie moet actief filteren en kan niet vertrouwen op bibliotheekgedrag.
📊 Kernvergelijking
De resultaten en aanbevolen afhandelingsmethoden voor get_toc() variëren afhankelijk van het document:
| Documentstatus | get_toc()-resultaat | Aanbevolen hantering |
|---|---|---|
| Gebookmarkt en structureel legaal | Stuur de tripletlijst terug | Direct na verificatie gebruiken |
| Bladwijzers bestaan, maar de hiërarchie of het paginanummer is abnormaal | Geeft een lijst van uitzonderingen terug | Filter en registreer logboeken, en zet over op handmatig werk wanneer nodig |
| De visuele versie heeft een inhoudsopgavepagina maar geen bladwijzer | Terug naar lege lijst | Overschakelen naar tekstlay-outanalyse |
| Herschik documenten zoals EPUB | Het paginanummerformaat is (hoofdstuk, pno) | Deze logica voor verificatie van paginanummers is niet van toepassing en vereist speciale verwerking |
Acceptatiecriteria en Grenzen voor handmatige beoordeling
De onderstaande tabel richt zich uitsluitend op de extractiefase van PDF-catalogusmetadata:
| Observeer het fenomeen | Beslissing om de zaak af te handelen | Of automatisering geschikt is |
|---|---|---|
| Het paginanummer is 0 of groter dan het totale aantal pagina's | Gooi de invoer weg en registreer deze | Ja |
| Niveaus kleiner dan 1 of niet-gehele getallen | Behandel volgens de bovenstaande regels (zie vorige uitleg) | Ja |
| Titels zijn ofwel volledig blanco of puur symbolisch | Vervang door [untitled] | Ja |
| Springniveaus (bijv. 1 tot 3) | Behou de oorspronkelijke lagen zonder de middelste lagen in te vullen | Ja (structureel legaal) |
| Dezelfde titel komt overeen met meerdere verschillende paginanummers | Gemarkeerd als ambigu, omgezet naar handmatig | Nee |
| Meer dan 200 vermeldingen zonder hiërarchische wijzigingen | Vermoedelijke OCR-misidentificatie vereist handmatige verificatie | Nee |
| Bevat externe URI- of JavaScript-acties | Filter niet-pagina-redirects eruit | Ja (Beveiligingsbeleid) |
| Herschik documenten zoals EPUB, paginanummer (hoofdstuk, pno) | Deze logica voor het valideren van paginanummers is niet van toepassing | Nee (vereist speciale behandeling) |
Let op dat de codedemonstratie alleen de structurele legaliteit controleert; end-to-end effecten moeten ook gecombineerd worden met rendering om de nauwkeurigheid van sprongen te verifiëren.
🎯 Welke methode past bij jou?
Als je mappen moet batch-extraheren
Voer eerst structurele validatie uit op de resultaten van get_toc(), schrijf deze vervolgens in volgende workflows en houd logs bij ter verificatie.
Als je PDF visueel een inhoudsopgave heeft maar leeg is geëxtraheerd
Probeer get_toc() niet herhaaldelijk; schakel over op tekstlay-out analyse en -verwerking.
Als je directoryvermelding dezelfde naam heeft maar verschillende pagina's
Controleer deze vermeldingen handmatig; selecteer niet automatisch een van de paginanummers.
Als je documenten wilt overdragen aan het vertaalproces,
Controleer eerst de juiste structuur en paginanummers voordat je vertaalt om verwarring in de alinea's te voorkomen.
❓ Veelgestelde Vragen (FAQ)
1. Waarom begint het paginanummer op 1, terwijl paginaindexen meestal op 0 beginnen?
Bladwijzers paginanummers zijn fysieke paginanummers die beginnen op 1, terwijl paginaindexen in bibliotheken zoals PyMuPDF meestal vanaf 0 beginnen. Dit verschil is belangrijk bij conversie, anders kunnen paginanummers niet goed uitgelijnd zijn.
2. get_toc(): Duidt het teruggeven van een lege lijst per se op een bestandsprobleem?
Niet per se. Sommige PDF's hebben visueel een inhoudsopgavepagina maar geen ingebedde bladwijzermetadata, dus het teruggeven van een lege lijst is normaal. In dit geval moet in plaats daarvan tekstlay-outanalyse worden gebruikt.
3. Als het paginanummer buiten de grenzen valt, rapporteert de bibliotheek dan direct een foutmelding?
Nee. Tests in dit artikel tonen aan dat PyMuPDF waarschuwingen afdrukt wanneer paginanummers buiten de grens gaan, maar geen uitzonderingen werpt, dus de validatiefunctie moet actief filteren.
4. Vereisen hiërarchische sprongen (zoals direct van 1 naar 3) het invullen van de middelste lagen?
De suggestie in het artikel is om de oorspronkelijke hiërarchie te behouden en de middelste lagen niet in te vullen, aangezien deze structuur nog steeds legitiem is.
📝 Samenvatting
De hiërarchie en paginanummers van PDF-mappen moeten worden gecontroleerd voordat ze worden gebruikt, dus de oorspronkelijke output van get_toc() kan niet direct als een betrouwbare structuur worden beschouwd. Bij het tegenkomen van ambiguïteiten of het ontbreken van bladwijzers, schakel dan direct over op handmatig werk of andere methoden om downstream procesfouten te voorkomen.
Ervaar nu: upload je document om te beginnen met vertalen, waarbij je de originele opmaak behoudt
Referenties en Volgende Stappen
De volgende stap is het voorbereiden van een test-PDF met bekende directoryproblemen, het uitvoeren van het bovenstaande verificatiescript en het berekenen van het aandeel van verschillende anomalieën. Als er vaak hiërarchische sprongen of paginanummer-offsets zijn, overweeg dan een stap voor de reconstructie van de inhoudsopgave vóór de vertaling toe te voegen.
Gebruik deze checklist voor documentvertaling
Controleer eerst zorgvuldig de paginavolgorde, bronlocatie en tekstintegriteit, en dien vervolgens hetzelfde desensitisatievoorbeeld in bij het vertaalproces. Na de vertaling is het nog steeds nodig om te controleren of de titel, hoofdtekst en bijschriften correct overeenkomen; het is niet voldoende om alleen te oordelen op de soepelheid van de tekst.
OmniDoc biedt portalen voor documentvertaling in meerdere formaten, en de officiële website introduceert OCR, glossaria en tweetalige referentiefuncties. Voor teams die direct vanaf de bestanden willen beginnen, is dit een pad dat de moeite waard is om te evalueren met echte monsters. Gebruik alstublieft het geanonimiseerde bestand dat u hebt geautoriseerd om te uploaden en de resultaten te verifiëren met de checklist in dit artikel. Dit beweert niet dat OmniDoc gebruikmaakt van de open-source bibliotheek of interne algoritmen uit dit artikel, noch vervangt het productprestatietesten door voorbeelden.


