Artikel Teknis

Mengekstrak Gambar dari Dokumen PDF dengan PDFium Component di Delphi

PDF bisa menyimpan gambar raster yang tertanam langsung di dalam objek halaman. PDFium Component mengekspos gambar-gambar tersebut per halaman melalui properti BitmapCount dan array Bitmap[]. Artikel ini membahas cara membuka dokumen dengan benar, mengiterasi halaman, mengekstrak setiap gambar, dan menyimpannya sebagai JPEG atau BMP

Membuka dokumen dan menjaga terhadap kegagalan diam

PDFium Component tidak memunculkan exception saat LoadFromFile gagal karena file rusak atau dilindungi sandi; alih-alih, properti Active tetap False. Selalu periksa kondisi ini sebelum mengakses properti lain:

procedure TExtractForm.OpenDocument(const PdfFile: string);
begin
  Pdf.LoadFromFile(PdfFile);
  if not Pdf.Active then
  begin
    ShowMessage('Cannot open: ' + PdfFile);
    Exit;
  end;
  StatusBar.SimpleText := Format('%d page(s) loaded', [Pdf.PageCount]);
end;

Mengekstrak semua gambar dari setiap halaman

procedure TExtractForm.ExtractAllImages(const OutputDir: string);
var
  Page, Img: Integer;
  Bmp: TBitmap;
  OutPath: string;
begin
  if not Pdf.Active then Exit;

  for Page := 1 to Pdf.PageCount do
  begin
    Pdf.PageNumber := Page;
    for Img := 0 to Pdf.BitmapCount - 1 do
    begin
      Bmp := Pdf.Bitmap[Img];     // PDFium owns this object; do NOT free it
      if Assigned(Bmp) then
      begin
        OutPath := Format('%spage%d_img%d.bmp', [OutputDir, Page, Img]);
        Bmp.SaveToFile(OutPath);
      end;
    end;
  end;
end;

Objek TBitmap yang dikembalikan oleh Bitmap[Img] dimiliki oleh komponen PDFium. Jangan panggil Free pada objek tersebut. Jika Anda perlu memodifikasi atau menyimpan gambar dalam format berbeda, salin dulu ke instance TBitmap yang Anda miliki menggunakan Assign

Menyimpan gambar sebagai JPEG

procedure TExtractForm.SaveBitmap(Bmp: TBitmap; const FileName: string;
  AsJpeg: Boolean);
var
  Jpeg: TJPEGImage;
  Copy: TBitmap;
begin
  if AsJpeg then
  begin
    Jpeg := TJPEGImage.Create;
    Copy := TBitmap.Create;
    try
      Copy.Assign(Bmp);          // own copy — safe to pass to TJPEGImage
      Jpeg.CompressionQuality := 85;
      Jpeg.Assign(Copy);
      Jpeg.SaveToFile(FileName);
    finally
      Copy.Free;
      Jpeg.Free;
    end;
  end
  else
    Bmp.SaveToFile(FileName);    // BMP: direct save, no copy needed
end;

Langkah salinan (Copy.Assign(Bmp)) diperlukan sebelum TJPEGImage.Assign karena TJPEGImage mengharapkan bitmap dengan piksel yang dapat dibaca secara bebas, sementara objek milik PDFium mungkin memiliki pembatasan akses piksel di beberapa build

Untuk teknik ekstraksi konten lainnya, lihat artikel mengekstrak teks dari PDF, atau kunjungi halaman produk PDFium Component