Tehnički članak

PDF u Markdown i DOCX u Delphiju uz PDFlibPas

PDFlibPas pretvara sadržaj PDF-a u dva formata koja se mogu uređivati, bez automatizacije Officea. ExportPageMarkdown i ExportDocumentMarkdown vraćaju semantički Markdown s izvedenim naslovima, numeriranim i nenumeriranim popisima te tablicama s okomitim crtama, dok SaveDOCXToFile i SaveDOCXToStream pišu WordprocessingML paket koji sadrži odlomke, naslove, izvorno numeriranje popisa, otkrivene tablice, stiliziranje fontova, prijelome stranica i pozicionirane PNG slike

Oboje se izvodi u potpunosti u Pascalu, na poslužitelju, bez instaliranog Worda i bez COM-a. To je ograničenje razlog zašto ova značajka 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 odlomke. Sadrži operatore za prikaz teksta koji postavljaju nizove glifova na koordinate, bilo kojim redoslijedom kojim ih je proizvođač emitirao, bez ikakve obveze da naznače da dva niza pripadaju istoj rečenici, a kamoli istoj stavci popisa. Format je osmišljen da precizno opiše otisnutu stranicu, i u tome uspijeva tako da odbaci strukturu koja je tu stranicu proizvela

Zato svaki pretvarač mora rekonstruirati ono što je generator odbacio. Grupiranje redaka dolazi iz okomitog razmaka i poravnanja osnovne linije. Granice odlomaka dolaze iz promjena razmaka i uvlačenja. Naslov je redak čiji je font veći ili deblji od tijela teksta i koji se izdvaja od onoga što slijedi. Popis je niz odlomaka koji počinju znakom grafičke oznake ili obrascem broja. Tablica je mreža tekstualnih blokova čiji se rubovi poravnavaju kroz retke i stupce. Svaka je od tih stvari zaključivanje, a zaključivanje znači dobar rezultat na dokumentima koji slijede uobičajene tipografske konvencije, a osrednji na onima koji ih ne slijede

Označeni PDF-ovi su iznimka, i to velika. Kada dokument nosi stablo strukture, uloge odlomka, naslova, popisa i tablice zapisane su, a ne pogađane, i zato se rad na pristupačnosti opisan u članku struktura pristupačnosti označenog PDF-a isplati i u kvaliteti pretvorbe. Ako kontrolirate proizvođača, označavanje vašeg izlaza jedina je stvar s najvećim učinkom koju možete učiniti za svakoga tko ga kasnije mora pretvoriti

Izvoz u Markdown, jedna stranica po jedna

Put prema Markdownu onaj je po koji posegnete kada je odredište tekstualni pipeline: stranica dokumentacije, indeks za pretraživanje, korpus za dohvat za nekog asistenta. Opcije su bitna maska: PDF_MARKDOWN_INCLUDE_PAGE_MARKERS, PDF_MARKDOWN_DETECT_HEADINGS, PDF_MARKDOWN_PRESERVE_STYLES, pri čemu PDF_MARKDOWN_DEFAULT kombinira sve tri

var
  Pdf: TPDFlib;
  Md: WideString;
begin
  Pdf := TPDFlib.Create;
  try
    Pdf.LoadFromFile('handbook.pdf', '');

    // Jedna stranica, kao niz znakova
    Md := Pdf.ExportPageMarkdown(1, PDF_MARKDOWN_DEFAULT);

    // Raspon stranica, strujano 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 opravdavaju svoje postojanje u radu s dohvatom. Komad teksta koji nosi podatak o stranici s koje potječe može se precizno citirati, a čitatelj koji slijedi citat slijeće točno ondje gdje se tvrdnja doista nalazi. Isključite ih kada je Markdown namijenjen ljudskom čitanju, gdje su granice stranica iz izvornog rasporeda samo šum

Ulazne točke za strujanje bitne su kod velikih dokumenata. SaveMarkdownToStream i SaveMarkdownToFile pišu UTF-8 jednu stranicu po jednu i ne spremaju cijeli izlaz u međuspremnik, pa priručnik od 900 stranica prvo ne postane niz od 900 stranica u memoriji. Izostanak oznake redoslijeda bajtova također je namjeran: BOM u Markdown datoteci zbunjuje iznenađujući broj generatora statičkih stranica i alata za usporedbu razlika

