PDFlibPas pretvarja vsebino PDF v dve urejljivi obliki brez avtomatizacije Officea. ExportPageMarkdown in ExportDocumentMarkdown vrneta semantični Markdown s sklepanimi naslovi, urejenimi in neurejenimi seznami ter tabelami z navpičnicami, medtem ko SaveDOCXToFile in SaveDOCXToStream zapišeta paket WordprocessingML z odstavki, naslovi, izvorno oštevilčenimi seznami, zaznanimi tabelami, oblikovanjem pisave, prelomi strani in postavljenimi slikami PNG
Oba tečeta v celoti v Pascalu, na strežniku, brez nameščenega Worda in brez COM. Prav ta omejitev je razlog, da funkcija obstaja v knjižnici PDF in ne v namiznem orodju
Zakaj je "PDF v Word" resnično zahtevno?
Ker stran PDF ne vsebuje odstavkov. Vsebuje operatorje za izpis besedila, ki postavijo nize glifov na koordinate, v katerem koli vrstnem redu jih je izdelovalec zapisal, brez obveze, da bi nakazal, da dva niza pripadata istemu stavku, kaj šele isti postavki seznama. Format je bil zasnovan, da natančno opiše natisnjeno stran, in to mu uspe tako, da zavrže strukturo, ki je stran ustvarila
Zato mora vsak pretvornik obnoviti tisto, kar je generator zavrgel. Združevanje vrstic izhaja iz navpičnega razmika in poravnave osnovnice. Meje odstavkov izhajajo iz sprememb razmika in zamikov. Naslov je vrstica, katere pisava je večja ali težja od telesa besedila in ki stoji ločeno od tega, kar sledi. Seznam je zaporedje odstavkov, ki se začnejo z znakom za oznako ali vzorcem številke. Tabela je mreža besedilnih blokov, katerih robovi se poravnajo po vrsticah in stolpcih. Vsako od tega je sklepanje, sklepanje pa pomeni dober rezultat na dokumentih, ki sledijo običajnim tipografskim konvencijam, in povprečnega na dokumentih, ki jim ne sledijo
Označeni PDF-ji so izjema, in to velika. Ko dokument nosi drevo strukture, so vloge odstavka, naslova, seznama in tabele zabeležene in ne uganjene, zato se delo za dostopnost, opisano v strukturi dostopnosti označenega PDF, obrestuje tudi v kakovosti pretvorbe. Če nadzorujete izdelovalca, je označevanje lastnega izhoda ena sama najbolj vplivna stvar, ki jo lahko storite za vsakogar, ki ga bo kasneje moral pretvoriti
Izvoz v Markdown, stran za stranjo
Pot Markdown je tista, po kateri sežete, kadar je cilj besedilni cevovod: dokumentacijsko mesto, iskalni indeks, korpus za priklic za asistenta. Možnosti so bitna maska: PDF_MARKDOWN_INCLUDE_PAGE_MARKERS, PDF_MARKDOWN_DETECT_HEADINGS, PDF_MARKDOWN_PRESERVE_STYLES, pri čemer PDF_MARKDOWN_DEFAULT združi vse tri
var
Pdf: TPDFlib;
Md: WideString;
begin
Pdf := TPDFlib.Create;
try
Pdf.LoadFromFile('handbook.pdf', '');
// Ena stran, kot niz
Md := Pdf.ExportPageMarkdown(1, PDF_MARKDOWN_DEFAULT);
// Obseg strani, pretočen na disk kot UTF-8 brez BOM
Pdf.SaveMarkdownToFile('1-40',
PDF_MARKDOWN_DETECT_HEADINGS or PDF_MARKDOWN_PRESERVE_STYLES,
'handbook.md');
finally
Pdf.Free;
end;
end;
Oznake strani se obrestujejo pri delu s priklicem. Kos besedila, ki nosi stran, s katere izvira, je mogoče natančno navesti, bralec, ki sledi navedbi, pa pristane točno tam, kjer trditev dejansko je. Izklopite jih, kadar je Markdown namenjen človeškemu branju, kjer so meje strani iz izvorne postavitve le šum
Pretočne vstopne točke so pomembne pri velikih dokumentih. SaveMarkdownToStream in SaveMarkdownToFile zapisujeta UTF-8 eno stran naenkrat in ne izmedpomnita celotnega izhoda, tako da 900-stranski priročnik najprej ne postane 900-stranski niz v pomnilniku. Tudi odsotnost oznake vrstnega reda bajtov je namerna: BOM v datoteki Markdown zmede presenetljivo veliko generatorjev statičnih spletnih strani in orodij za primerjavo
DOCX brez Officea na napravi
Zapisovalnik DOCX sam ustvari paket: vnose ZIP, zapisane kot surovi Deflate s preverjanjem CRC, dele WordprocessingML in razmerja, ki jih povezujejo. Nič ne kliče v Word, kar pomeni, da pretvorba teče na strežniku brez grafičnega vmesnika, znotraj storitvenega računa, v vsebniku, na vseh mestih, kjer je avtomatizacija Officea bodisi nelicencirana, nestabilna ali prepovedana
var
Pdf: TPDFlib;
Target: TFileStream;
begin
Pdf := TPDFlib.Create;
Target := TFileStream.Create('handbook.docx', fmCreate);
try
Pdf.LoadFromFile('handbook.pdf', '');
Pdf.SaveDOCXToStream('1-40',
PDF_DOCX_INCLUDE_IMAGES or PDF_DOCX_DETECT_HEADINGS or
PDF_DOCX_PRESERVE_STYLES or PDF_DOCX_PRESERVE_PAGE_BREAKS,
Target);
finally
Target.Free;
Pdf.Free;
end;
end;
Slikovni podatki se zapisujejo med obdelavo vsake strani in ne zbirajo in dodajajo na koncu, zato vrhunska poraba pomnilnika sledi eni strani in ne celotnemu dokumentu. Izrecen vrstni red strani je ohranjen, izbrana stran PDF pa je po pretvorbi obnovljena, kar je pomembno, kadar je izvoz en korak znotraj daljšega opravila, ki je imelo stran izbrano iz drugih razlogov
Kaj vam prinese deterministično pakiranje?
Ponovljivost od bajta do bajta. Dve pretvorbi istega vhoda z istimi možnostmi ustvarita isti paket, kar pomeni, da lahko izračunate razpršitev izhoda za zaznavanje sprememb, primerjate dve gradnji ustvarjenega dokumenta in predpomnite agresivno, ne da bi vas skrbelo, da je enak vhod ustvaril drugačen izdelek
Avtomatizacija Officea tega ne more obljubiti. Vgrajuje časovne žige, identifikatorje revizij in od naprave odvisne metapodatke, zato se isti dokument, pretvorjen dvakrat, razlikuje na način, ki onemogoči razpršitev. Ista logika poganja deterministične identifikatorje datotek, obravnavane v deterministični ID PDF za ponovljive gradnje: kadar je izhod ponovljiv, preverjanje postane primerjava namesto pregleda
Kje je izhod dober, in kje ni
Bodite iskreni s svojimi uporabniki glede tega, saj se kakovost pretvorbe spreminja bolj glede na vhod kot glede na pretvornik. Označeni PDF-ji in čisto ustvarjeni poslovni dokumenti, računi, poročila, pogodbe, se pretvorijo dobro: naslovi pristanejo kot naslovi, tabele preživijo, seznami se v Wordu pravilno preštevilčijo. Dvostolpčne akademske postavitve se pretvorijo sprejemljivo, če je geometrija stolpcev pravilna. Tabele, ki segajo čez prelome strani, se ponovno sestavijo po sklepanju in se včasih razdelijo. Močno oblikovano tržno gradivo, kjer je besedilo postavljeno zaradi vizualnega učinka in ne v vrstnem redu branja, se pretvori slabo, in nobena količina sklepanja tega ne popravi
Skenirani dokumenti so povsem ločen primer. Stran, ki je ena velika slika, ne vsebuje besedilnih objektov, zato ni ničesar za izvoz, dokler ne obstaja besedilna plast; pot OCR, ki jo ustvari, je predpogoj in ne možnost. Pred zagonom velike serije preglejte ducat reprezentativnih datotek in si oglejte izhod, razmislite pa tudi o naštevanju elementov strani, kot je opisano v iskanju besedila in naštevanju elementov strani, da vidite, kaj strani dejansko vsebujejo
Za cevovode asistentov in priklica je pot Markdown ponavadi boljša tarča: naslovi postanejo meje kosov, tabele ostanejo berljive kot tabele z navpičnicami, oznake strani pa vsakemu kosu dajo lokacijo, na katero se je mogoče sklicevati. Za človeško urejanje je odgovor DOCX, ker uporabnik ne želi besedila, temveč zmožnost, da ga spremeni
PDFlibPas je knjižnica PDF za Delphi, C++Builder in Lazarus z ujemajočima se vmesnikoma DLL in ActiveX, zato so isti klici za izvoz na voljo tudi iz C#, C++ ali skriptnih gostiteljev. Celotna dokumentacija in preizkusna gradnja sta na strani izdelka PDFlibPas