Konverze do PDF a PDF/A

Převod dokumentů do formátu PDF a PDF/A je standardní funkcí řešení LTD. Realizuje se převážně pomocí konverzního jádra komponenty třetí strany, která je integrální součástí našeho řešení a jedná o stejnou komponentu, která je též integrována v řešeních společnosti Adobe.

Konfigurace pro konverzi do PDF, respektive PDF/A, je nastavena již ve výchozím stavu (viz convertEngine „PDF“ v InstallDir\Engine\Engine.config), a ze strany implementátora (zákazníka) není tedy třeba žádného dalšího nastavení.

Při konverzi do formátu PDF či PDF/A se však mohou vyskytnout určité problémy, jejichž řešení jsou popsaná v bodech níže.

Konfigurace nahrazování chybějícího písma při konverzi do PDF/A

Při konverzích PDF souboru do formátu PDF/A může v některých případech docházet k tomu, že vstupní dokument nelze převést a vrací se odpověď služby:

Konverzi do PDF/A-3b nelze dokončit, protože soubor obsahuje chyby, které nemohou být opraveny.

- Oprava selhala: Vložit chybějící písma [MyriadPro-Bold])

PDF/A-3b conversion of this file is not possible, the file contains errors/issues that cannot be fixed.

- Fixup_failed Embed missing fonts [MyriadPro-Bold]

Důvodem je, že vstupní PDF soubor neobsahuje nebo nemá správně vložené potřebné písmo (font). PDF/A normy vyžadují, aby písma (ale i všechny další objekty) byly vložené přímo v souboru a neodkazovalo se na ně. LTD se při konverzi pokusí problém opravit. V případě, že opravu není možné provést, vrací uvedenou chybu.

Správně by měl autor dokumentu PDF soubor opravit a odpovídajícím způsobem do něj písmo vložit.

Další možností je upravit konfiguraci LTD tak, aby se dané písmo nahradilo jiným podobným typem písma.

Zde je ale důležité si uvědomit, že na světe existuje velká řada písem, která jsou typologicky i graficky rozdílná. Náhrada písma písmem přesně neodpovídajícím tak může způsobit nečitelnost textu a případně zpochybnitelnost validity obsahu dokumentu jeho autorem.

Substituční tabulka

Ve výchozím nastavení LTD je nahrazování písma řešeno pomocí substituční tabulky PDFA komponenty:

InstallDir\Engine\pdfapilot\etc\FontSubstitution\pdfa.cfg

Jeden způsob substituce spočívá v tom, že se mohou všechna definovaná písma nahrazovat navzájem (v dané třídě = řádku):

SubstituteAll   Arial Bold  Arial-Bold  ArialMT,Bold    Helvetica Bold  Futura-Bold Futura Bold Helvetica-Bold

Např. kdyby v dokumentu chybělo písmo Helvetica Bold, nahradí se jiným z uvedené řady, např. Arial Bold.

Další způsob spočívá v tom, že první písmo v seznamu názvů písem je nahrazeno písmy následujícími.

SubstituteFirst '(.*)Bold'  'Arial(.*)Bold' 'Helvetica(.*)Bold' '\1Regular' '\1'

V případě chybějícího písma je možné dané písmo do vybraného řádku doplnit. Mezi jednotlivými názvy písem je třeba klávesou <Tab> vložit tabulační znak.

Při použití druhé možnosti je třeba:

  • Odebráním znaku # odkomentovat všechny SubstituteFirst.

  • Přidáním znaku # zakomentovat všechny SubstituteAll.

V substituční tabulce lze použít jen jeden způsob nahrazování. Výchozím je SubstituteAll.

Některá písma však nelze pomocí substituční tabulky nahradit, např. z důvodu rozdílnosti glyfů (grafického znázornění znaku) nebo licenčního ujednání. Pro takové případy lze využít řešení popsaná v následujícím textu.

Výchozí font

V rámci pracovního procesu PDFA komponenty lze do konfiguračního souboru (InstallDir\Engine\pdfaPilot\pdfaPilotWP.exe.config) nastavit klíče, díky kterým se v případě výše uvedené chyby konverze chybějící font nahradí jiným, výchozím.

