PDFlibPas pretvara PDF sadržaj u dva izmenljiva formata bez automatizacije Office-a. ExportPageMarkdown i ExportDocumentMarkdown vraćaju semantički Markdown sa zaključenim naslovima, numerisanim i nenumerisanim listama i tabelama u pipe formatu, dok SaveDOCXToFile i SaveDOCXToStream upisuju WordprocessingML paket koji sadrži pasuse, naslove, izvorno numerisanje lista, prepoznate tabele, stilizovanje fonta, prelome stranica i pozicionirane PNG slike
Oba rade u potpunosti u Pascal-u, na serveru, bez instaliranog Word-a i bez COM-a. Upravo to ograničenje je razlog zašto ova funkcija postoji u PDF biblioteci, a ne u desktop alatu
Zašto je „PDF u Word” zaista teško?
Zato što PDF stranica ne sadrži pasuse. Ona sadrži operatore za prikazivanje teksta koji postavljaju nizove glifova na koordinate, bilo kojim redosledom kojim ih je proizvođač emitovao, bez obaveze da naznače da dva niza pripadaju istoj rečenici, a kamoli istoj stavci liste. Format je osmišljen da tačno opiše odštampanu stranicu, i u tome uspeva tako što odbacuje strukturu koja je tu stranicu proizvela
Zato svaki konvertor mora da rekonstruiše ono što je generator odbacio. Grupisanje redova dolazi iz vertikalnog razmaka i poravnanja bazne linije. Granice pasusa dolaze iz promena razmaka i uvlačenja. Naslov je red čiji je font veći ili deblji od tela teksta i koji se izdvaja od onoga što sledi. Lista je niz pasusa koji počinju znakom nabrajanja ili obrascem broja. Tabela je mreža tekstualnih blokova čije se ivice poklapaju kroz redove i kolone. Svaka od ovih stvari je zaključivanje, a zaključivanje znači dobar rezultat na dokumentima koji prate uobičajene tipografske konvencije, a osrednji na onima koji ih ne prate
Označeni (tagged) PDF-ovi su izuzetak, i to veliki. Kada dokument nosi stablo strukture, uloge pasusa, naslova, liste i tabele su zabeležene, a ne pogađane, zbog čega se rad na pristupačnosti opisan u strukturi pristupačnosti označenog PDF-a isplati i kroz kvalitet konverzije. Ako kontrolišete proizvođača, označavanje sopstvenog izlaza je jedina stvar sa najvećim efektom koju možete uraditi za svakog ko kasnije mora da ga konvertuje
Izvoz u Markdown, stranicu po stranicu
Putanja ka Markdown-u je ona kojoj treba pribeći kada je odredište tekstualni pipeline: sajt sa dokumentacijom, indeks za pretragu, korpus za pretragu (retrieval) namenjen asistentu. Opcije su bitna maska: PDF_MARKDOWN_INCLUDE_PAGE_MARKERS, PDF_MARKDOWN_DETECT_HEADINGS, PDF_MARKDOWN_PRESERVE_STYLES, pri čemu PDF_MARKDOWN_DEFAULT kombinuje sve tri
var
Pdf: TPDFlib;
Md: WideString;
begin
Pdf := TPDFlib.Create;
try
Pdf.LoadFromFile('handbook.pdf', '');
// Jedna stranica, kao niska
Md := Pdf.ExportPageMarkdown(1, PDF_MARKDOWN_DEFAULT);
// Opseg stranica, strimovan na disk kao UTF-8 bez BOM-a
Pdf.SaveMarkdownToFile('1-40',
PDF_MARKDOWN_DETECT_HEADINGS or PDF_MARKDOWN_PRESERVE_STYLES,
'handbook.md');
finally
Pdf.Free;
end;
end;
Oznake stranica se isplate u poslu pretrage (retrieval). Deo teksta koji nosi podatak sa koje stranice potiče može se precizno citirati, a čitalac koji prati citat sleti tačno tamo gde se tvrdnja zaista nalazi. Isključite ih kada je Markdown namenjen čitanju od strane ljudi, gde su granice stranica iz izvornog rasporeda samo šum
Ulazne tačke za strimovanje su bitne za velike dokumente. SaveMarkdownToStream i SaveMarkdownToFile upisuju UTF-8 stranicu po stranicu i ne baferuju kompletan izlaz, tako da priručnik od 900 stranica ne postaje najpre niska od 900 stranica u memoriji. Odsustvo oznake redosleda bajtova (BOM) je takođe namerno: BOM u Markdown fajlu zbunjuje iznenađujući broj generatora statičkih sajtova i alata za poređenje (diff)
DOCX bez Office-a na mašini
Modul za pisanje DOCX-a sam proizvodi paket: ZIP unose upisane kao sirovi Deflate sa CRC proverama, WordprocessingML delove i relacije koje ih povezuju. Ništa ne poziva Word, što znači da konverzija radi na serveru bez grafičkog interfejsa, unutar servisnog naloga, u kontejneru, na svim mestima gde je automatizacija Office-a ili nelicencirana, nestabilna ili zabranjena
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;
Podaci o slikama se upisuju čim se svaka stranica obradi, umesto da se skupljaju i dodaju na kraju, tako da vršna memorija prati jednu stranicu, a ne ceo dokument. Eksplicitan redosled stranica se čuva, a izabrana PDF stranica se posle toga vraća, što je bitno kada je izvoz samo jedan korak unutar duljeg posla koji je imao izabranu stranicu iz drugih razloga
Šta vam donosi deterministično pakovanje?
Reprodukovanje bajt po bajt. Dve konverzije istog ulaza sa istim opcijama proizvode isti paket, što znači da možete heširati izlaz da biste otkrili promenu, uporediti (diff) dve verzije generisanog dokumenta i agresivno kešovati bez straha da je identičan ulaz proizveo drugačiji artefakt
Automatizacija Office-a to ne može da obeća. Ona ugrađuje vremenske oznake, identifikatore revizija i metapodatke zavisne od mašine, tako da se isti dokument konvertovan dva puta razlikuje na način koji onemogućava heširanje. Ista logika stoji iza determinističkih identifikatora fajla razmotrenih u determinističkim PDF ID-jevima za reprodukovane build-ove: kada je izlaz reprodukovan, provera postaje poređenje, a ne inspekcija
Gde je izlaz dobar, a gde nije
Budite iskreni prema svojim korisnicima po ovom pitanju, jer kvalitet konverzije zavisi više od ulaza nego od konvertora. Označeni PDF-ovi i čisto generisani poslovni dokumenti, fakture, izveštaji, ugovori, konvertuju se dobro: naslovi ostaju naslovi, tabele opstaju, liste se ispravno prenumerišu u Word-u. Akademski rasporedi sa dve kolone konvertuju se prihvatljivo ako je geometrija kolona pravilna. Tabele koje se protežu preko preloma stranica ponovo se sastavljaju zaključivanjem i ponekad se dele. Snažno dizajniran marketinški materijal, gde je tekst postavljen radi vizuelnog efekta, a ne po redosledu čitanja, konvertuje se loše, i nikakva količina zaključivanja to ne popravlja
Skenirani dokumenti su potpuno poseban slučaj. Stranica koja je jedna velika slika ne sadrži tekstualne objekte, pa nema šta da se izveze dok ne postoji tekstualni sloj; OCR putanja koja ga proizvodi je preduslov, a ne opcija. Pre pokretanja velike serije, uzorkujte desetak reprezentativnih fajlova i pogledajte izlaz, i razmotrite da prvo nabrojite elemente stranice, kako je opisano u pretrazi teksta i nabrajanju elemenata stranice, kako biste videli šta stranice zaista sadrže
Za pipeline-ove asistenata i pretrage, putanja ka Markdown-u je obično bolji cilj: naslovi postaju granice delova (chunk), tabele ostaju čitljive kao tabele u pipe formatu, a oznake stranica daju svakom delu lokaciju koja se može citirati. Za uređivanje od strane ljudi, DOCX je odgovor, jer ono što korisnik želi nije tekst, već mogućnost da ga izmeni
PDFlibPas je PDF biblioteka za Delphi, C++Builder i Lazarus sa odgovarajućim DLL i ActiveX interfejsima, tako da su isti pozivi za izvoz dostupni i iz C#, C++ ili skript hostova. Potpuna dokumentacija i probna verzija nalaze se na stranici PDFlibPas Delphi PDF biblioteke