ConvertToPDFA gjør et vanlig dokument om til et arkivdokument i ett eneste kall: det fjerner det den valgte delen forbyr, legger til det delen krever, angir delen dokumentet krever, og sjekker deretter resultatet. Kravet rapporteres som oppfylt bare når sjekken passerer, og GetPDFAConversionReport viser hva som ble gjort og hva som fortsatt står i veien
Den siste egenskapen er den designbeslutningen som er verdt å dvele ved. En konverterer som stempler kravet uten å sjekke, er verre enn ingen konverterer i det hele tatt, fordi en fil som sier at den er arkivmessig og ikke er det, glir rett gjennom de systemene som ellers ville ha fanget den. Feilen dukker opp flere år senere, i en revisjon, på et dokument ingen kan generere på nytt
Hvorfor feiler en tilsynelatende gyldig PDF en PDF/A-sjekk?
Oftest fordi de to stedene en PDF sier hvem som skrev den, ikke er enige. En validator leser både dokumentinformasjonsordboken og XMP-pakken og avviser en fil der de avviker — og de fleste filer som feiler på dette punktet, har rett og slett aldri fått skrevet XMP-delen i det hele tatt
RepairDocumentMetadata bringer dem i overensstemmelse og returnerer hvor mange oppføringer den reparerte. Der bare én halvdel bærer en verdi, fylles den andre ut fra den, slik at ingenting som allerede er registrert, går tapt. Ingen trenger å avgjøre hvilken kopi som er autoritativ, for i praksis er én kopi tom
Det finnes en annen reparasjon i det samme kallet som fanger et mer subtilt tilfelle. Et dokument satt til en PDF/A-modus får standardidentifikasjonen sin gjenopprettet hvis den var mistet, noe som skjer hver gang en oppringer leverer en XMP-pakke selv. Uten den identifikasjonen leser en validator filen som en vanlig PDF og rapporterer hver regel i den krevede delen som uoppfylt — et spektakulært utseende svikt med én liten årsak
var
Lib: TPDFlib;
Repaired: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.LoadFromFile('incoming.pdf', '');
Repaired := Lib.RepairDocumentMetadata;
Log(Format('%d metadata entries brought into agreement', [Repaired]));
Lib.SaveToFile('incoming-fixed.pdf');
finally
Lib.Free;
end;
end;
Valg av del før du konverterer
SetPDFAMode og ConvertToPDFA deler samme modusnummerering, og tre av verdiene er nylige. Modus 9 er PDF/A-4, delen bygget på PDF 2.0. Modus 10 er PDF/A-4e, som i tillegg tillater 3D og rikmedia, og modus 11 er PDF/A-4f, som tillater en innebygd fil i ethvert format
Del 4 identifiserer seg annerledes enn delene før den: ved delenummer og året delen ble publisert, uten konformansbokstav for ren PDF/A-4 og bokstaven E eller F for de to utvidelsene. Sjekken gjenkjenner del 4, bedømmer filene mot PDF 2.0 i stedet for 1.7, og rapporterer en del 4-fil som ikke angir sitt revisjonsår
Hver innebygde fil i et del 4-dokument angir hvordan den relaterer seg til dokumentet, noe både del 3 og 4 krever. Dette er regelen som pleide å fange vanlige vedlegg: relasjonen ble skrevet bare for vedlegg etter det første og aldri for det siste, slik at et dokument med ett enkelt vedlegg — det vanlige tilfellet — ikke bar noen i det hele tatt og feilet validering på nettopp det punktet
var
Verdict: Integer;
begin
Lib.LoadFromFile('report.pdf', '');
Verdict := Lib.ConvertToPDFA(9); // 9 = PDF/A-4, 10 = 4e, 11 = 4f
Memo1.Lines.Text := Lib.GetPDFAConversionReport;
if Verdict = 1 then
Lib.SaveToFile('report-pdfa4.pdf')
else
Log('conversion incomplete - see the report for what stands in the way');
end;
Hva konverteringsrapporten er til for
Å avgjøre hva du skal gjøre videre. En konvertering som lykkes trenger ingen rapport; en konvertering som ikke lykkes er hele grunnen til at rapporten finnes. Noen hindringer kan fjernes av en konverterer og noen kan ikke det — kryptering, forbudt innhold som bærer mening, et skriftprogram som rett og slett ikke finnes noe sted på maskinen. Rapporten skiller det som ble gjort fra det som gjenstår, noe som forvandler «konvertering feilet» til en arbeidsoppgave
Behandl dommen som porten i en batch-pipeline. Konverter, les dommen, og rutt filen: arkiver de som passerte, sett resten i kø for et menneske med rapporten vedlagt. Det du ikke bør gjøre er å lagre utdataen fra en feilet konvertering i arkivet fordi den ser bedre ut enn inndataen — den bærer nå et krav som sjekken nektet å bekrefte
Å lese merket en fil allerede bærer
Før du konverterer noe, bør du vite hva dokumentet sier om seg selv. En PDF/A-sjekk som ikke kan lese det eksisterende standardmerket, bedømmer hver fil mot del 1 uansett hva den erklærer, noe som betyr at et helt gyldig PDF/A-2- eller PDF/A-3-dokument rapporteres som å ikke bære noe merke og som å være av for høy versjon — det motsatte av sannheten
Merket leses uansett om produsenten skrev det som et XMP-element eller som et attributt. Begge former er vanlig XMP, og å akseptere bare én av dem etterlater filer fra andre produsenter som ser umerkede ut. Hvis du noensinne har lurt på hvorfor et dokument som validerer andre steder feiler i din egen pipeline, er dette et godt sted å se først
Sanitizing før arkivering, og feilen det er verdt å kjenne til
Arkivkonvertering og sanitizing kjører ofte sammen, fordi innholdet en sikkerhetspolicy vil fjerne overlapper tungt med innholdet PDF/A forbyr. SanitizeDocument fjerner JavaScript, og å fjerne det siste skriptet fjerner også det tomme navnetreet det etterlater seg — et tre som ellers fortsatt ville fortelle en leser at dokumentet bar skript
Den andre halvdelen ble lært på den harde måten: en «off-by-one» i pakkelisten betydde at sanitizing rapporterte å fjerne skript uten å fjerne noen, slik at et dokument som var blitt sanitisert fortsatt kjørte skriptene sine når det ble åpnet. Det er et godt argument for det generelle prinsippet hele denne artikkelen hviler på — verifiser resultatet i stedet for å stole på operasjonen, i din egen pipeline like mye som i biblioteket
For det omliggende arkivarbeidet, se gjennomgangene av PDF/A- og PDF/UA-preflight, ekte redigering og innholdsfjerning, og PDF/A-3 XMP-utvidelsesskjemaer for Factur-X, som dekker metadatasiden når det arkiverte dokumentet også bærer strukturerte fakturadata
PDFlibPas er et PDF-bibliotek i ren Pascal for Delphi, C++Builder og Lazarus, slik at konvertering, reparasjon og validering skjer inne i din egen prosess uten noe eksternt verktøy i kjeden — se PDFlibPas-produktsiden for de støttede PDF/A-delene og plattformene