Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
C++Delphi

PDFium – Delphi/C++Builder FireMonkeyアプリケーション向けPDFエンジン

はじめに

PDFium Component Suite for FireMonkeyは、PDFドキュメントを扱うさまざまな機能を提供します。この製品では、PDFiumオープンソースPDFレンダリングエンジンを用いており、Windows、macOS、iOS、Androidをサポートしています。

PDFium自身は、Chromiumプロジェクトで使用されています。つまり、PDFiumの「ium」は、Chromiumに由来しています。これは完全なオープンソースプロジェクトですので、こちらからコントリビュートすることができます。

インストール

PDFium Component Suiteはコンポーネントであり、複数OSをサポートしているため、インストールファイルがあります。もし、インストールに関して不明点がある場合には、PDFium Component Suite for FireMonkeyのインストール方法を紹介するショートビデオをご覧ください。

概要

インストールに成功すると、パレットには以下の2つのコンポーネントが追加されます。

pdfium-on-palette-9815675-8987331

TFPdfは、PDFドキュメントを扱います。このコンポーネント用いれば、PDFドキュメントの作成と処理が可能になります。

TFPdfViewは、FireMonkeyアプリケーションでPDFドキュメントを表示するためのコンポーネントです。

PDFium Suiteでできること

  • PDFドキュメントの作成
  • PDFドキュメントからの画像抽出
  • テキスト抽出
  • テキストページ抽出
  • PDFドキュメントのマージ
  • PDFのJPGへの変換

開発

PDFium Suiteで、PDFドキュメントをJPGイメージファイルに変換する方法を見てみましょう。

FormCreateでは、GetDisplayMetrics関数を用いて、1インチあたりのピクセル数(PPI)を取得します。

procedure TFormMain.FormCreate(Sender: TObject);
var DeviceBehavior: IDeviceBehavior;
begin
  PixelsPerInch := 96;
  if TBehaviorServices.Current.SupportsBehaviorService(IDeviceBehavior, DeviceBehavior, Self) then
    PixelsPerInch := DeviceBehavior.GetDisplayMetrics(Self).PixelsPerInch;
end;

「Convertor」ボタンを押すことで、処理を実行します。ページ番号0から開始し、RenderPageプロシージャを用いて、ページをレンダリングします。そして、TBitmapベースのデータをファイルに保存します。

procedure TFormMain.ButtonConvertClick(Sender: TObject);
var
  I: Integer;
  FileName: string;
  Bitmap: TBitmap;
begin
  ProgressBar.Value := 0;
  EditPdfFile.Enabled := False;
  ButtonPdfFile.Enabled := False;
  ButtonConvert.Enabled := False;
  FormMain.Cursor := crHourGlass;
  try
    FPdf.FileName := EditPdfFile.Text;
    FPdf.PageNumber := 0;
    FPdf.Active := True;
    ProgressBar.Max := FPdf.PageCount;

    FileName := ExtractFileName(FPdf.FileName);
    FileName := Copy(FileName, 1, Length(FileName) - Length(ExtractFileExt(FPdf.FileName)));
    FileName := ExtractFilePath(FPdf.FileName) + FileName;

    for I := 1 to FPdf.PageCount do
    begin
      FPdf.PageNumber := I;

      Bitmap := FPdf.RenderPage(0, 0,
        Round(PointsToPixels(FPdf.PageWidth, PixelsPerInch)),
        Round(PointsToPixels(FPdf.PageHeight, PixelsPerInch)));
      try
        Bitmap.SaveToFile(FileName + '_Page' + IntToStr(I) + '.jpg');
      finally
        Bitmap.Free;
      end;

      ProgressBar.Value := I;
      Application.ProcessMessages;
    end;
  finally
    FormMain.Cursor := crDefault;
    FPdf.Active := False;
    EditPdfFile.Enabled := True;
    ButtonPdfFile.Enabled := True;
    ButtonConvert.Enabled := True;
  end;
end;

PDFドキュメントから画像を抽出

PDFドキュメントから画像を取得する場合も、処理を実行する前にファイル名とパスを指定して初期設定を行う点は同じです。あとは、BitmapCountを使ってTFPdfを反復処理するだけで、インデックスを用いて画像を取得できます。

for I := 1 to FPdf.PageCount do
    begin
      FPdf.PageNumber := I;
      for J := 0 to FPdf.BitmapCount - 1 do
      begin
        Bitmap := FPdf.Bitmap[J];
        try
          Bitmap.SaveToFile(FileName + '_Page' + IntToStr(I) + '_Image' + IntToStr(J + 1) + '.bmp');
        finally
          Bitmap.Free;
        end;
      end;
      ProgressBar.Value := I;
      Application.ProcessMessages;
    end;

テキストの抽出

Text関数を用いれば、PDFドキュメントからテキストをフェッチし、コンテンツをファイルに保存することができます。

FileStream := TFileStream.Create(FileName + '.txt', fmCreate);
try
  for I := 1 to FPdf.PageCount do
  begin
    FPdf.PageNumber := I;
    Text := UTF8Encode(FPdf.Text);
    if Text <> '' then
    begin
      FileStream.WriteBuffer(Text[1], Length(Text));
      FileStream.WriteBuffer(NewLine[1], Length(NewLine));
      FileStream.WriteBuffer(NewLine[1], Length(NewLine));
    end;
    ProgressBar.Value := I;
    Application.ProcessMessages;
   end;
finally
   FileStream.Free;
end;

以上の操作を実際にご覧いただくには、以下のデモアクションビデオをチェックしてください。

PDFium Component Suite for FireMonkeyの機能詳細については、こちらのページをご覧ください。

PDFium Component Suite for FireMonkeyは、WinSoft社の製品です。この記事に記載された機能を利用するには、WinSoft社のサイトからPDFium Component Suite for FireMonkeyを購入する必要があります。PDFium Component Suite for FireMonkeyに関するサポートは、WinSoft社によって提供されます。

RAD Studio 13.1 Florence Now Available See What's New in RAD Studio 13.1 Delphi is 31 - Webinar Replay

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.

Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

IN THE ARTICLES