Tekninen artikkeli

PDFlibPas DLL-, ActiveX- ja dylib-sidokset: PDF-moottorin kutsu kaikista kielistä

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