PDFlibPas konvertuoja PDF turinį į du redaguojamus formatus be Office automatizavimo. ExportPageMarkdown ir ExportDocumentMarkdown grąžina semantinį Markdown su numanomomis antraštėmis, numeruotais ir nenumeruotais sąrašais bei lentelėmis su vertikaliais brūkšniais, o SaveDOCXToFile ir SaveDOCXToStream įrašo WordprocessingML paketą su pastraipomis, antraštėmis, natyviu sąrašų numeravimu, aptiktomis lentelėmis, šrifto stiliais, puslapių lūžiais ir išdėstytais PNG paveikslėliais
Abu veikia visiškai Pascal kalba, serveryje, be įdiegto Word ir be COM. Būtent šis apribojimas yra priežastis, kodėl ši funkcija egzistuoja PDF bibliotekoje, o ne stalinio kompiuterio įrankyje
Kodėl „PDF į Word" tikrai sunku?
Todėl, kad PDF puslapis nesudarytas iš pastraipų. Jame yra teksto atvaizdavimo operatoriai, kurie išdėsto glifų sekas koordinatėse, tokia tvarka, kokia generatorius juos parašė, be jokio įsipareigojimo nurodyti, kad dvi sekos priklauso tam pačiam sakiniui, jau nekalbant apie tą patį sąrašo elementą. Formatas buvo sukurtas tiksliai aprašyti spausdintą puslapį, ir jam tai pavyksta atmetant struktūrą, kuri tą puslapį sukūrė
Todėl kiekvienas konverteris turi atkurti tai, ką generatorius išmetė. Eilučių grupavimas gaunamas iš vertikalių tarpų ir bazinės linijos lygiavimo. Pastraipų ribos gaunamos iš tarpų pasikeitimų ir įtraukų. Antraštė yra eilutė, kurios šriftas didesnis ar storesnis nei pagrindinio teksto ir kuri išsiskiria iš to, kas seka toliau. Sąrašas yra pastraipų seka, prasidedanti ženkleliu ar numerio šablonu. Lentelė yra teksto blokų tinklelis, kurio kraštai sutampa eilutėse ir stulpeliuose. Kiekvienas iš jų yra sprendimas, o sprendimas reiškia gerą rezultatą dokumentuose, kurie laikosi įprastų tipografijos konvencijų, ir vidutinišką dokumentuose, kurie jų nesilaiko
Žymėti PDF dokumentai yra išimtis, ir didelė tokia. Kai dokumentas turi struktūros medį, pastraipų, antraščių, sąrašų ir lentelių vaidmenys užrašomi, o ne spėjami, todėl prieinamumo darbas, aprašytas straipsnyje apie žymėto PDF prieinamumo struktūrą, atsiperka ir konvertavimo kokybe. Jei kontroliuojate generatorių, savo išvesties žymėjimas yra vienintelis dalykas su didžiausiu poveikiu, kurį galite padaryti bet kam, kam vėliau reikės ją konvertuoti
Markdown eksportas, po vieną puslapį
Markdown kelias yra tas, kurį reikia rinktis, kai paskirtis yra teksto konvejeris: dokumentacijos svetainė, paieškos indeksas, gavybos duomenų rinkinys asistentui. Parinktys yra bitų kaukė: PDF_MARKDOWN_INCLUDE_PAGE_MARKERS, PDF_MARKDOWN_DETECT_HEADINGS, PDF_MARKDOWN_PRESERVE_STYLES, o PDF_MARKDOWN_DEFAULT sujungia visas tris
var
Pdf: TPDFlib;
Md: WideString;
begin
Pdf := TPDFlib.Create;
try
Pdf.LoadFromFile('handbook.pdf', '');
// Vienas puslapis, kaip eilutė
Md := Pdf.ExportPageMarkdown(1, PDF_MARKDOWN_DEFAULT);
// Puslapių intervalas, srautiniu būdu įrašomas kaip UTF-8 be BOM
Pdf.SaveMarkdownToFile('1-40',
PDF_MARKDOWN_DETECT_HEADINGS or PDF_MARKDOWN_PRESERVE_STYLES,
'handbook.md');
finally
Pdf.Free;
end;
end;
Puslapių žymos pasiteisina gavybos darbe. Teksto gabalas, kuriame nurodytas puslapis, iš kurio jis kilęs, gali būti cituojamas tiksliai, o skaitytojas, sekantis citatą, patenka ten, kur teiginys iš tikrųjų yra. Išjunkite jas, kai Markdown skirtas žmogui skaityti, kur puslapių ribos iš originalaus maketo yra tik triukšmas
Srautiniai metodai svarbūs dideliems dokumentams. SaveMarkdownToStream ir SaveMarkdownToFile įrašo UTF-8 po vieną puslapį ir nebuferizuoja viso rezultato, todėl 900 puslapių žinynas iš pradžių netampa 900 puslapių eilute atmintyje. BOM nebuvimas taip pat sąmoningas: BOM Markdown faile suklaidina netikėtai daug statinių svetainių generatorių ir palyginimo įrankių
DOCX be Office mašinoje
DOCX rašiklis pats sukuria paketą: ZIP įrašai, parašyti kaip neapdorotas Deflate su CRC patikromis, WordprocessingML dalys, ir ryšiai, kurie juos sieja. Niekas nekreipiasi į Word, o tai reiškia, kad konvertavimas veikia be galvos serveryje, tarnybos paskyroje, konteineryje – visur, kur Office automatizavimas yra arba nelicencijuotas, nestabilus, arba draudžiamas
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;
Paveikslėlio duomenys įrašomi apdorojant kiekvieną puslapį, o ne surenkami ir pridedami pabaigoje, todėl didžiausias atminties naudojimas atitinka vieną puslapį, o ne visą dokumentą. Išlaikoma aiški puslapių tvarka, o pasirinktas PDF puslapis atkuriamas vėliau, o tai svarbu, kai eksportas yra vienas žingsnis ilgesnėje užduotyje, kurioje puslapis buvo pasirinktas dėl kitų priežasčių
Ką duoda deterministinis pakavimas?
Baitas po baito atkuriamumą. Du to paties įvesties duomens konvertavimai su tais pačiais nustatymais sukuria tą patį paketą, o tai reiškia, kad galite maišuoti rezultatą pokyčiams aptikti, palyginti du sugeneruoto dokumento leidimus ir agresyviai kešuoti nesijaudindami, kad identiška įvestis sukūrė kitokį rezultatą
Office automatizavimas to negali garantuoti. Jis įterpia laiko žymas, redakcijų identifikatorius ir nuo mašinos priklausomus metaduomenis, todėl tas pats dokumentas, konvertuotas du kartus, skiriasi taip, kad maišos patikra nebeveikia. Ta pati logika lemia deterministinius failo identifikatorius, aptartus straipsnyje apie deterministinius PDF ID atkuriamiems kūrimo procesams: kai rezultatas atkuriamas, patikra tampa palyginimu, o ne apžiūra
Kur rezultatas geras, o kur ne
Būkite atviri su savo naudotojais šiuo klausimu, nes konvertavimo kokybė kinta labiau priklausomai nuo įvesties, o ne nuo konverterio. Žymėti PDF dokumentai ir švariai sugeneruoti verslo dokumentai, sąskaitos, ataskaitos, sutartys, konvertuojami gerai: antraštės tampa antraštėmis, lentelės išlieka, sąrašai teisingai pernumeruojami Word programoje. Dviejų stulpelių akademiniai maketai konvertuojami priimtinai, jei stulpelių geometrija reguliari. Lentelės, kertančios puslapių lūžius, atkuriamos sprendžiant, ir kartais suskaidomos. Stipriai apipavidalinta rinkodaros medžiaga, kur tekstas išdėstytas vizualiam efektui, o ne skaitymo tvarka, konvertuojama prastai, ir jokia sprendimų kiekybė to neišspręs
Nuskaityti dokumentai yra visiškai atskiras atvejis. Puslapis, kuris yra vienas didelis paveikslėlis, neturi teksto objektų, todėl nėra ko eksportuoti, kol nėra teksto sluoksnio; OCR kelias, kuris jį sukuria, yra būtina sąlyga, o ne pasirinkimas. Prieš vykdydami didelį paketą, pasirinkite tuziną tipiškų failų ir peržiūrėkite rezultatą, taip pat apsvarstykite galimybę pirmiausia išvardinti puslapio elementus, kaip aprašyta straipsnyje apie teksto paiešką ir puslapio elementų išvardinimą, kad pamatytumėte, kas iš tikrųjų yra puslapiuose
Asistentų ir gavybos konvejeriams Markdown kelias paprastai yra geresnis tikslas: antraštės tampa gabalų ribomis, lentelės išlieka skaitomos kaip lentelės su vertikaliais brūkšniais, o puslapių žymos suteikia kiekvienam gabalui cituojamą vietą. Žmogaus redagavimui atsakymas yra DOCX, nes naudotojui reikia ne teksto, o galimybės jį keisti
PDFlibPas yra Delphi, C++Builder ir Lazarus PDF biblioteka su atitinkamomis DLL ir ActiveX sąsajomis, todėl tos pačios eksporto funkcijos pasiekiamos iš C#, C++ ar scenarijų aplinkų. Pilna dokumentacija ir bandomoji versija pateikta PDFlibPas Delphi PDF bibliotekos puslapyje