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