Les documents PDF contiennent souvent des images précieuses : photographies, schémas, graphiques et illustrations. Extraire les images La démo montre comment extraire toutes les images intégrées d'un document PDF à l'aide de PDFium VCL, et les enregistrer dans des formats optimaux en fonction de leurs caractéristiques.
Aperçu
Cette démo extrait les images (bitmaps) intégrées des pages PDF et les enregistre sous forme de fichiers image distincts. Elle inclut un aperçu des images, la détection du format et l'extraction par lots avec suivi de la progression.
Principales fonctionnalités
- Extraire toutes les images – Extraire chaque image intégrée du PDF.
- Sélection de la plage de pages – Extraire uniquement des pages spécifiques.
- Détection intelligente du format. – Choisit automatiquement JPEG, PNG ou BMP en fonction des caractéristiques de l'image.
- Aperçu de l'image. – Aperçu des images extraites avant de les enregistrer.
- Informations détaillées. – Afficher les dimensions, le format et la taille du fichier.
- Traitement par lots. – Extraire plusieurs images avec suivi de la progression.
Exigences des DLL PDFium
Avant d'exécuter toute application PDFium VCL, assurez-vous que les fichiers DLL PDFium sont installés :
pdfium32.dll/pdfium64.dll– Versions standard (environ 5-6 Mo)pdfium32v8.dll/pdfium64v8.dll– Avec le moteur JavaScript V8 (environ 23-27 Mo)
Installation : Exécuter PDFiumVCL\DLLs\CopyDlls.bat en tant qu'administrateur pour copier automatiquement les DLL dans les répertoires système Windows.
Extraction d'images de base.
Accédez aux images intégrées via le Bitmap et BitmapCount propriétés :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
procedure ExtractImagesSimple; var Pdf: TPdf; I, J: Integer; Bitmap: TBitmap; begin Pdf := TPdf.Create(nil); try Pdf.FileName := 'document.pdf'; Pdf.Active := True; // Loop through all pages for I := 1 to Pdf.PageCount do begin Pdf.PageNumber := I; // Loop through all images on this page for J := 0 to Pdf.BitmapCount - 1 do begin Bitmap := Pdf.Bitmap[J]; try // Save as BMP Bitmap.SaveToFile(Format('Page%d_Image%d.bmp', [I, J + 1])); finally Bitmap.Free; end; end; end; finally Pdf.Active := False; Pdf.Free; end; end; |
Extraction complète avec détection de format.
La démo implémente une sélection intelligente du format :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
procedure TFormMain.ButtonExtractClick(Sender: TObject); var I, J, StartPage, EndPage: Integer; Bitmap: TBitmap; FullFileName, DetectedFormat, ImageExtension: string; ImageInfo: TImageInfo; begin FCancelled := False; FProcessedImages := 0; FTotalImages := 0; ClearExtractedImages; EnableControls(False); try Pdf.FileName := EditPdfFile.Text; Pdf.PageNumber := 0; Pdf.Active := True; ParsePageRange(EditPageRange.Text, StartPage, EndPage); if EndPage = -1 then EndPage := Pdf.PageCount; // Calculate total images for progress for I := StartPage to EndPage do begin Pdf.PageNumber := I; FTotalImages := FTotalImages + Pdf.BitmapCount; end; ProgressBar.Max := FTotalImages; // Extract images for I := StartPage to EndPage do begin if FCancelled then Break; Pdf.PageNumber := I; for J := 0 to Pdf.BitmapCount - 1 do begin if FCancelled then Break; Bitmap := Pdf.Bitmap[J]; if Assigned(Bitmap) then begin try // Detect optimal format DetectedFormat := DetectImageFormat(Bitmap); ImageExtension := GetExtensionForFormat(DetectedFormat); FullFileName := Format('%s\Page%d_Image%d%s', [FCurrentOutputDir, I, J + 1, ImageExtension]); SaveBitmapInOptimalFormat(Bitmap, FullFileName); // Store image info for preview ImageInfo.FileName := FullFileName; ImageInfo.PageNumber := I; ImageInfo.ImageIndex := J + 1; ImageInfo.Width := Bitmap.Width; ImageInfo.Height := Bitmap.Height; ImageInfo.Format := DetectedFormat; ImageInfo.Bitmap := TBitmap.Create; ImageInfo.Bitmap.Assign(Bitmap); AddImageInfo(ImageInfo); Inc(FProcessedImages); ProgressBar.Position := FProcessedImages; finally Bitmap.Free; end; end; end; end; UpdateImageList; finally Pdf.Active := False; EnableControls(True); end; end; |
Détection intelligente du format.
Choisissez le format optimal en fonction des caractéristiques de l'image :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function TFormMain.DetectImageFormat(ABitmap: TBitmap): string; begin // Check if image has transparency (alpha channel) if ABitmap.PixelFormat = pf32bit then begin // PNG for transparency support Result := 'PNG'; end // Check if it's likely a photographic image else if (ABitmap.Width * ABitmap.Height > 100000) and (ABitmap.PixelFormat in [pf24bit, pf32bit]) then begin // Large, complex image - use JPEG for smaller file size Result := 'JPEG'; end else begin // Small or simple image - preserve quality with BMP Result := 'BMP'; end; end; function TFormMain.GetExtensionForFormat(const AFormat: string): string; begin case UpperCase(AFormat)[1] of 'J': Result := '.jpg'; 'P': Result := '.png'; 'B': Result := '.bmp'; else Result := '.bmp'; end; end; |
Enregistrement au format optimal.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
procedure TFormMain.SaveBitmapInOptimalFormat(ABitmap: TBitmap; const AFileName: string); var JpegImg: TJPEGImage; FileExt: string; begin FileExt := UpperCase(ExtractFileExt(AFileName)); if FileExt = '.JPG' then begin // Save as JPEG with good quality JpegImg := TJPEGImage.Create; try JpegImg.Assign(ABitmap); JpegImg.CompressionQuality := 85; // Good quality/size balance JpegImg.SaveToFile(AFileName); finally JpegImg.Free; end; end else if FileExt = '.PNG' then begin // PNG would require additional library // Fall back to BMP for compatibility ABitmap.SaveToFile(ChangeFileExt(AFileName, '.bmp')); end else begin // BMP - lossless quality ABitmap.SaveToFile(AFileName); end; end; |
Utilisation de TPdfImage pour les données d'image brutes.
Pour les cas d'utilisation avancés, accédez aux données d'image brutes.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
procedure ProcessRawImageData; var Pdf: TPdf; I: Integer; PdfImage: TPdfImage; begin Pdf := TPdf.Create(nil); try Pdf.FileName := 'document.pdf'; Pdf.Active := True; Pdf.PageNumber := 1; for I := 0 to Pdf.ImageCount - 1 do begin PdfImage := Pdf.Image[I]; // Access raw image properties ShowMessage(Format('Image %d: %d x %d, %d bytes', [I, PdfImage.Width, PdfImage.Height, Length(PdfImage.Data)])); // PdfImage.Data contains raw pixel data end; finally Pdf.Active := False; Pdf.Free; end; end; |
Affichage des informations de l'image.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
procedure TFormMain.UpdatePreview(Index: Integer); var Info: TImageInfo; begin if (Index >= 0) and (Index < Length(FExtractedImages)) then begin Info := FExtractedImages[Index]; // Update preview if Assigned(Info.Bitmap) then ImagePreview.Picture.Assign(Info.Bitmap); // Update info display MemoInfo.Lines.Clear; MemoInfo.Lines.Add('File: ' + ExtractFileName(Info.FileName)); MemoInfo.Lines.Add('Page: ' + IntToStr(Info.PageNumber)); MemoInfo.Lines.Add('Dimensions: ' + IntToStr(Info.Width) + ' x ' + IntToStr(Info.Height)); MemoInfo.Lines.Add('Format: ' + Info.Format); if Info.Size > 0 then MemoInfo.Lines.Add('Size: ' + FormatFloat('#,##0', Info.Size) + ' bytes'); end; end; |
Analyse de la plage de pages.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
procedure TFormMain.ParsePageRange(const ARange: string; var AStartPage, AEndPage: Integer); var RangeStr: string; DashPos: Integer; begin RangeStr := Trim(ARange); AStartPage := 1; AEndPage := -1; // -1 means extract to end if (RangeStr = '') or (UpperCase(RangeStr) = 'ALL') then Exit; DashPos := Pos('-', RangeStr); if DashPos > 0 then begin // Range format: start-end AStartPage := StrToIntDef(Trim(Copy(RangeStr, 1, DashPos - 1)), 1); AEndPage := StrToIntDef(Trim(Copy(RangeStr, DashPos + 1, Length(RangeStr))), -1); end else begin // Single page AStartPage := StrToIntDef(RangeStr, 1); AEndPage := AStartPage; end; end; |
Ouvrir le dossier des images extraites.
|
1 2 3 4 5 6 7 |
procedure TFormMain.ButtonOpenFolderClick(Sender: TObject); begin if DirectoryExists(FCurrentOutputDir) then ShellExecute(Handle, 'open', PChar(FCurrentOutputDir), nil, nil, SW_SHOWNORMAL) else ShowMessage('Output directory does not exist.'); end; |
Cas d'utilisation.
- Extraction d'actifs numériques. – Extraire des photos et des graphiques à partir de supports marketing.
- Conversion de documents. Préparation des images pour le web ou d'autres formats.
- Traitement des archives. Extraction d'images à partir d'archives de documents numérisés.
- Analyse de contenu. Extraction d'images pour l'apprentissage automatique ou l'analyse.
Conclusion.
La démo "Extract Images" montre à quel point il est facile d'extraire des images intégrées à partir de documents PDF avec PDFium VCL. Le composant gère l'analyse complexe des PDF, tandis que vous vous concentrez sur la manière d'utiliser les images extraites dans votre application.
Combiné à une détection intelligente du format, vous pouvez créer des outils d'extraction d'images professionnels qui produisent une sortie optimisée pour tout cas d'utilisation.
Explorer. Composant PDFium. sur loslab.com et débloquez le contenu de vos documents PDF.