Artikel Teknis

Menggabungkan Gambar Pindaian ke Satu PDF dengan PDFium Component di Delphi

Resep ini mengambil daftar file gambar dan menghasilkan satu file PDF di mana setiap gambar menjadi satu halaman. Ukuran halaman ditetapkan di muka (A4 portrait dalam contoh), dan setiap gambar diskalakan agar pas di area yang dapat dicetak sambil mempertahankan rasio aspeknya. PDFium Component menangani penulisan PDF yang sebenarnya; kode Delphi hanya mengelola iterasi dan penskalaan

Prosedur tingkat atas: buat dokumen dan iterasi file

procedure TArchiveForm.ScansToPdf(const Files: TStrings; const OutputPath: string);
const
  PageW = 595.0;   // A4 width in points
  PageH = 842.0;   // A4 height in points
  Margin = 36.0;   // half-inch border around each scan
var
  I: Integer;
  Pdf: TPdf;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.CreateDocument;                       // new, empty, already active
    for I := 0 to Files.Count - 1 do
      PlaceScan(Pdf, Files[I], PageW, PageH, Margin);
    Pdf.SaveToFile(OutputPath);
  finally
    Pdf.Free;
  end;
end;

CreateDocument menghasilkan dokumen baru yang sudah aktif di memori. Anda tidak perlu menetapkan FileName atau Active terlebih dahulu ketika membuat dokumen dari awal. SaveToFile menulis ke disk saat semua halaman selesai ditambahkan

Menempatkan satu gambar pindaian ke halaman baru

procedure TArchiveForm.PlaceScan(Pdf: TPdf; const ImageFile: string;
  PageW, PageH, Margin: Single);
var
  Bmp: TBitmap;
  AreaW, AreaH, ImgW, ImgH, Scale, PlacedW, PlacedH, X, Y: Single;
begin
  Bmp := TBitmap.Create;
  try
    AddJpegImage(Bmp, ImageFile);      // load JPEG into TBitmap

    Pdf.AddPage(0, PageW, PageH);      // rotation=0, width, height in points

    AreaW := PageW - 2 * Margin;
    AreaH := PageH - 2 * Margin;
    ImgW  := Bmp.Width;
    ImgH  := Bmp.Height;

    // scale-to-fit, preserving aspect ratio
    Scale    := Min(AreaW / ImgW, AreaH / ImgH);
    PlacedW  := ImgW * Scale;
    PlacedH  := ImgH * Scale;

    // centre the image within the printable area
    X := Margin + (AreaW - PlacedW) / 2;
    Y := Margin + (AreaH - PlacedH) / 2;

    Pdf.AddImage(Bmp, X, Y, PlacedW, PlacedH);
  finally
    Bmp.Free;
  end;
end;

Memuat JPEG ke TBitmap

PDFium Component menerima TBitmap untuk penempatan gambar. Untuk memuat JPEG terlebih dahulu ke bitmap, Anda perlu konversi eksplisit:

procedure AddJpegImage(Dest: TBitmap; const FileName: string);
var
  Jpeg: TJPEGImage;
  Stream: TFileStream;
begin
  Jpeg := TJPEGImage.Create;
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Jpeg.LoadFromStream(Stream);
    Dest.Assign(Jpeg);          // converts JPEG to 24-bit RGB bitmap
  finally
    Stream.Free;
    Jpeg.Free;
  end;
end;

Menambahkan keterangan teks di bawah setiap gambar

Jika Anda ingin mencetak nama file atau nomor halaman di bawah setiap pindaian, tambahkan teks segera setelah menempatkan gambar, sebelum berpindah ke halaman berikutnya:

procedure AddText(Pdf: TPdf; const Caption: string;
  PageW, PageH, Margin: Single);
var
  TextY: Single;
begin
  TextY := Margin / 2;   // centre text in the bottom margin strip
  Pdf.AddText(Caption, 'Arial', 9,
              Margin,    // X: left margin
              TextY);    // Y: bottom of page (PDF Y=0 is bottom)
end;

Sistem koordinat PDF memiliki Y=0 di bagian bawah halaman, sehingga nilai Y kecil menempatkan teks di dekat tepi bawah. Margin setengah inci (36 poin) di bagian bawah memberikan cukup ruang untuk satu baris teks keterangan berukuran 9pt

Untuk panduan pembuatan PDF lainnya, lihat artikel membuat PDF dari awal dan mengonversi halaman PDF ke gambar JPEG, atau kunjungi halaman produk PDFium Component