Technisch artikel

Afbeeldingen converteren naar PDF-documenten met PDFium VCL in Delphi

· PDF-programmeren

Het converteren van afbeeldingen naar PDF is een veel voorkomende vereiste voor documentbeheer, archivering en delen. De Afbeelding naar PDF De demo laat zien hoe u PDF-documenten van meerdere pagina's kunt maken op basis van een verzameling afbeeldingen met behulp van PDFium VCL.

Overzicht

Met deze demo kunnen gebruikers meerdere afbeeldingen selecteren, een voorbeeld ervan bekijken, indien nodig opnieuw ordenen en ze converteren naar één PDF-document. Elke afbeelding wordt een pagina in de PDF, correct geschaald en gecentreerd.

Belangrijkste kenmerken

  • Ondersteuning voor meerdere afbeeldingen – Voeg meerdere afbeeldingen tegelijk toe
  • Formaatondersteuning – JPEG-, PNG-, BMP-, GIF- en TIFF-afbeeldingen
  • Afbeeldingsvoorbeeld – Bekijk een voorbeeld van afbeeldingen vóór de conversie
  • Automatische paginagrootte – Portret of landschap op basis van de beeldoriëntatie
  • Slim schalen – Afbeeldingen worden geschaald zodat ze op de pagina met marges passen
  • Afbeeldingsinformatie – Origineelformaat en schaalfactor weergegeven op elke pagina

PDFium DLL-vereisten

Voordat u een PDFium VCL-toepassing uitvoert, moet u ervoor zorgen dat de PDFium DLL-bestanden zijn geïnstalleerd:

  • pdfium32.dll / pdfium64.dll – Standaardversies (~5-6 MB)
  • pdfium32v8.dll / pdfium64v8.dll – Met V8 JavaScript-engine (~23-27 MB)

Installatie: Loop PDFiumVCL\DLLs\CopyDlls.bat als beheerder om de DLL's automatisch naar Windows-systeemmappen te kopiëren.

PDF's maken van afbeeldingen

Het kernconversieproces:

Urvanov Syntaxis Markeerstift v2.9.1
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
88
89
90
91
92
93
94
95
96
97
98
99
100
procedure TFormMain.CreatePDFFromImages;
var
  I: Integer;
  PageWidth, PageHeight: Double;
  ImageWidth, ImageHeight: Double;
  ScaleX, ScaleY, Scale: Double;
  ImageSize: TSize;
  X, Y: Double;
  Picture: TPicture;
begin
  if FImageList.Count = 0 then
    Exit;
    
  ProgressBar.Visible := True;
  ProgressBar.Max := FImageList.Count;
  ProgressBar.Position := 0;
  
  try
    // Create new PDF document
    Pdf.CreateDocument;
    Pdf.Active := True;
    
    for I := 0 to FImageList.Count - 1 do
    begin
      try
        // Load the image
        Picture := TPicture.Create;
        try
          Picture.LoadFromFile(FImageList[I]);
          
          // Get image dimensions
          ImageSize.cx := Picture.Width;
          ImageSize.cy := Picture.Height;
          
          // Set page orientation based on image
          if ImageSize.cx > ImageSize.cy then
          begin
            // Landscape
            PageWidth := 842;  // A4 landscape
            PageHeight := 595;
          end
          else
          begin
            // Portrait
            PageWidth := 595;  // A4 portrait
            PageHeight := 842;
          end;
          
          // Create page
          Pdf.AddPage(I + 1, PageWidth, PageHeight);
          Pdf.PageNumber := I + 1;
          
          // Calculate scaling
          ImageWidth := ImageSize.cx;
          ImageHeight := ImageSize.cy;
          
          ScaleX := (PageWidth - 80) / ImageWidth;   // 40pt margin each side
          ScaleY := (PageHeight - 120) / ImageHeight; // 40pt + space for text
          Scale := Min(ScaleX, ScaleY);
          
          ImageWidth := ImageWidth * Scale;
          ImageHeight := ImageHeight * Scale;
          
          // Center on page
          X := (PageWidth - ImageWidth) / 2;
          Y := (PageHeight - ImageHeight) / 2;
          
          // Add image to PDF
          Pdf.AddPicture(Picture, X, Y, ImageWidth, ImageHeight);
          
          // Add image information
          Pdf.AddText(Format('File: %s', [ExtractFileName(FImageList[I])]),
            'Arial', 10, X, Y + ImageHeight + 10, clBlack, $FF, 0.0);
          Pdf.AddText(Format('Original: %dx%d px, Scale: %.1f%%',
            [ImageSize.cx, ImageSize.cy, Scale * 100]),
            'Arial', 8, X, Y + ImageHeight + 25, clGray, $FF, 0.0);
            
        finally
          Picture.Free;
        end;
        
        ProgressBar.Position := I + 1;
        Application.ProcessMessages;
        
      except
        on E: Exception do
          // Continue with next image on error
          LabelStatus.Caption := 'Error: ' + E.Message;
      end;
    end;
    
    // Save the PDF
    Pdf.SaveAs(SaveDialog.FileName);
    ShowMessage(Format('PDF created with %d pages!', [FImageList.Count]));
    
  finally
    ProgressBar.Visible := False;
    Pdf.Active := False;
  end;
