PDFlibPas muuntaa PDF-sisällön kahdeksi muokattavaksi muodoksi ilman Office-automaatiota. ExportPageMarkdown ja ExportDocumentMarkdown palauttavat semanttista Markdownia päätellyillä otsikoilla, järjestetyillä ja järjestämättömillä listoilla sekä pystyviivataulukoilla, kun taas SaveDOCXToFile ja SaveDOCXToStream kirjoittavat WordprocessingML-paketin, joka sisältää kappaleet, otsikot, natiivin listanumeroinnin, tunnistetut taulukot, fonttityylit, sivunvaihdot ja sijoitetut PNG-kuvat
Molemmat toimivat kokonaan Pascalissa, palvelimella, ilman asennettua Wordia ja ilman COM:ia. Tämä rajoite on syy siihen, miksi ominaisuus on olemassa PDF-kirjastossa eikä työpöytätyökalussa
Miksi "PDF Wordiksi" on aidosti vaikeaa?
Koska PDF-sivu ei sisällä kappaleita. Se sisältää tekstinnäyttöoperaattoreita, jotka sijoittavat glyfiajoja koordinaatteihin, missä tahansa järjestyksessä tuottaja ne kirjoitti, ilman velvollisuutta osoittaa, että kaksi ajoa kuuluvat samaan lauseeseen, saati samaan listakohtaan. Formaatti suunniteltiin kuvaamaan painettu sivu täsmällisesti, ja se onnistuu siinä hylkäämällä rakenteen, joka tuotti sivun
Joten jokaisen muuntimen täytyy rakentaa uudelleen se, minkä generaattori heitti pois. Riviryhmittely tulee pystysuuntaisesta välistyksestä ja peruslinjan kohdistuksesta. Kappaleiden rajat tulevat välistyksen muutoksista ja sisennyksestä. Otsikko on rivi, jonka fontti on suurempi tai paksumpi kuin leipäteksti ja joka erottuu seuraavasta. Lista on kappaleiden sarja, joka alkaa luetelmamerkillä tai numerokuviolla. Taulukko on tekstilohkojen ruudukko, jonka reunat kohdistuvat rivien ja sarakkeiden yli. Jokainen näistä on päättely, ja päättely tarkoittaa hyvää tulosta asiakirjoissa, jotka noudattavat tavanomaisia typografisia käytäntöjä, ja keskinkertaista tulosta asiakirjoissa, jotka eivät noudata
Tagatut PDF-tiedostot ovat poikkeus, ja iso sellainen. Kun asiakirja kantaa rakennepuun, kappaleen, otsikon, listan ja taulukon roolit tallennetaan sen sijaan, että ne arvattaisiin, minkä vuoksi artikkelissa tagattu PDF-esteettömyysrakenne kuvattu esteettömyystyö maksaa itsensä takaisin myös muunnoksen laadussa. Jos hallitset tuottajaa, tulosteesi tagaaminen on se yksittäinen tehokkain asia, jonka voit tehdä kenelle tahansa, jonka myöhemmin täytyy muuntaa se
Markdown-vienti, yksi sivu kerrallaan
Markdown-polku on se, johon kannattaa tarttua, kun kohde on tekstiputki: dokumentaatiosivusto, hakuindeksi, avustajan hakukorpus. Asetukset ovat bittimaski: PDF_MARKDOWN_INCLUDE_PAGE_MARKERS, PDF_MARKDOWN_DETECT_HEADINGS, PDF_MARKDOWN_PRESERVE_STYLES, ja PDF_MARKDOWN_DEFAULT yhdistää kaikki kolme
var
Pdf: TPDFlib;
Md: WideString;
begin
Pdf := TPDFlib.Create;
try
Pdf.LoadFromFile('handbook.pdf', '');
// Yksi sivu, merkkijonona
Md := Pdf.ExportPageMarkdown(1, PDF_MARKDOWN_DEFAULT);
// Sivualue, striimattuna levylle UTF-8-muodossa ilman BOM-merkkiä
Pdf.SaveMarkdownToFile('1-40',
PDF_MARKDOWN_DETECT_HEADINGS or PDF_MARKDOWN_PRESERVE_STYLES,
'handbook.md');
finally
Pdf.Free;
end;
end;
Sivumerkinnät ansaitsevat paikkansa hakutyössä. Tekstipala, joka kantaa mukanaan sivun, josta se on peräisin, voidaan siteerata täsmällisesti, ja lukija, joka seuraa viitettä, päätyy siihen, missä väite todella on. Kytke ne pois, kun Markdown on tarkoitettu ihmisen luettavaksi, jolloin lähdeasettelun sivurajat ovat kohinaa
Striimaavat aloituspisteet ovat tärkeitä suurille asiakirjoille. SaveMarkdownToStream ja SaveMarkdownToFile kirjoittavat UTF-8:aa yksi sivu kerrallaan eivätkä puskuroi koko tulostetta, joten 900-sivuisesta käsikirjasta ei ensin tule 900-sivuista merkkijonoa muistissa. Tavujärjestysmerkin puuttuminen on myös tarkoituksellista: BOM Markdown-tiedostossa hämmentää yllättävän monta staattisen sivuston generaattoria ja diff-työkalua
DOCX ilman Officea koneella
DOCX-kirjoitin tuottaa paketin itse: ZIP-merkinnät kirjoitettuna raakana Deflate-muodossa CRC-tarkistuksin, WordprocessingML-osat ja niitä sitovat suhteet. Mikään ei kutsu Wordia, mikä tarkoittaa, että muunnos toimii ilman käyttöliittymää olevalla palvelimella, palvelutilin sisällä, kontissa, kaikissa paikoissa, joissa Office-automaatio on joko lisensoimatonta, epävakaata tai kiellettyä
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;
Kuvadata kirjoitetaan sitä mukaa, kun jokainen sivu käsitellään, sen sijaan, että se kerättäisiin ja liitettäisiin loppuun, joten muistin huippukäyttö seuraa yhtä sivua eikä koko asiakirjaa. Eksplisiittinen sivujärjestys säilyy, ja valittu PDF-sivu palautetaan jälkikäteen, millä on merkitystä, kun vienti on yksi askel pidemmässä työssä, jossa oli valittuna sivu muista syistä
Mitä deterministinen pakkaus tuo mukanaan?
Tavu tavulta -toistettavuuden. Saman syötteen kaksi muunnosta samoilla asetuksilla tuottavat saman paketin, mikä tarkoittaa, että voit tiivistää tulosteen muutosten havaitsemiseksi, tehdä diffin kahden generoidun asiakirjan build-version välillä ja välimuistittaa aggressiivisesti huolehtimatta siitä, että identtinen syöte tuotti erilaisen artefaktin
Office-automaatio ei voi luvata tätä. Se upottaa aikaleimoja, revisiotunnisteita ja koneriippuvaista metadataa, joten sama asiakirja, joka on muunnettu kahdesti, eroaa tavoilla, jotka mitätöivät tiivistämisen. Sama päättely ajaa artikkelissa deterministiset PDF-tunnisteet toistettaville build-versioille käsiteltyjä deterministisiä tiedostotunnisteita: kun tuloste on toistettavissa, varmennuksesta tulee vertailu tarkastuksen sijaan
Missä tuloste on hyvä, ja missä se ei ole
Ole rehellinen käyttäjillesi tästä, koska muunnoksen laatu vaihtelee enemmän syötteen kuin muuntimen mukaan. Tagatut PDF-tiedostot ja siististi generoidut liiketoiminta-asiakirjat, laskut, raportit, sopimukset, muuntuvat hyvin: otsikot laskeutuvat otsikoiksi, taulukot säilyvät, listat numeroituvat oikein Wordissa uudelleen. Kaksipalstaiset akateemiset asettelut muuntuvat hyväksyttävästi, jos palstageometria on säännöllinen. Sivunvaihtoja ylittävät taulukot kootaan uudelleen päättelemällä ja joskus jakautuvat. Voimakkaasti suunniteltu markkinointimateriaali, jossa teksti on sijoitettu visuaalisen vaikutuksen vuoksi eikä lukujärjestyksessä, muuntuu huonosti, eikä mikään määrä päättelyä korjaa sitä
Skannatut asiakirjat ovat kokonaan erillinen tapaus. Sivu, joka on yksi iso kuva, ei sisällä tekstiobjekteja, joten mitään ei ole vietävää, ennen kuin tekstikerros on olemassa; OCR-polku, joka tuottaa sellaisen, on edellytys, ei vaihtoehto. Ennen suuren erän ajamista, ota näyte tusinasta edustavasta tiedostosta ja katso tulostetta, ja harkitse sivuelementtien luettelointia ensin, kuten kuvataan artikkelissa tekstihaku ja sivuelementtien luettelointi, nähdäksesi, mitä sivut todella sisältävät
Avustaja- ja hakuputkille Markdown-polku on yleensä parempi kohde: otsikoista tulee palojen rajoja, taulukot pysyvät luettavina pystyviivataulukoina, ja sivumerkinnät antavat jokaiselle palalle siteerattavan sijainnin. Ihmisen tekemään muokkaukseen DOCX on vastaus, koska se, mitä käyttäjä haluaa, ei ole teksti vaan mahdollisuus muuttaa sitä
PDFlibPas on Delphi-, C++Builder- ja Lazarus-PDF-kirjasto, jossa on vastaavat DLL- ja ActiveX-rajapinnat, joten samat vientikutsut ovat käytettävissä C#:sta, C++:sta tai skriptaus-isännistä. Täydellinen dokumentaatio ja kokeiluversio löytyvät sivulta PDFlibPas Delphi PDF library page