Tekninen artikkeli

Gigatavuluokan PDF-tiedostojen yhdistäminen ja jakaminen Delphissä PDFlibPas Direct Accessilla

Tässä artikkelissa käydään läpi toteutuksen tärkeimmät päätökset, rajatapaukset ja varmennukset

Käytännön toteutusvalinnat

Aloita tiedostotyypistä, odotetusta tuloksesta ja virhetilasta, jonka käyttäjän pitää nähdä. Sido sen jälkeen jokainen API-kutsu tarkistettavaan tulokseen, jotta validointi, lokitus ja tuki voivat toistaa asiakkaan tilanteen

  • Käytä ensin pieniä toistettavia syötetiedostoja
  • Pidä tuotenimet, API-nimet, tiedostonimet ja literal-arvot muuttumattomina
  • Tallenna validatorin tuloste ja versiotiedot luodun esimerkkitiedoston kanssa

Koodi ja API-kohdat

Koodiesimerkit säilytetään muuttumattomina, jotta kehittäjä voi verrata niitä suoraan Delphi-, C++Builder- ja Lazarus/FPC-projekteihin

var
  Lib: TPDFlib;
  Handle, Pages: Integer;
begin
  Lib := TPDFlib.Create;
  try
    Handle := Lib.DAOpenFileReadOnly('archive-2025.pdf', '');
    if Handle = 0 then
      raise Exception.Create('Direct access open failed');
    Pages := Lib.DAGetPageCount(Handle);
    Writeln('pages : ', Pages);
    Writeln('title : ', Lib.DAGetInformation(Handle, 'Title'));
    Lib.DACloseFile(Handle);
  finally
    Lib.Free;
  end;
end;
PageRef := Lib.DAFindPage(Handle, 250);          // page number -> object handle
if PageRef <> 0 then
begin
  Text := Lib.DAExtractPageText(Handle, PageRef, 0);
  Lib.DARenderPageToFile(Handle, PageRef, 5, 150, 'page250.png');
end;
Lib.AddToFileList('Statements', 'jan.pdf');
Lib.AddToFileList('Statements', 'feb.pdf');
Lib.AddToFileList('Statements', 'mar.pdf');
Lib.MergeFileList('Statements', 'q1-statements.pdf');

// Verify the result the cheap way: direct access again
Handle := Lib.DAOpenFileReadOnly('q1-statements.pdf', '');
Writeln('merged pages: ', Lib.DAGetPageCount(Handle));
Lib.DACloseFile(Handle);

Tarkistus ennen julkaisua

Tarkista tulostiedosto samoilla työkaluilla, joita asiakas tai arkisto käyttää. Kirjaa komponenttiversio, testidata, validatorin versio ja havaittu tulos, jotta myöhempi regressio voidaan jäljittää täsmällisesti

Muisti täydellisessä latauksessa

Tavallinen lataus pitää sivut, objektit ja välimuistit muistissa yhtä aikaa. Gigatavuluokan syötteellä tämä voi kuluttaa työprosessin osoiteavaruuden ennen kuin yhtäkään sivua on käsitelty

Suuren tiedoston tutkiminen ilman latausta

Direct Access -polku lukee rakenne- ja sivutietoja kahvojen avulla. Ensin varmista xref- ja trailer-rakenne, sitten hae vain käyttäjän tarvitsemat sivut

PageRef on objektikahva

PageRef ei ole sivunumero. Säilytä kahva erillään näkyvästä indeksistä, koska sivujen järjestäminen tai yhdistäminen muuttaa indeksit mutta ei alkuperäisen objektin merkitystä

Yhdistäminen nimetyllä luettelolla

Kun satoja tiedostoja yhdistetään, kokoa lähteet nimettyyn luetteloon ja käsittele virheet tiedostokohtaisesti. Näin yksi vioittunut PDF ei peitä jo valmistuneiden sivujen jäljitettävyyttä

Jakaminen ilman latausta

Aluepoiminta voi kirjoittaa sivualueet suoraan uuteen tiedostoon. Tarkista sivujen riippuvuudet, fontit ja resurssit, jotta irrotettu osa säilyy katseluohjelmissa käyttökelpoisena

Tiedostot, jotka ilmoittavat geometriansa väärin

Vaurioitunut PDF voi sisältää virheellisiä offseteja tai puutteellisen sivupuun. Käytä rajattuja hakuja ja kirjaa korjauspolku sen sijaan, että luottaisit hiljaiseen oletukseen täydellisestä rakenteesta