end;
[Formaattijd: 0,0017 seconden]

Afbeeldingen aan de lijst toevoegen

Urvanov Syntaxis Markeerstift v2.9.1
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
procedure TFormMain.BtnAddImagesClick(Sender: TObject);
var
  I: Integer;
  ListItem: TListItem;
  FileSize: Int64;
  FileSizeStr: string;
begin
  if OpenPictureDialog.Execute then
  begin
    for I := 0 to OpenPictureDialog.Files.Count - 1 do
    begin
      FImageList.Add(OpenPictureDialog.Files[I]);
      
      // Add to ListView
      ListItem := ListView.Items.Add;
      ListItem.Caption := ExtractFileName(OpenPictureDialog.Files[I]);
      ListItem.SubItems.Add(OpenPictureDialog.Files[I]); // Full path
      
      // Get file size
      try
        FileSize := GetFileSizeHelper(OpenPictureDialog.Files[I]);
        if FileSize >= 1024 * 1024 then
          FileSizeStr := Format('%.1f MB', [FileSize / (1024 * 1024)])
        else if FileSize >= 1024 then
          FileSizeStr := Format('%.1f KB', [FileSize / 1024])
        else
          FileSizeStr := Format('%d bytes', [FileSize]);
      except
        FileSizeStr := 'Unknown';
      end;
      ListItem.SubItems.Add(FileSizeStr);
    end;
    
    UpdateUI;
    LabelStatus.Caption := Format('Added %d image(s). Total: %d images',
      [OpenPictureDialog.Files.Count, FImageList.Count]);
  end;
end;
[Formaattijd: 0,0006 seconden]

Met behulp van de AddPicture-methode

De AddPicture methode accepteert a TPicture object, dat verschillende afbeeldingsformaten ondersteunt:

Urvanov Syntaxis Markeerstift v2.9.1
1
2
3
4
5
// Add picture with automatic sizing
procedure TPdf.AddPicture(Picture: TPicture; X, Y: Double);
 
// Add picture with specific size
procedure TPdf.AddPicture(Picture: TPicture; X, Y, Width, Height: Double);
[Formaattijd: 0,0001 seconden]

JPEG-afbeeldingen rechtstreeks toevoegen

Voor JPEG-afbeeldingen kunt u het geoptimaliseerde AddJpegImage methode:

Urvanov Syntaxis Markeerstift v2.9.1
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
function AddJpegFromFile(const FileName: string): Boolean;
var
  Pdf: TPdf;
  FileStream: TFileStream;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.CreateDocument;
    Pdf.Active := True;
    Pdf.AddPage(1, 595, 842);
    Pdf.PageNumber := 1;
    
    FileStream := TFileStream.Create(FileName, fmOpenRead);
    try
      // Add JPEG directly - more efficient than loading as TPicture
      Result := Pdf.AddJpegImage(FileStream, 50, 50, 495, 742);
    finally
      FileStream.Free;
    end;
    
    Pdf.SaveAs('output.pdf');
    
  finally
    Pdf.Active := False;
    Pdf.Free;
  end;
end;
[Formaattijd: 0,0003 seconden]

Voorbeeld van geselecteerde afbeeldingen bekijken