DOCX bez Officea na stroju

DOCX zapisivač sam proizvodi paket: ZIP stavke zapisane kao sirovi Deflate s CRC provjerama, dijelove WordprocessingML-a i relacije koje ih povezuju. Ništa ne poziva Word, što znači da se pretvorba izvodi na poslužitelju bez grafičkog sučelja, unutar servisnog računa, u kontejneru, na svim mjestima gdje je automatizacija Officea 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 slika zapisuju se kako se svaka stranica obrađuje, umjesto da se skupljaju i dodaju na kraju, pa vršna potrošnja memorije prati jednu stranicu, a ne cijeli dokument. Eksplicitni redoslijed stranica čuva se, a odabrana PDF stranica vraća se nakon toga, što je bitno kada je izvoz samo jedan korak unutar dužeg zadatka koji je imao odabranu stranicu iz drugih razloga

Što vam donosi deterministički paket?

Ponovljivost bajt po bajt. Dvije pretvorbe istog ulaza s istim opcijama proizvode isti paket, što znači da izlaz možete hashirati radi otkrivanja promjena, usporediti dvije izgradnje generiranog dokumenta i agresivno predmemorirati bez straha da je identičan ulaz proizveo drugačiji artefakt

Automatizacija Officea to ne može jamčiti. Ugrađuje vremenske oznake, identifikatore revizija i metapodatke ovisne o stroju, pa se isti dokument pretvoren dvaput razlikuje na načine koji onemogućuju hashiranje. Isto razmišljanje stoji iza determinističkih identifikatora datoteka opisanih u članku deterministički PDF ID-jevi za reproducibilne izgradnje: kada je izlaz reproducibilan, provjera postaje usporedba umjesto inspekcije

Gdje je izlaz dobar, a gdje nije

Budite iskreni prema svojim korisnicima po tom pitanju, jer kvaliteta pretvorbe više ovisi o ulazu nego o samom pretvaraču. Označeni PDF-ovi i uredno generirani poslovni dokumenti, računi, izvještaji, ugovori, pretvaraju se dobro: naslovi slijeću kao naslovi, tablice preživljavaju, popisi se ispravno renumeriraju u Wordu. Dvostupčani akademski rasporedi pretvaraju se prihvatljivo ako je geometrija stupaca pravilna. Tablice koje se protežu preko prijeloma stranica ponovno se sastavljaju zaključivanjem i ponekad se razdvoje. Snažno dizajnirani marketinški materijali, gdje je tekst postavljen radi vizualnog učinka, a ne redoslijedom čitanja, pretvaraju se loše, i nikakva količina zaključivanja to ne ispravlja

Skenirani dokumenti potpuno su zaseban slučaj. Stranica koja je jedna velika slika ne sadrži tekstualne objekte, pa nema što izvesti dok ne postoji tekstualni sloj; OCR put koji ga proizvodi preduvjet je, a ne opcija. Prije pokretanja velike serije obrade, uzmite uzorak desetak reprezentativnih datoteka i pogledajte izlaz, te razmotrite da prvo nabrojite elemente stranice, kako je opisano u članku pretraživanje teksta i nabrajanje elemenata stranice, kako biste vidjeli što stranice zapravo sadrže

Za pipeline-ove asistenata i dohvata, put prema Markdownu obično je bolji cilj: naslovi postaju granice komada teksta, tablice ostaju čitljive kao tablice s okomitim crtama, a oznake stranica daju svakom komadu lokaciju koju je moguće citirati. Za ljudsko uređivanje, DOCX je odgovor, jer ono što korisnik želi nije tekst, već mogućnost da ga promijeni

PDFlibPas je PDF biblioteka za Delphi, C++Builder i Lazarus s pripadajućim DLL i ActiveX sučeljima, pa su isti pozivi za izvoz dostupni i iz C#, C++ ili skriptnih okruženja. Potpuna dokumentacija i probna verzija dostupne su na stranici PDFlibPas Delphi PDF biblioteke