Teknisk artikel

Tagged PDF Structure Trees in Delphi with PDFlibPas på dansk

Denne lokaliserede version går direkte ind i Building Tagged PDF Structure Trees in Delphi with PDFlibPas og bruger den opdaterede engelske artikel som teknisk reference for Delphi-, PDF- og dokumentsoftwareteams

Siden omsætter den opdaterede basisartikel til konkrete kontrolpunkter for planlægning, implementering og validering

Hvad der blev synkroniseret fra den engelske artikel

Den engelske basisartikel er blevet udvidet med mere praktisk kontekst, konkrete beslutningspunkter og eksempler, så denne side skal læses som en arbejdsguide frem for en kort oversigt

Vigtige afsnit i den opdaterede basisartikel:

  • Brug små reproducerbare inputfiler, før funktionen kobles til produktionsdata
  • Hold produktnavne, API-navne, filnavne og literalværdier uændrede
  • Gem validatoroutput og versionsoplysninger sammen med den genererede prøvefil

Praktiske valg i implementationen

Start med den konkrete filtype, det ønskede output og den fejltilstand brugeren skal se. Bind derefter hvert API-kald til et kontrollerbart resultat, så validering, logning og support kan gentage kundens scenarie

  • Brug små reproducerbare inputfiler, før funktionen kobles til produktionsdata
  • Hold produktnavne, API-navne, filnavne og literalværdier uændrede
  • Gem validatoroutput og versionsoplysninger sammen med den genererede prøvefil

Kode og API-punkter

Kodeeksemplerne er bevaret uændret, fordi udviklere skal kunne sammenligne dem direkte med Delphi-, C++Builder- og Lazarus/FPC-projekter

var
  Lib: TPDFlib;
begin
  Lib := TPDFlib.Create;
  try
    Lib.SetOrigin(1);                          // top-left origin
    Lib.SetPDFUAMode('en-US');                 // bumps the save version to PDF 1.7
    Lib.SetInformation(1, 'Service Manual');   // /Title is mandatory for PDF/UA
    Lib.AddRoleMap('ManualTitle', 'H1');       // custom type -> standard role
    Lib.AddStandardFont(4);
    Lib.SetTextSize(18);
    Lib.BeginTagEx2('ManualTitle', '', '', 'en-US', '', 'h1-cover', '');
    Lib.DrawText(72, 96, 'Service Manual');
    Lib.EndTag;
    Lib.BeginTag('Figure', 'Exploded view of the gearbox assembly', '');
    Lib.AddImageFromFile('gearbox.png', 0);
    Lib.EndTag;
    Lib.BeginArtifact('Layout');               // page decoration: excluded from reading
    // ... draw rules and background tint ...
    Lib.EndArtifact;
    Lib.SaveToFile('manual.pdf');
  finally
    Lib.Free;
  end;
end;
Lib.BeginTag('Table', '', '');
Lib.BeginTag('TR', '', '');
Lib.BeginTagEx2('TH', '', '', '', '', 'col-part', '');
Lib.SetStructElemScope('Column');          // valid only while this TH is open
Lib.DrawText(72, 120, 'Part');
Lib.EndTag;
Lib.BeginTagEx2('TH', '', '', '', '', 'col-torque', '');
Lib.SetStructElemScope('Column');
Lib.SetStructElemColSpan(2);               // header spans the value and unit columns
Lib.DrawText(200, 120, 'Tightening torque');
Lib.EndTag;
Lib.EndTag;
Lib.BeginTag('TR', '', '');
Lib.BeginTag('TD', '', '');
Lib.SetStructElemHeaders('col-part');      // explicit binding for irregular tables
Lib.DrawText(72, 140, 'M8 flange bolt');
Lib.EndTag;
Lib.EndTag;
Lib.EndTag; // Table

Kontrol før udgivelse

Gennemgå outputfilen med samme værktøjer, som kunden eller arkivet bruger. Notér komponentversion, testdata, validatorversion og observeret resultat, så en senere regression kan spores præcist

Supplerende teknisk gennemgang

Denne udvidede sektion knytter an til artiklen Tagged PDF Structure Trees in Delphi with PDFlibPas på dansk og uddyber den samme arbejdsgang fra et teams perspektiv, hvor beslutninger i generatoren, i valideringen og i den efterfølgende logning skal kunne spores senere. Den engelske kilde på den tilhørende side via hreflang viser, hvorfor det ikke er nok blot at oversætte overskrifterne; pointen er at forklare, hvorfor dokumentet først er færdigt, når regler, output og kontrolspor faktisk hænger sammen

I implementeringsartikler er det nyttigt at skille design fra verifikation. Først fastlægges filtypen, det forventede resultat og den fejltilstand, brugeren skal se, og derefter bindes hvert API-kald til et resultat, der kan afprøves i samme scenarie igen. Det gælder både PDF-arbejdsgange og regnearksfunktioner: kodeeksemplerne forbliver uændrede, men brødteksten skal forklare, hvorfor komponentversion, skabelon-id, inputdata og valideringsstatus bør logges sammen

Det er også vigtigt at bevare produktnavne, API-navne, filnavne og literalværdier præcist som i den engelske kilde. Det holder den fælles reference ramme for udvikling, support og kvalitetssikring og mindsker risikoen for, at den lokale version bare bliver en løs parafrase uden konkret teknisk substans. Hvis artiklen indeholder kode, skal kommentarerne og tokenerne stå urørte, fordi det netop er dem, der forbinder teksten med det virkelige projekt

Når siden læses efter publicering, hjælper det at tænke på den som en del af en sporbar kæde. En god valideringsnote beskriver, hvad der blev testet, hvilket værktøj der vurderede resultatet, hvilke versioner der var involveret, og hvor beviset for et match eller et afslag er gemt. Når en regression opstår senere, er det arkiverede rapportmateriale og den tilhørende inputfil langt mere værd end mindet om, at "det gik dengang"

For denne lokaliserede gren gælder derfor en enkel regel: behold de centrale beslutninger, verifikationspunkterne og kodekonteksten samlet, så artiklen ikke kun kan læses første gang, men også bruges ved senere fejlsøgning, audit og versionssammenligning. Det er forskellen mellem et kort sammendrag og et arbejdsdokument, der stadig har værdi efter flere udgivelser.

  • Brug først små reproducerbare inputfiler
  • Behold produktnavne, API-navne, filnavne og literalværdier uændrede
  • Gem komponentversion, validatorresultat og inputdata sammen
  • Bevar kodeblokke og kommentarer præcist som i kilden

Relateret læsning