Šķîþ ţö ḿàîñ çöñţéñţ

É-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 ƃéçöḿéš à ţàƃļé ĝŕöüþ öƒ ŕöŵš àñđ çéļļš (ŢĤ → ĥéàđéŕ, ŢĐ → çéļļ), H1H6 ƃéçöḿé ĥéàđîñĝš, 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 çöñšüḿé ĝéöḿéţŕý àñđ ŕàšţéŕš ŕàţĥéŕ ţĥàñ ÞĐƑ, ţĥé šàḿé šţŕüçţüŕé ŕéçöṽéŕý îš àṽàîļàƃļé ţö àñý ƒöŕḿàţ ţĥàţ çàñ þŕöđüçé ţĥéḿ.

Ŕéļàţéđ