É-08: Đöçüḿéñţ šţŕüçţüŕé ţîéŕš
Šüḿḿàŕý
Šöḿé ƒöŕḿàţš šţàţé ţĥéîŕ öŵñ ļöĝîçàļ šţŕüçţüŕé; šöḿé öñļý îḿþļý îţ. Ŵĥéŕé à ƒöŕḿàţ çàŕŕîéš ĥéàđîñĝš, þàŕàĝŕàþĥš, àñđ ţàƃļéš àš ḿàŕķüþ, ţĥé ŕéàđéŕ ŕéàđš ţĥéḿ. Ŵĥéŕé îţ đöéš ñöţ (ÞĐƑ îš ţĥé àŕçĥéţýþé), šţŕüçţüŕé îš ŕéçöṽéŕéđ ţĥŕöüĝĥ à ţîéŕéđ ḿöđéļ, îñ đéçŕéàšîñĝ öŕđéŕ öƒ àüţĥöŕîţý: ţĥé đöçüḿéñţ'š öŵñ ţàĝĝéđ šţŕüçţüŕé ţŕéé ŵĥéŕé îţ éẋîšţš, ĝéöḿéţŕîç îñƒéŕéñçé ƒŕöḿ þöšîţîöñš öţĥéŕŵîšé, àñđ àñ ḾĻ ļàýöüţ ḿöđéļ àƃöṽé ƃöţĥ ƒöŕ ŵĥàţ ĝéöḿéţŕý çàññöţ ŕéàçĥ. Éàçĥ ţîéŕ ƒàļļš ţĥŕöüĝĥ çļéàñļý ţö ţĥé öñé ƃéļöŵ, šö à đöçüḿéñţ àļŵàýš þàŕšéš.
ÞĐƑ îš ŕéàđ öüţ-öƒ-çöŕé ƃý ÞĐƑîüḿ, ţĥŕöüĝĥ ţŵö ƃàçķéñđš ţĥàţ šĥàŕé ţĥéîŕ çöñţéñţ-þŕöđüçîñĝ ļöĝîç:
- Ñàţîṽé:
kapi-pdfium, à ƒîŕšţ-þàŕţý Ḿöđé-Ç þļüĝîñ (É-05) ļîñķîñĝ ÞĐƑîüḿ ṽîà çĝö àñđ ŕüññîñĝ àš àñ îšöļàţéđ đàéḿöñ, šö à ḿàļƒöŕḿéđ-ÞĐƑ çŕàšĥ đîéš ŵîţĥ ţĥé šüƃþŕöçéšš ŕàţĥéŕ ţĥàñ ŵîţĥkapi. - Ƃŕöŵšéŕ: à
WasmReader(ƃüîļđ-ţàĝĝéđjs) ţĥàţ ƃŕîđĝéš Ĝö-ŴÀŠḾ ţö à ÞĐƑîüḿ ŴéƃÀššéḿƃļý ḿöđüļé ļöàđéđ ƃý ţĥé ŵéƃ àþþ, ĝîṽîñĝ ţĥé îñ-ƃŕöŵšéŕ Ļàƃ ţĥé šàḿé éẋţŕàçţîöñ ŵîţĥöüţ à šéŕṽéŕ.
Ƃöţĥ éḿîţ ţĥé šàḿé Part šţŕéàḿ: þöšîţîöñéđ ţéẋţ Ƃļöçķš çàŕŕýîñĝ à
GeometryAnnotation (ƃöüñđîñĝ ƃöẋ, öþţîöñàļļý þéŕ-ĝļýþĥ ƃöẋéš), ĝŕöüþéđ îñţö
ļîñéš ƃý à šĥàŕéđ àļĝöŕîţĥḿ, ŵîţĥ šţŕüçţüŕé ŕéçöṽéŕéđ ţĥŕöüĝĥ ţĥé ţîéŕš. ÞĐƑîüḿ
îš ţĥé öñļý ÞĐƑ þàţĥ öñ éṽéŕý þļàţƒöŕḿ; ţĥéŕé îš ñö ĥàñđ-ŕöļļéđ þüŕé-Ĝö ŕéàđéŕ
ƃéšîđé îţ.
Çöñţéẋţ
À ƒàîţĥƒüļ ÞĐƑ ŕéàđéŕ ñééđš ḿöŕé ţĥàñ ƃýţé éẋţŕàçţîöñ. ÞĐƑš éñçöđé ţéẋţ ŵîţĥ ƒöñţ-þŕöĝŕàḿ ĝļýþĥ îñđîçéš (ÇÎĐ/Ţýþé0, çöḿḿöñ ƒöŕ ÇĴĶ) ţĥàţ à ñàîṽé šçàññéŕ ĝàŕƃļéš; çöŕŕéçţ éẋţŕàçţîöñ ŕéǫüîŕéš à ŕéàļ ƒöñţ àñđ éñçöđîñĝ éñĝîñé. ÞĐƑîüḿ îš ţĥàţ éñĝîñé, ƃüţ îţ îš à ļàŕĝé Ç++ çöđéƃàšé ŵîţĥ ţŵö çöñšéǫüéñçéš ţĥé ƒŕàḿéŵöŕķ ḿüšţ çöñţàîñ:
- Ñàţîṽé ŵéîĝĥţ. Ļîñķîñĝ ÞĐƑîüḿ ṽîà çĝö đéƒéàţš þüŕé-Ĝö çŕöšš-çöḿþîļàţîöñ àñđ
îñƒļàţéš éṽéŕý
kapiîñšţàļļ ƒöŕ à çàþàƃîļîţý ḿàñý îñṽöçàţîöñš ñéṽéŕ üšé: ţĥé šàḿé îšöļàţîöñ ŕàţîöñàļé àš ţĥé Okapi ƃŕîđĝé àñđ ţĥé ḾĻ šéĝḿéñţéŕ (Ḿ-02). ÞĐƑ ţĥéŕéƒöŕé ļîṽéš îñ à þļüĝîñ, ñöţ îñ ţĥé ƒŕàḿéŵöŕķ. - Çŕàšĥ šüŕƒàçé. Ḿàļƒöŕḿéđ ÞĐƑš àŕé à çļàššîç þàŕšéŕ-çŕàšĥ ṽéçţöŕ. Ŕüññîñĝ ţĥé ŕéàđéŕ îñ à šüƃþŕöçéšš đàéḿöñ çöñţàîñš à çŕàšĥ ţö ţĥàţ þŕöçéšš.
Ƃéýöñđ ţéẋţ, ţĥé ṽîšüàļ éđîţöŕ (Š-06) àñđ ţĥé ƃŕöŵšéŕ Ļàƃ ñééđ éàçĥ ţéẋţ ƒŕàĝḿéñţ'š þöšîţîöñ öñ ţĥé þàĝé, àñđ đöŵñšţŕéàḿ þŕöçéššîñĝ ŵàñţš đöçüḿéñţ šţŕüçţüŕé (ŵĥîçĥ ļîñéš àŕé ĥéàđîñĝš, ŵĥîçĥ ƃļöçķš ƒöŕḿ à ţàƃļé), šö ţĥàţ à ţŕàñšļàţéđ đöçüḿéñţ çàñ ƃé ŕéƒļöŵéđ àñđ šö ţĥàţ ţàƃļé çéļļš àŕé ţŕàñšļàţéđ àš çéļļš. ÞĐƑ çàŕŕîéš ñöñé öƒ ţĥîš üñîƒöŕḿļý: šöḿé ÞĐƑš àŕé ţàĝĝéđ ŵîţĥ àñ éẋþļîçîţ ļöĝîçàļ šţŕüçţüŕé ţŕéé; ḿöšţ àŕé ñöţ, àñđ šţŕüçţüŕé ḿüšţ ƃé îñƒéŕŕéđ ƒŕöḿ ĝéöḿéţŕý.
Đéçîšîöñ
Ţŵö ƃàçķéñđš, öñé çöñţéñţ çöñţŕàçţ
ÞĐƑ ŕéàđîñĝ îš ŕéĝîšţéŕéđ ţĥŕöüĝĥ à ƃüîļđ šþļîţ, šö ţĥé ŕîĝĥţ ƃàçķéñđ îš ŵîŕéđ þéŕ ţàŕĝéţ àñđ ţĥé ƒŕàḿéŵöŕķ çöŕé šţàýš ƒŕéé öƒ ÞĐƑîüḿ:
core/formats/register_pdf_js.go(//go:build js) ŕéĝîšţéŕš ţĥé ƃŕöŵšéŕWasmReader. Îţ îš ŕéàđ-öñļý: ţĥéŕé îš ñö ŵŕîţéŕ, šö éđîţîñĝ ţööļš ƒàîļ çļéàñļý ŕàţĥéŕ ţĥàñ öṽéŕŵŕîţîñĝ ţĥé đöçüḿéñţ ŵîţĥ éẋţŕàçţéđ ţéẋţ.core/formats/register_pdf_other.go(//go:build !js) îš à ñö-öþ. Ñàţîṽé ƃüîļđš ĥàṽé ñö îñ-çöŕé ÞĐƑ ŕéàđéŕ, šö ţĥépdfƒöŕḿàţ îš šüþþļîéđ öñļý ƃý ţĥé îñšţàļļéđkapi-pdfiumþļüĝîñ àţ ŕüñţîḿé, öŕ îš àƃšéñţ ŵîţĥ àñ àçţîöñàƃļé "îñšţàļļ ţĥé þļüĝîñ" éŕŕöŕ.
Ţĥé ñàţîṽé þļüĝîñ îš îţš öŵñ Ĝö ḿöđüļé,
github.com/neokapi/neokapi/plugins/pdfium, öüţšîđé ţĥé ŵöŕķšþàçé šö îţš çĝö àñđ
ÞĐƑîüḿ đéþéñđéñçîéš ñéṽéŕ éñţéŕ àñöţĥéŕ ḿöđüļé'š ƃüîļđ ĝŕàþĥ:
plugins/pdfium/
├── go.mod module …/plugins/pdfium
├── manifest.json Mode-C daemon manifest (declares the pdf format + schema)
├── formats/pdf/schema.json config schema: geometry, glyphs, tier3
├── cmd/kapi-pdfium/main.go daemon entry point (gRPC, Mode C)
└── internal/pdfreader/
├── reader.go ReadParts: fast path + geometry path
└── structtree.go tier-1 tagged struct tree (build-tag-free; runtime-gated)
Ƃöţĥ ƃàçķéñđš þŕöđüçé àñ îđéñţîçàļ Part šţŕéàḿ (à đöçüḿéñţ Layer, þéŕ-þàĝé
Layerš, àñđ Ƃļöçķš) àñđ šĥàŕé ţŵö þîéçéš öƒ ƒŕàḿéŵöŕķ ļöĝîç šö ţĥé ñàţîṽé àñđ
ƃŕöŵšéŕ ŕéšüļţš ḿàţçĥ:
core/formats/pdf.GroupRunsḿéŕĝéš ÞĐƑîüḿ'š þéŕ-ŕéçţ ƒŕàĝḿéñţš (îţ éḿîţš à ƒŕéšĥ ŕéçţ àţ éṽéŕý ḿîđ-ļîñé ƒöñţ öŕ šţýļé çĥàñĝé) îñţö ļîñé-ļéṽéļ ŕüñš, šþļîţţîñĝ öñļý àţ ļàŕĝé ĥöŕîžöñţàļ ĝàþš, ŵĥîçĥ ḿàŕķ à çöļüḿñ öŕ çéļļ ƃöüñđàŕý. Ŵîţĥöüţ îţ à šţýļéđ öŕ îšöļàţéđ ĝļýþĥ ƃéçöḿéš à öñé-çĥàŕàçţéŕ Ƃļöçķ.core/structure.Analyze/core/structure.ToPartsîñƒéŕ ţîéŕ-2 šţŕüçţüŕé.
Ţŵö éẋţŕàçţîöñ ḿöđéš
Ţĥé ŕéàđéŕ ĥàš ţŵö ĝŕàñüļàŕîţîéš, šéļéçţéđ ƃý ţĥé geometry çöñƒîĝ ƒļàĝ
(formats/pdf/schema.json):
- Ƒàšţ þàţĥ (
geometry=false, ţĥé đéƒàüļţ): öñé þļàîñ-ţéẋţ Ƃļöçķ þéŕ þàĝé. Ƒéŵéšţ àļļöçàţîöñš, ñö þöšîţîöñàļ ŵöŕķ; ţĥé ŕîĝĥţ çĥöîçé ƒöŕ ƃàţçĥ ţéẋţ öþéŕàţîöñš šüçĥ àš ŵöŕđ çöüñţš, ḿéḿöŕý ļéṽéŕàĝé, àñđ ţĥé ţööļƃöẋ üţîļîţîéš (Š-04). - Ĝéöḿéţŕý þàţĥ (
geometry=true): öñé Ƃļöçķ þéŕ þöšîţîöñéđ ţéẋţ ŕüñ, éàçĥ çàŕŕýîñĝ àGeometryAnnotation. Ŵîţĥglyphs=true(ŵĥîçĥ îḿþļîéš ĝéöḿéţŕý) éàçĥ Ƃļöçķ àđđîţîöñàļļý çàŕŕîéš þéŕ-çĥàŕàçţéŕ ƃöẋéš ƒöŕ çĥàŕàçţéŕ-þŕéçîšé ĥîĝĥļîĝĥţîñĝ.
Îñđéþéñđéñţ öƒ ţĥé ḿöđé, ţĥé ŕéàđéŕ ḿàþš ţĥé ÞĐƑ Îñƒö đîçţîöñàŕý öñţö ţĥé
çöñţéñţ ḿöđéļ ţĥŕöüĝĥ ţĥé šĥàŕéđ core/docmeta ĥéļþéŕ: Title, Subject, àñđ
Keywords ƃéçöḿé ţŕàñšļàţàƃļé Ƃļöçķš öñ ţĥé ḿéţàđàţà þļàñé, ŵĥîļé Author,
Creator, Producer, CreationDate, àñđ ModDate àŕé ŕéçöŕđéđ àš
pdf:-ñàḿéšþàçéđ þŕöþéŕţîéš öñ ţĥé đöçüḿéñţ ļàýéŕ, ñéṽéŕ ţŕàñšļàţéđ, ķéþţ ƒöŕ
îñšþéçţîöñ. Ţĥîš îš ţĥé šàḿé ḿéţàđàţà ḿéçĥàñîšḿ ţĥé îḿàĝé ŕéàđéŕ üšéš
(Ḿ-07).
Ĝéöḿéţŕý ḿöđéļ àñđ çööŕđîñàţé ƒļîþ
ÞĐƑîüḿ ŕéþöŕţš ƃöẋéš îñ ÞĐƑ üšéŕ šþàçé, ŵĥéŕé ţĥé öŕîĝîñ îš ƃöţţöḿ-ļéƒţ àñđ Ý
îñçŕéàšéš üþŵàŕđ. neokapi'š çöñţéñţ àñđ éđîţöŕ ḿöđéļ üšé à ţöþ-ļéƒţ öŕîĝîñ (Ý
îñçŕéàšéš đöŵñŵàŕđ), ḿàţçĥîñĝ šçŕééñ àñđ ḿöšţ đöçüḿéñţ çööŕđîñàţé šýšţéḿš. Éṽéŕý
ƃöẋ îš ƒļîþþéđ öñçé, àţ éẋţŕàçţîöñ, ŵĥéñ ţĥé þàĝé ĥéîĝĥţ îš ķñöŵñ:
Y_top-left = pageHeight − Y_upper. Ţĥé ƒļîþ îš îḿþļéḿéñţéđ îđéñţîçàļļý àţ àļļ
ţĥŕéé šîţéš (ţĥé ñàţîṽé ƒàšţ àñđ ĝéöḿéţŕý ŕéàđéŕ, ţĥé ñàţîṽé ţàĝĝéđ-ţŕéé ŕéàđéŕ,
àñđ ţĥé ƃŕöŵšéŕ ƃŕîđĝé), àñđ éàçĥ šţàḿþš Origin: "top-left", öŕ ƒàļļš ƃàçķ ţö
"bottom-left" ŵĥéñ ţĥé þàĝé ĥéîĝĥţ îš üñàṽàîļàƃļé. GeometryAnnotation çàŕŕîéš
ţĥé þàĝé ñüḿƃéŕ, ţĥé üñîöñ ƃöüñđîñĝ ƃöẋ, ţĥé öŕîĝîñ, àñđ ţĥé öþţîöñàļ þéŕ-ĝļýþĥ
ƃöẋéš (ţéẋţ þļüš ƃöẋ þéŕ çĥàŕàçţéŕ).
Šţŕüçţüŕé ţîéŕš
Đöçüḿéñţ šţŕüçţüŕé îš ŕéçöṽéŕéđ ţĥŕöüĝĥ ţĥŕéé ţîéŕš, îñ đéçŕéàšîñĝ öŕđéŕ öƒ àüţĥöŕîţý:
| Ţîéŕ | Šöüŕçé | Ŵĥéŕé îţ ŕüñš | Àüţĥöŕîţý |
|---|---|---|---|
| 1: Ţàĝĝéđ šţŕüçţ ţŕéé | Ţĥé đöçüḿéñţ'š öŵñ ļöĝîçàļ šţŕüçţüŕé ţŕéé (Đöçüḿéñţ › Ĥ1 › Þ › Ţàƃļé › ŢŔ › ŢĤ/ŢĐ …) | Ñàţîṽé þļüĝîñ öñļý | Àüţĥöŕîţàţîṽé: ţĥé àüţĥöŕ'š öŵñ ţàĝš |
| 2: Ĝéöḿéţŕîç îñƒéŕéñçé | Ƃļöçķ þöšîţîöñš: ŕöŵ çļüšţéŕîñĝ, çöļüḿñ àļîĝñḿéñţ, ŕéļàţîṽé ļîñé ĥéîĝĥţ | Ñàţîṽé àñđ ƃŕöŵšéŕ | Ĥéüŕîšţîç |
| 3: ḾĻ ļàýöüţ | À ṽîšîöñ ḿöđéļ öṽéŕ ţĥé ŕéñđéŕéđ þàĝé | Ñàţîṽé þļüĝîñ + ĥöšţ | Ĥéüŕîšţîç, ĥîĝĥéšţ ŕéçàļļ |
Ţîéŕ 1 (internal/pdfreader/structtree.go) ŕéàđš à ţàĝĝéđ ÞĐƑ'š šţŕüçţüŕé
ţŕéé đîŕéçţļý: îţ ƃüîļđš à ḿàŕķéđ-çöñţéñţ-ÎĐ → ţéẋţ àñđ ƃöüñđš ḿàþ ƒŕöḿ ţĥé
þàĝé'š ţéẋţ öƃĵéçţš, ŵàļķš ţĥé šţŕüçţ ţŕéé, àñđ ḿàþš éļéḿéñţš öñţö ţĥé çöñţéñţ
ḿöđéļ: Table ƃéçöḿéš à ţàƃļé ĝŕöüþ öƒ ŕöŵš àñđ çéļļš (ŢĤ → ĥéàđéŕ, ŢĐ → çéļļ),
H1–H6 ƃéçöḿé ĥéàđîñĝš, P àñđ îţš ŕéļàţîṽéš ƃéçöḿé þàŕàĝŕàþĥš. Ţĥé
ḿàŕķéđ-çöñţéñţ àççéššöŕš àŕé ÞĐƑîüḿ éẋþéŕîḿéñţàļ ÀÞΚ ţĥàţ ţĥé Ĝö ƃîñđîñĝ ŵîŕéš
öñļý üñđéŕ ţĥé pdfium_experimental ƃüîļđ ţàĝ, àñđ ţĥé ƃüñđļéđ ļîƃŕàŕý éẋþöŕţš
ţĥé šýḿƃöļš, šö ţĥé šĥîþþéđ þļüĝîñ îš ƃüîļţ ŵîţĥ ţĥàţ ţàĝ. Ţĥé çöđé îţšéļƒ
çàŕŕîéš ñö ƃüîļđ ţàĝ: îţ çöḿþîļéš éîţĥéŕ ŵàý àñđ, ŵĥéñ ţĥé éẋþéŕîḿéñţàļ ÀÞÎ
îš üñàṽàîļàƃļé, ŕéţüŕñš "ñö ţàĝĝéđ šţŕüçţüŕé" šö ţĥé ŕéàđéŕ ƒàļļš ţĥŕöüĝĥ ţö ţîéŕ
2. Üñţàĝĝéđ đöçüḿéñţš ƒàļļ ţĥŕöüĝĥ ţĥé šàḿé ŵàý.
Ţîéŕ 2 (core/structure.Analyze) îš ƒöŕḿàţ-àĝñöšţîç: îţ çöñšüḿéš Ƃļöçķš
çàŕŕýîñĝ ĝéöḿéţŕý, çļüšţéŕš ţĥéḿ îñţö ŕöŵš, đéţéçţš ţàƃļéš ŵĥéŕé çéļļš àļîĝñ îñţö
šţàƃļé çöļüḿñš àçŕöšš çöñšéçüţîṽé ŕöŵš, àñđ ţàĝš ŕéḿàîñîñĝ þŕöšé àš ĥéàđîñĝ öŕ
þàŕàĝŕàþĥ ƃý ŕéļàţîṽé ļîñé ĥéîĝĥţ. ToParts éḿîţš ţĥé ŕéšüļţ àš ţĥé šàḿé
ţàƃļé/ĥéàđîñĝ/þàŕàĝŕàþĥ Part šţŕéàḿ à šţŕüçţüŕé-àŵàŕé ŕéàđéŕ þŕöđüçéš
(Ƒ-02), šö ţĥé éẋîšţîñĝ Ḿàŕķđöŵñ àñđ ĤŢḾĻ
ŵŕîţéŕš ŕéñđéŕ ŕéàļ ţàƃļéš ŵîţĥ ñö ÞĐƑ-šþéçîƒîç çöđé. Ƃöţĥ ƃàçķéñđš ŕüñ ţîéŕ 2 àš
ţĥéîŕ ƒàļļƃàçķ, àñđ ƃéçàüšé îţ öþéŕàţéš öñ ĝéöḿéţŕý ŕàţĥéŕ ţĥàñ öñ ÞĐƑ, àñý
ƒöŕḿàţ ţĥàţ çàñ þŕöđüçé þöšîţîöñéđ ƃļöçķš ĝéţš îţ.
Ţîéŕ 3 ŕüñš à ļàýöüţ ḿöđéļ öṽéŕ ţĥé ŕéñđéŕéđ þàĝé ƒöŕ ţĥé çàšéš ĝéöḿéţŕý
çàññöţ ŕéàçĥ: ƃöŕđéŕļéšš ţàƃļéš, ḿüļţî-çöļüḿñ ŕéàđîñĝ öŕđéŕ, šçàññéđ þàĝéš,
ƒîĝüŕé àñđ çàþţîöñ àššöçîàţîöñ. Îţ îš ñöţ þàŕţ öƒ ţĥé ÞĐƑ ƒöŕḿàţ:
îţ öþéŕàţéš öñ à þàĝé ŕàšţéŕ þļüš ƃļöçķš, àñđ šö àþþļîéš ţö àñý ƒöŕḿàţ ţĥàţ çàñ
þŕöđüçé ţĥéḿ (Ḿ-03). Éñàƃļéđ ŵîţĥ
ţĥé tier3 öþţîöñ, ţĥé þļüĝîñ ŕéñđéŕš éàçĥ þàĝé ţö à ÞÑĜ àţ 72 ĐÞÎ (šö ÞĐƑ
þöîñţš ḿàþ 1:1 ţö ŕàšţéŕ þîẋéļš àñđ ţĥé ţéẋţ ĝéöḿéţŕý àļîĝñš) àñđ éḿîţš îţ àš à
Ḿéđîà þàŕţ ḿàŕķéđ vision.PageRasterProperty àļöñĝšîđé ţĥé þàĝé'š ŕàŵ þöšîţîöñéđ
ƃļöçķš, àþþļýîñĝ ñö šţŕüçţüŕé öƒ îţš öŵñ. À ĥöšţ-šîđé ŕéàđéŕ đéçöŕàţöŕ
(host/pluginhost/tier3_reader.go, ŵŕàþþîñĝ éṽéŕý þļüĝîñ ŕéàđéŕ àš à þàšš-ţĥŕöüĝĥ
üñţîļ tier3 îš ŕéǫüéšţéđ) ŕüñš ţĥé ṽîšîöñ ļàýöüţ ḿöđéļ öṽéŕ ţĥé ŕàšţéŕ ṽîà
vision.StructureFromLayout: ţĥé ḿöđéļ'š ŕéĝîöñš àñđ ŕéàđîñĝ öŕđéŕ àŕé
àüţĥöŕîţàţîṽé, ţĥé ƃļöçķš' öŵñ ţéẋţ ƒîļļš ţĥéḿ
(vision.OCRResultFromBlocks, ḿöŕé àççüŕàţé ţĥàñ ŕé-ŕüññîñĝ ÖÇŔ öṽéŕ à ṽéçţöŕ
ÞĐƑ), àñđ table ŕéĝîöñš àŕé ŕéçöñšţŕüçţéđ îñţö ŕöŵ àñđ çöļüḿñ çéļļš. Ţĥé
đéçöŕàţöŕ đéļéţéš ţĥé ŕéñđéŕéđ ŕàšţéŕ àƒţéŕŵàŕđš àñđ, ŵĥéñ ţĥé ṽîšîöñ þļüĝîñ îš
ñöţ îñšţàļļéđ, šţŕîþš ţĥé ŕéǫüéšţ šö ţĥé þļüĝîñ ƒàļļš ƃàçķ ţö ţĥé ĝéöḿéţŕîç ţîéŕ
2, šö ţîéŕ 3 đéĝŕàđéš çļéàñļý ţö ţîéŕ 2, ñéṽéŕ ŵöŕšé. Ƃŕöŵšéŕ ƃüîļđš ĥàṽé ñö
ñàţîṽé ṽîšîöñ éñĝîñé, šö ţîéŕ 3 îš ñàţîṽé-öñļý.
À çöñšéǫüéñçé öƒ ţĥîš đéšîĝñ îš à ñàţîṽé/ƃŕöŵšéŕ àšýḿḿéţŕý: ţĥé ƃŕöŵšéŕ
éẋţŕàçţîöñ çöñţŕàçţ éẋþöšéš öñļý ŕéçţš, ñöţ ţĥé šţŕüçţ ţŕéé, šö ţĥé îñ-ƃŕöŵšéŕ Ļàƃ
àļŵàýš üšéš ţîéŕ 2 éṽéñ ƒöŕ à ţàĝĝéđ ÞĐƑ, ŵĥîļé à ñàţîṽé kapi ŕüñ üšéš ţîéŕ 1.
Ţĥé šţŕüçţüŕé öƒ à ţàĝĝéđ ÞĐƑ çàñ ţĥéŕéƒöŕé đéŕ ƃéţŵééñ ţĥé Ļàƃ àñđ ţĥé ÇĻÎ;
ţĥîš îš đöçüḿéñţéđ àţ ţĥé çàļļ šîţé.
Šţŕüçţüŕé ƒŕöḿ àñ éẋţéŕñàļ çöñṽéŕţéŕ
À đöçüḿéñţ çöñṽéŕţéŕ ţĥàţ ĥàš àļŕéàđý ŕéçöṽéŕéđ ļàýöüţ çàñ ĥàñđ îţš ŕéšüļţ ţö
ţĥé ƒŕàḿéŵöŕķ îñšţéàđ öƒ ţĥé ŕàŵ ƒîļé. Ţŵö ŕéàđéŕš ţàķé ţĥàţ ŕöüţé: docling
ŕéàđš ĐöçļîñĝĐöçüḿéñţ ĴŠÖÑ, ţĥé ļöššļéšš šéŕîàļîžàţîöñ Đöçļîñĝ éḿîţš, àñđ
doclang ŕéàđš ĐöçĻàñĝ ẊḾĻ. Éàçĥ ŵàļķš ţĥé çöñṽéŕţéŕ'š ŕéàđîñĝ öŕđéŕ àñđ ḿàþš
îţš îţéḿš öñţö ţĥé šàḿé çöñţéñţ ḿöđéļ ţĥé ţîéŕš àƃöṽé þŕöđüçé: à ñöŕḿàļîžéđ
ŕöļé öñ ţĥé structure àññöţàţîöñ, ţĥé þŕöṽéñàñçé ƃöẋ öñ à
GeometryAnnotation, þàĝé ĥéàđéŕš àñđ ƒööţéŕš öñ ţĥé ƒüŕñîţüŕé ļàýöüţ ļàýéŕ,
ţàƃļéš àš à ĝŕöüþ öƒ ŕöŵ ĝŕöüþš öƒ çéļļ ƃļöçķš, çàþţîöñš àš çàþţîöñ-ŕöļé ƃļöçķš.
Ƃöţĥ ŕéàđéŕš àŕé ŕéàđ-öñļý; ţĥé çöñṽéŕţéŕ öŵñš îţš ƒîļé, àñđ ţĥé ƒŕàḿéŵöŕķ
ŕé-éḿîţš šţŕüçţüŕé ţĥŕöüĝĥ ţĥé ĐöçĻàñĝ ŵŕîţéŕ öŕ þŕöĵéçţš îţ ţö Ḿàŕķđöŵñ öŕ
ĤŢḾĻ. Ţĥîš îš ţĥé ƒîļé-ƃàšéđ ŵàý ţö çöñšüḿé à çöñṽéŕţéŕ: ŕüñ îţ, šàṽé îţš
öüţþüţ, ŕéàđ ţĥé öüţþüţ.
Đîšţŕîƃüţîöñ
kapi-pdfium ƃüñđļéš ţĥé ÞĐƑîüḿ šĥàŕéđ ļîƃŕàŕý àţ lib/<name> ƃéšîđé ţĥé
ƃîñàŕý îñ ţĥé ŕéļéàšé ţàŕƃàļļ, ƒöüñđ ṽîà àñ ŕþàţĥ ƃàķéđ îñţö ţĥé ƃîñàŕý
(@loader_path/lib öñ ḿàçÖŠ, $ORIGIN/lib öñ Ļîñüẋ, šàḿé đîŕéçţöŕý öñ Ŵîñđöŵš):
ţĥé šàḿé ƃüñđļîñĝ šĥàþé àš ţĥé ḾĻ šéĝḿéñţéŕ þļüĝîñ'š ÖÑÑẊ ŕüñţîḿé
(Ḿ-02) ŕàţĥéŕ ţĥàñ à šţàţîç ļîñķ. Ţàŕƃàļļš àŕé
ƃüîļţ þéŕ þļàţƒöŕḿ öñ ñàţîṽé ŕüññéŕš (çĝö, -tags pdfium_experimental, ÞĐƑîüḿ
þîññéđ ţö à ŕéļéàšé ƃüîļđ), çöšîĝñ-šîĝñéđ, àñđ îñđéẋéđ îñ ţĥé ŕéĝîšţŕý, šö
kapi plugin install pdfium ṽéŕîƒîéš ţĥé đöŵñļöàđ ļîķé àñý öţĥéŕ þļüĝîñ
(É-05). Ţĥé ÇĻÎ'š Ĥöḿéƃŕéŵ ƒöŕḿüļà đéþéñđš öñ ţĥé
þļüĝîñ'š, šö à brew install ƃŕîñĝš îţ àļöñĝ; àñý öţĥéŕ îñšţàļļ àđđš îţ ŵîţĥ
kapi plugin install pdfium; ţĥé đéšķţöþ àþþ îñšţàļļš îţ öñ đéḿàñđ ţĥé ƒîŕšţ
ţîḿé à ÞĐƑ îš öþéñéđ; àñđ ţĥé ƃŕöŵšéŕ šéļƒ-ĥöšţš ÞĐƑîüḿ'š ŴÀŠḾ ñéẋţ ţö ţĥé kapi
ŴÀŠḾ.
Çöñšéǫüéñçéš
- Ţĥé þöŕţàƃļé
kapiƃîñàŕý šţàýš þüŕé-Ĝö, šḿàļļ, àñđ çŕöšš-çöḿþîļàƃļé; ţĥé ÞĐƑîüḿ ñàţîṽé šţàçķ îš çöñƒîñéđ ţö à šéþàŕàţéļý ƃüîļţ, šéþàŕàţéļý îñšţàļļéđ þļüĝîñ, àñđ à ḿàļƒöŕḿéđ ÞĐƑ çàñ çŕàšĥ öñļý ţĥé đàéḿöñ. - Ñàţîṽé àñđ ƃŕöŵšéŕ þŕöđüçé ţĥé šàḿé þöšîţîöñéđ-ţéẋţ
Partšţŕéàḿ ƃéçàüšé ţĥéý šĥàŕéGroupRunsàñđstructure.Analyze/ToParts; ţĥé öñļý îñţéñđéđ đîṽéŕĝéñçé îš ţîéŕ-1 šţŕüçţüŕé, ŵĥîçĥ ţĥé ƃŕöŵšéŕ çàññöţ šéé. - Ĝéöḿéţŕý îš àṽàîļàƃļé ƒöŕ ţĥé ṽîšüàļ éđîţöŕ àñđ ţĥé Ļàƃ ŵîţĥöüţ çĥàñĝîñĝ ţĥé
çöñţéñţ ḿöđéļ: îţ ŕîđéš öñ ţĥé šţàñđ-öƒƒ
GeometryAnnotation, öƒƒ ƃý đéƒàüļţ šö ƃàţçĥ ţéẋţ ŵöŕķ þàýš ñöţĥîñĝ ƒöŕ îţ. - Ţàĝĝéđ đöçüḿéñţš ĝéţ àüţĥöŕ-ƒîđéļîţý šţŕüçţüŕé ƒöŕ ƒŕéé; üñţàĝĝéđ öñéš ĝéţ à ƃéšţ-郃öŕţ ĝéöḿéţŕîç ŕéçöñšţŕüçţîöñ; ţĥé ḾĻ ţîéŕ šîţš àƃöṽé ƃöţĥ ŵîţĥöüţ ŕéŵöŕķîñĝ éîţĥéŕ ƃàçķéñđ, àñđ đéĝŕàđéš ţö ţîéŕ 2 ŵĥéñ îţš þļüĝîñ îš àƃšéñţ.
- Ƃéçàüšé ţîéŕ 2 àñđ ţîéŕ 3 çöñšüḿé ĝéöḿéţŕý àñđ ŕàšţéŕš ŕàţĥéŕ ţĥàñ ÞĐƑ, ţĥé šàḿé šţŕüçţüŕé ŕéçöṽéŕý îš àṽàîļàƃļé ţö àñý ƒöŕḿàţ ţĥàţ çàñ þŕöđüçé ţĥéḿ.
Ŕéļàţéđ
- Ƒ-02: Ţĥé çöñţéñţ ḿöđéļ: Ƃļöçķš, šţàñđ-öƒƒ àññöţàţîöñš, ţàƃļé ĝŕöüþš, àñđ ţĥé šţŕüçţüŕé šţŕéàḿ
ToPartséḿîţš - É-02: Ţĥé ƒöŕḿàţ šýšţéḿ: ĥöŵ ţĥé
pdfƒöŕḿàţ ŕéĝîšţéŕš àñđ đéţéçţš - É-05: Ţĥé þļüĝîñ šýšţéḿ: Ḿöđé-Ç đàéḿöñ đîšçöṽéŕý, ñàţîṽé-šţàçķ îšöļàţîöñ, šîĝñéđ ŕéĝîšţŕý đîšţŕîƃüţîöñ
- Ḿ-02: Šéĝḿéñţàţîöñ: ţĥé þŕéçéđéñţ ƒöŕ îšöļàţîñĝ à ñàţîṽé šţàçķ îñ à ƃüñđļéđ-šĥàŕéđ-ļîƃŕàŕý þļüĝîñ
- Ḿ-03: Ḿüļţîḿöđàļ çöñţéñţ: ţĥé ṽîšîöñ ļàýöüţ ḿöđéļ ţîéŕ 3 çàļļš, àñđ ţĥé ŕàšţéŕ çöñţŕàçţ îţ ŕüñš öñ
- Š-06: Ţĥé ṽîšüàļ éđîţöŕ: ĥöŵ ţĥé éđîţöŕ çöñšüḿéš ĝéöḿéţŕý àñđ šţŕüçţüŕé
plugins/pdfium/: þļüĝîñ ḿöđüļé, ŕéàđéŕš, àñđ ŔÉÀĐḾÉ