PdfElixide.Compliance.convert/3 converts the document held by an editor and
reports what it changed and what remains unresolved:
alias PdfElixide.Compliance
alias PdfElixide.Editor
editor = Editor.open!("path/to/report.pdf")
try do
conversion = Compliance.convert!(editor, :pdf_a_2b)
if conversion.report.compliant? do
Editor.save!(editor, "report-pdfa.pdf")
end
after
Editor.close(editor)
endConversion validates the document, applies the fixes it supports, and validates
the result again. conversion.report is that second report. It is subject to
the limitations described by PdfElixide.Compliance and is not a conformance
certification.
What conversion fixes
Conversion can declare the requested level in XMP metadata, add an sRGB output
intent, remove JavaScript, remove attachments where the level forbids them, and
set the document language to en for a level a target that declares none. The
options to PdfElixide.Compliance.convert/3 can disable some of these fixes.
Anything else stays in the report. In particular:
- Missing fonts remain unembedded unless
embed_fonts: trueis given. - A level
atarget needs a tagged document, and conversion adds no tags. - Transparent content can remain in a PDF/A-1 result because the transparency check is partial and conversion does not flatten it.
The conversion succeeds even when findings remain. Check
conversion.report.compliant?, conversion.actions and
conversion.failures.
Convert last
Conversion starts from what a full write of the editor would produce, including
pending page edits, field values and attachments. It then replaces the editor's
document with the converted result. PdfElixide.Editor.modified?/1 remains
true until a full write.
Convert after merging, extracting pages and making other edits:
- Incremental saves are refused after conversion. Write a full rewrite.
- Encryption is refused while the document declares PDF/A.
- A PDF/A-1 editor must be written with
compress: false. - Merging into a PDF/A-1 editor is refused. Merge first, then convert. Merging into a PDF/A-2 or PDF/A-3 editor keeps the declaration and its restrictions.
- Extracted pages keep the PDF/A declaration, but PDF/A-1 extraction compresses their XMP metadata. Extract first and convert each output.
If edits after conversion are unavoidable, validate the bytes you write rather than relying on the conversion report.
Sanitizing with scrub_metadata: true removes the PDF/A declaration and lifts
the associated write restrictions.
An editor opened with a password converts to an unencrypted document. Conversion is refused, without changing the editor, when the editor has no pages, when rebuilding would lose a pending redaction, or when an encrypted source carries unencrypted XMP metadata.
Existing XMP and metadata
Conversion does not replace a PDF/A level already declared in XMP. If the level differs from the requested target, remove the metadata or convert to the declared level.
PDF/A-1 conversion is also refused whenever the document already carries XMP metadata, because the existing stream would remain compressed. Remove it first when replacing its properties is acceptable:
Editor.sanitize!(editor,
scrub_metadata: true,
remove_javascript: false,
remove_embedded_files: false
)When conversion changes the document, its information dictionary is not
carried over, so PdfElixide.Editor.metadata/1 no longer reports its title or
author. When no action is needed, the dictionary is kept. Do not add it back
without keeping it consistent with the XMP metadata; validation does not compare
the two.
A full rewrite also produces no document identifier (/ID). PDF/A requires
one, so a dedicated conformance validator can reject a file even when
conversion.report.compliant? is true. Add the identifier with another tool
when external conformance validation requires it. See
XMP and document identifiers.
Embedded fonts
With embed_fonts: true, conversion searches the fonts installed on the
machine and embeds the entire matching font file. It may substitute a similar
family for a standard PDF font.
The result can vary by machine, grow by megabytes per font, or contain a font collection or format that another tool rejects despite a compliant report. The first embedding conversion in a running node also scans installed fonts and can take several seconds. Prefer embedding fonts when producing the source PDF.