Od verze 2.1.7285.1212 je tedy možné v konfiguraci nastavit (resp. odkomentovat) následující klíče:

 <add key="pdfaConvert_FixFontEmbedding_en" value="Fixup_failed Embed missing fonts ["/>
 <add key="pdfaConvert_FixFontEmbedding_cz" value="Oprava selhala: Vložit chybějící písma ["/>
 <add key="FixFontEmbedding" value="Arial"/>
 <add key="FixFontEmbeddingBold" value="Arial Bold"/>
 <add key="FixFontEmbeddingItalic" value="Arial Italic"/>
 <add key="FixFontEmbeddingBoldItalic" value="Arial Bold Italic"/>

Výchozí font je třeba nastavit do klíčů FixFontEmbedding, případně FixFontEmbeddingBold/Italic/BoldItalic. Jako výchozí je nastaven font Arial, (a tedy také Arial Bold, Arial Italic a Arial Bold Italic).

Řešení má tyto parametry:

  • V odpovědi konverzní služby musí být název fontu v hranatých závorkách, například [MyriadPro-Bold].

  • Povinný je jen parametr FixFontEmbedding. Pokud není nastaven, pak se nahrazování neaplikuje.

  • K FixFontEmbedding je možné nastavit varianty Bold, Italic a BoldItalic – pokud není nastaveno, použije se font nastavený v FixFontEmbedding.

  • Bold se použije, pokud se v názvu chybějícího fontu vyskytuje "bold", Italic se použije, pokud název obsahuje "italic" nebo "oblique".

  • Při konfiguraci nahrazování se vychází ze souboru InstallDir\Engine\pdfaPilot\etc\FontSubstitution\pdfa.cfg. Pokud se nenajde, vygeneruje se nový.

  • Pokud není nastaveno FixFontEmbeddingPermanently, použije se pro opakovanou konverzi kopie souboru v dočasné složce temp a font se opraví jen pro aktuální soubor.

  • Pokud je nastaveno FixFontEmbeddingPermanently, dojde k pokusu změnu zapsat do InstallDir\Engine\pdfaPilot\etc\FontSubstitution\pdfa.cfg. V případě, že se to nezdaří, použije se dočasná (temp) kopie.

  • Pro zápis do souboru pdfa.cfg je třeba disponovat právy administrátora, soubor totiž je uložen v instalační složce. Východiskem může být si soubor překopírovat někam, kde má WS právo zápisu a podle toho nastavit proměnnou pdfaConvert_fontsubstitutionfile.

Možnost náhrady písma by se měla využívat pouze ve výjimečných případech, na základě požadavku klienta a po řádném otestování dostatečného množství vstupních dokumentů.

Konverze šifrovaných PDF dokumentů do PDF/A

Ve výchozím nastavení LTD a jeho konverzní PDF/A komponenty není umožněno převádět PDF soubory, které jsou zabezpečené (šifrované) heslem proti neautorizovaným úpravám. Důvodem je respektování požadavku tvůrce PDF dokumentu, který při zabezpečení (šifrování) jeho obsahu heslem určuje vlastnost souboru, aby bylo zabráněno nežádoucímu kopírování, tisku apod.

Pokud se převádí šifrovaný PDF dokument, pak odpovědí služby ConvertFileEx je návratový kód 92 (PRN_CR_PDFA_CONVERSION) s ErrorMessage „PDF/A engine error 18437 (PTB_eerrPreflightEncrypted))“.

Od verze 2.1.7285.1212 je v případě potřeby a požadavku zákazníka na převádění takových PDF dokumentů možné v konfiguraci webové služby (WebService\Web.config) nebo konfiguraci produktu (Engine\Engine.config) nastavit klíč:

<add key="ConvertPDF_EnableDecryptToPDFA" value="true"/>

Toto nastavení neplatí pro PDF soubory, které jsou šifrované heslem pro otevření. Takové soubory i nadále převádět nelze. Pro jejich převod je nutné zajistit odstranění hesla od autora PDF.

Známé problémy

Knihovnu DLL pdfEngine.dll nelze načíst: Uvedený modul nebyl nalezen.

Pokud při převodu souboru do PDF/A nastane chyba:

PDF/A engine error 4097 (PTB_eerrUnknown), Knihovnu DLL pdfEngine.dll nelze načíst: Uvedený modul nebyl nalezen. (Výjimka na základě hodnoty HRESULT: 0x8007007E)'

pak nejspíše nebude v operačním systému Windows serveru nainstalována prerekvizita Microsoft Visual Studio C++ a bude třeba ji nainstalovat.

Konkrétně se jedná o tzv. latest verzi (Visual Studio 2015, 2017, 2019, and 2022; vc_redist.x64.exe), která je dostupná na stránkách společnosti Microsoft.