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
// Windows binding (PDFlibDLL64.dll): Stdcall, plain export names
function DLCreateLibrary: Integer; stdcall;
external 'PDFlibDLL64.dll' name 'DLCreateLibrary';
function DLReleaseLibrary(InstanceID: Integer): Integer; stdcall;
external 'PDFlibDLL64.dll' name 'DLReleaseLibrary';
function DLLoadFromFile(InstanceID: Integer;
FileName, Password: PWideChar): Integer; stdcall;
external 'PDFlibDLL64.dll' name 'DLLoadFromFile';
// macOS binding: same function, Cdecl, and an underscore prefix on the export
function DLCreateLibrary: Integer; cdecl;
external 'PDFlibDylib.dylib' name '_DLCreateLibrary';var
Inst, Doc: Integer;
begin
Inst := DLCreateLibrary; // one instance per worker thread
try
Doc := DLLoadFromFile(Inst, 'in.pdf', ''); // returns a DocumentID, 0 on failure
if Doc <> 0 then
begin
DLEncrypt(Inst, 'owner-secret', 'user-secret', 3,
DLEncodePermissions(Inst, 1, 0, 0, 0, 0, 0, 0, 1));
DLSaveToFile(Inst, 'out.pdf');
end;
finally
DLReleaseLibrary(Inst); // frees every document the instance owns
end;
end;var
P: PWideChar;
PageText: string;
begin
P := DLGetPageText(Inst, 7); // pointer into a library-owned buffer
PageText := P; // copy now; a later call may reuse the buffer
end;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
Yksi julkisivu, kolme binäärimuotoa
TPDFlib-julkisivu näkyy tasaisena DL-funktiona DLL:ssä, ActiveX-objektina ja dylib-kirjastona. PDF-semanttiikka pysyy samana, mutta ABI, merkkijonot ja omistajuus muuttuvat sidoksen mukaan
Windows: Stdcall ja W/A-funktioparit
Windows-sidoksessa valitse prosessin bittisyvyyttä vastaava DLL ja käytä yhtä merkkijonoleveyttä johdonmukaisesti. PWideChar sopii Unicode-poluille; väärä kutsukonventio voi rikkoa pinon ennen ensimmäistä PDF-kutsua
macOS: samat nimet, eri ABI
Dylib käyttää Cdecl-kutsukonventiota ja vientinimissä etuliitettä. Pidä funktioluettelo yhteisenä, mutta generoi alustan mukaiset deklaroinnit automaattisesti
COM/ActiveX: Safecall ja Olevariant
ActiveX välittää virheet HRESULT-arvoina ja binääridatan Olevariant-parametreina. Rekisteröi OCX oikealla bittisyydellä, koska 32-bittinen rekisteröinti ei näy 64-bittiselle isännälle