画像をPDFに変換することは、ドキュメント管理、アーカイブ、および共有において一般的な要件です。 画像からPDFへの変換 このデモでは、PDFium VCLを利用して、複数の画像からマルチページのPDFドキュメントを作成する方法を示します。
概要
このデモでは、ユーザーは複数の画像を選択し、プレビューし、必要に応じて並べ替え、それらを単一のPDFドキュメントに変換できます。各画像はPDFの1ページになり、適切に拡大縮小され、中央に配置されます。
主な機能
- 複数画像対応 – 複数の画像を一度に追加
- 対応形式 – JPEG、PNG、BMP、GIF、およびTIFF画像
- 画像プレビュー – 変換前にプレビュー画像を表示します
- 自動ページサイズ調整 – 画像の向きに基づいて、縦向きまたは横向きを選択します
- スマートスケーリング – 画像は余白を考慮してページに収まるように拡大縮小されます
- 画像情報 – 各ページに、元のサイズと拡大縮小率が表示されます
PDFium DLL の要件
PDFium VCL アプリケーションを実行する前に、PDFium DLL ファイルがインストールされていることを確認してください。
pdfium32.dll/pdfium64.dll– 標準バージョン(約 5-6 MB)pdfium32v8.dll/pdfium64v8.dll– V8 JavaScript エンジン付き(約 23-27 MB)
インストール: 実行 PDFiumVCL\DLLs\CopyDlls.bat 管理者権限で、DLLファイルをWindowsシステムディレクトリに自動的にコピーします。
画像から PDF ファイルを作成する
核心変換过程:
|
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; |
画像をリストに追加する
|
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; |
利用 AddPicture 方法。
AddPicture メソッドは TPicture オブジェクトを受け取り、このオブジェクトはさまざまな画像形式をサポートします。
|
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); |
JPEG 画像を直接追加する
JPEG 画像では、最適化された AddJpegImage メソッドを利用できます。
|
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; |
選択した画像のプレビュー
|
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; |
画像の削除と並べ替え
|
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; |
ダイアログの設定
|
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; |
利用例
- 写真アルバム – デジタル写真からPDFアルバムを作成
- 文書スキャン – スキャンしたページ画像を1つのPDFに結合
- ポートフォリオの作成 – 画像素材からポートフォリオ PDF ファイルを作成します。
- アーカイブ – 画像の集合を長期保存用の PDF ファイルに変換します。
- レポート作成 – PDF レポートにスクリーンショットやグラフを含めます。
結論
Image to PDF デモは、PDFium VCL を使用して画像から実用的な PDF ドキュメントを簡単に作成できることを示します。自動ページサイズ調整、スマートスケーリング、多様な画像形式のサポートにより、強力な画像 PDF 変換ツールを構築できます。
The AddPicture この方法では、画像を PDF ページへ埋め込む複雑な処理をコンポーネントに任せ、アプリケーションのユーザーインターフェイスとワークフローに集中できます。
试用PDFium VCLコンポーネント。 からloslab.com开始、立即作成PDFファイル。