Műszaki cikk

PDFlibPas Print Preview and Device-Context Output in Delphi magyarul

Ez a magyar cikk a(z) PDFlibPas Print Preview and Device-Context Output in Delphi magyarul témát foglalja össze olyan csapatoknak, amelyek Delphi, C++Builder, Lazarus/FPC és losLab komponensek köré építenek üzleti megoldásokat

A hangsúly a gyakorlati döntéseken, a buktatókon és az ellenőrzési pontokon van, hogy a megoldás éles környezetben is megbízható legyen

Mikor hasznos ez a téma

A téma akkor fontos, amikor a dokumentumkezelésnek éles környezetben is ismételhetőnek, mérhetőnek és támogatásbarátnak kell lennie, nem csak egy bemutatóprojektben.

  • Rögzítse a bemeneti fájlokat, jogosultságokat, várt kimenetet és hibautakat
  • A terméknevek, API-nevek és fájlnevek maradjanak pontosan az eredeti alakjukban
  • Őrizzen meg rövid regressziós fájlokat és naplókat a későbbi támogatáshoz

Gyakorlati munkafolyamat

Az angol forrás fő pontjai alapján érdemes a megvalósítást áttekinthető Delphi-munkafolyamattá alakítani. A forrás kiemelt témái:

  • A kód módosítása előtt rögzítse a használati esetet
  • Az eredményt kis tesztfájlokkal ellenőrizze
  • Az API-neveket és literal értékeket hagyja változatlanul

Először egy kisméretű, reprodukálható példát készítsen, majd ehhez kapcsolja a komponenshívásokat, a hibakezelést és a felhasználói üzeneteket. A dokumentumformátumoknál a részletek döntik el, hogy a megoldás megbízható-e.

API- és kódhorgonyok

procedure TPreviewForm.PreviewBoxPaint(Sender: TObject);
begin
  // these three are sticky library state, not per-call parameters:
  FPdf.SetRenderDCOffset(FOffsetX, FOffsetY);
  FPdf.SetRenderDCErasePage(1);
  FPdf.SetRenderCropType(0);
  FPdf.RenderPageToDC(FPreviewDpi, FCurrentPage, PreviewBox.Canvas.Handle);
end;
var
  Pdf: TPDFlib;
  Virt: WideString;
  Opt: Integer;
begin
  Pdf := TPDFlib.Create;
  try
    if Pdf.LoadFromFile('report.pdf', '') <> 1 then
      raise Exception.Create('load failed');
    Virt := Pdf.NewCustomPrinter(Pdf.GetDefaultPrinterName);
    Pdf.SetupPrinter(Virt, 1, 9);        // setting 1 = paper, DMPAPER_A4
    Pdf.SetupPrinter(Virt, 11, 1);       // setting 11 = orientation, 1 = portrait
    Opt := Pdf.PrintOptions(1, 1, 'Monthly Report');  // fit to paper, auto-rotate + center
    Pdf.PrintDocument(Virt, 1, Pdf.PageCount, Opt);
  finally
    Pdf.Free;
  end;
end;

Ellenőrzés kiadás előtt

Kiadás előtt ellenőrizze a kimeneti fájlt, a metaadatokat, a titkosítást, a renderelést vagy az importált állapotot, a cikk témájának megfelelően. Jegyezze fel az eszközverziót, a komponensverziót, a tesztfájlt és a megfigyelt eredményt.

A terméknevek, API-nevek és kódrészletek változatlanok maradnak, hogy a fejlesztők könnyen összevethessék őket a dokumentációval és a forráskóddal

Kapcsolódó olvasnivaló

További kódpéldák

procedure ShowPrinterTruePreview(Pdf: TPDFlib; const Virt: WideString; Opt: Integer);
var
  Data: AnsiString;
  Strm: TMemoryStream;
  Bmp: TBitmap;
begin
  Data := Pdf.GetPrintPreviewBitmapToString(Virt, 1, Opt, 1200, 0);
  Strm := TMemoryStream.Create;
  try
    Strm.WriteBuffer(PAnsiChar(Data)^, Length(Data));
    Strm.Position := 0;
    Bmp := TBitmap.Create;
    try
      Bmp.LoadFromStream(Strm);
      PreviewImage.Picture.Assign(Bmp);
    finally
      Bmp.Free;
    end;
  finally
    Strm.Free;
  end;
end;

Kiegészítő megjegyzések

Ez a kiegészítés a rövid verziót egy használhatóbb munkalappá bővíti, miközben továbbra is illeszkedik a PDFlibPas Print Preview and Device-Context Output in Delphi és az angol alapcikk technikai keretéhez. A szövegnek világosan meg kell mutatnia, milyen bemenettől indul a téma, milyen kimenet a cél, és melyik ellenőrzési ponton kell a viselkedést visszaigazolni.

Az átdolgozásnál a döntési sorrend számít: először az adat alakja, utána a módosítás határa, majd az API-függőségek, végül a tényleges viselkedés. Ha a cikk több lehetőséget említ, érdemes azt is leírni, melyik út védhetőbb karbantartás, támogatás és hibareprodukció szempontjából.

Minden code block, fájlnév, API-név és literal érték maradjon változatlan. A környező magyarázat lehet részletesebb, de a példakódnak ugyanazt a pontos referenciát kell adnia, hogy az olvasó közvetlenül összevesse a saját Delphi-, C++Builder- vagy Lazarus/FPC-projektjével.

A validation részben szerepeljen kis mintaállomány, kimenet-összevetés, valamint component- vagy validator-verzió rögzítése. Ha bug fixről vagy migrációról van szó, a reprodukciós útvonalat, az első megfigyelt állapotot és az ellenőrzési pontot is világosan kell leírni, hogy a regression később ne találgatás legyen.

Az ilyen bővítés azért hasznos, mert a lap nem csak első olvasásra marad értelmezhető: reviewernek döntési háttér, supportnak vizsgálati kontextus, a karbantartó csapatnak pedig hivatkozható megjegyzés lesz a következő módosítások előtt.

  • A termék-, API-, fájl- és literal neveket ne módosítsd
  • A code blockot, ha van, hagyd érintetlenül
  • A validationhez adj mintafájlt és összevethető kimenetet
  • A döntési sorrendet ne csak röviden, hanem érthetően írd le