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