Urvanov Syntaxis Markeerstift v2.9.1
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.ListViewSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
begin
  if Selected and (Item <> nil) then
  begin
    LoadImagePreview(Item.SubItems[0]); // Full path
  end;
end;
 
procedure TFormMain.LoadImagePreview(const FileName: string);
begin
  try
    if FileExists(FileName) then
    begin
      ImagePreview.Picture.LoadFromFile(FileName);
      ImagePreview.Proportional := True;
      ImagePreview.Stretch := True;
      LabelStatus.Caption := 'Preview: ' + ExtractFileName(FileName);
    end;
  except
    on E: Exception do
    begin
      ImagePreview.Picture.Assign(nil);
      LabelStatus.Caption := 'Error loading preview: ' + E.Message;
    end;
  end;
end;
[Formaattijd: 0,0003 seconden]

Afbeeldingen verwijderen en opnieuw rangschikken

Urvanov Syntaxis Markeerstift v2.9.1
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.BtnRemoveSelectedClick(Sender: TObject);
var
  I, RemovedCount: Integer;
begin
  RemovedCount := 0;
  
  if ListView.SelCount > 0 then
  begin
    // Remove from back to front to avoid index issues
    for I := ListView.Items.Count - 1 downto 0 do
    begin
      if ListView.Items[I].Selected then
      begin
        FImageList.Delete(I);
        ListView.Items.Delete(I);
        Inc(RemovedCount);
      end;
    end;
    
    if (FImageList.Count = 0) or (ListView.Selected = nil) then
      ImagePreview.Picture.Assign(nil);
      
    UpdateUI;
    LabelStatus.Caption := Format('Removed %d item(s). Total: %d images',
      [RemovedCount, FImageList.Count]);
  end;
end;
[Formaattijd: 0,0004 seconden]

Het dialoogvenster instellen

Urvanov Syntaxis Markeerstift v2.9.1
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
procedure TFormMain.FormCreate(Sender: TObject);
begin
  FImageList := TStringList.Create;
  
  // Setup ListView
  ListView.ViewStyle := vsReport;
  ListView.Columns.Add.Caption := 'File Name';
  ListView.Columns.Add.Caption := 'Path';
  ListView.Columns.Add.Caption := 'Size';
  ListView.Columns[0].Width := 200;
  ListView.Columns[1].Width := 300;
  ListView.Columns[2].Width := 100;
  ListView.RowSelect := True;
  ListView.MultiSelect := True;
  
  // Setup dialogs
  OpenPictureDialog.Filter :=
    'Image Files|*.jpg;*.jpeg;*.png;*.bmp;*.gif;*.tiff;*.tif|' +
    'JPEG Files|*.jpg;*.jpeg|' +
    'PNG Files|*.png|' +
    'Bitmap Files|*.bmp|' +
    'All Files|*.*';
  OpenPictureDialog.Options := [ofAllowMultiSelect, ofPathMustExist, ofFileMustExist];
  
  SaveDialog.Filter := 'PDF Files|*.pdf|All Files|*.*';
  SaveDialog.DefaultExt := 'pdf';
  
  UpdateUI;
end;
[Formaattijd: 0,0004 seconden]

Gebruiksscenario's

  • Fotoalbums – Maak PDF-albums van digitale foto's
  • Documenten scannen – Combineer gescande pagina-afbeeldingen in één PDF
  • Portefeuillecreatie – Maak portfolio-PDF's van illustraties
  • Archiveren – Converteer afbeeldingscollecties naar PDF's voor langdurige opslag
  • Rapportgeneratie – Voeg schermafbeeldingen en diagrammen toe aan PDF-rapporten

Conclusie

De Image to PDF-demo laat zien hoe PDFium VCL het eenvoudig maakt om professionele PDF-documenten van afbeeldingen te maken. Met automatische paginagrootte, slimme schaling en ondersteuning voor meerdere afbeeldingsformaten kunt u krachtige conversietools voor afbeeldingen naar PDF bouwen.

De AddPicture methode verwerkt de complexiteit van het insluiten van afbeeldingen in PDF-pagina's, terwijl u zich concentreert op de gebruikersinterface en workflow van uw applicatie.

Probeer de PDFium VCL-component van loslab.com en begin vandaag nog met het maken van pdf's van afbeeldingen.