FastReport VCLでPDF出力

# FastReport VCLでPDF出力

FastReport VCLにはPDFファイルを出力する機能があります。
製品版だけでなく、Embarcadero Editionでも利用できます。

今回は、このPDF出力を試したいと思います。



## デモプログラムを動かしてみよう

Fast Reports社のサイト
[FastReport Embarcadero Edition - Fast Reports Inc.](https://www.fast-report.com/en/fastreport-embarcadero-edition/)
から入手できる Embarcadero Edition には、デモプログラムが含まれているので、それにPDF出力を追加してみましょう。[^1]

[^1]: GetItからインストールできるFastRport VCLには、デモプログラムが含まれていないようです。

FastReportをインストールしたフォルダのDemosフォルダに、PrintStringListフォルダがあるので、それを適当な場所にコピーします。

コピーしたプロジェクトを、まずは、コンパイルします。

![1_form.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/f1eab077-307e-f90a-861f-57a9f9da3cb9.jpeg)

ボタンをクリックすると、プレビュー画面が表示します。

![2_preview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/778aa4aa-1c31-d95d-ef22-3217b7b598c4.jpeg)

## プレビュー画面のボタンを変えてみよう

プレビュー画面のボタンは、TfrxReportのPreviewOptionsにあるButtonsプロパティで表示する項目を指定できます。
また、PreviewOptionsにあるShowCaptionsプロパティで、Caption表示の有無を指定できます。

OnFormCreateイベントに、次のコードを追加して、プレビュー画面のボタンの表示を変えてみます。
また、データには、数字しか格納していないので、文字に変えてみます。

```pascal:Unit1.pas
procedure TForm1.FormCreate(Sender: TObject);
begin
  sl := TStringList.Create;
  // 格納する文字を変更
  sl.Add('リンゴ');
  sl.Add('みかん');
  sl.Add('イチゴ');
  sl.Add('パイナップル');
  sl.Add('グレープフルーツ');
  sl.Add('梨');
  sl.Add('葡萄');
  sl.Add('バナナ');
  sl.Add('スイカ');

  // 追加：ここから

  // 印刷プレビューのオプション設定
  with frxReport1.PreviewOptions do
  begin
		// ボタンで不要なものを非表示に
		Buttons := Buttons - [pbLoad, pbSave, pbExport, pbOutline, pbEdit];
		Buttons := Buttons + [pbNoFullScreen, pbNoEmail];
 		// キャプションを表示
		ShowCaptions := True;
  end;

  // 追加：ここまで
end;
```
![3_preview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/3e4517a1-db6a-7594-8ea4-718a0b9206a1.jpeg)



## PDF出力機能を追加してみよう

![10_form_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/f5441520-cdff-355d-2ba5-b8505ca04951.jpeg)

フォームにTfrxPDFExportを追加し、先ほどのOnFormCreateイベントのコードにPDFボタンを表示する箇所を追加します。

```pascal:Unit1.pas
procedure TForm1.FormCreate(Sender: TObject);
begin
  sl := TStringList.Create;
  sl.Add('リンゴ');
  sl.Add('みかん');
  sl.Add('イチゴ');
  sl.Add('パイナップル');
  sl.Add('グレープフルーツ');
  sl.Add('梨');
  sl.Add('葡萄');
  sl.Add('バナナ');
  sl.Add('スイカ');

  // 印刷プレビューのオプション設定
  with frxReport1.PreviewOptions do
  begin
		// ボタンで不要なものを非表示に
		Buttons := Buttons - [pbLoad, pbSave, pbExport, pbOutline, pbEdit];
		Buttons := Buttons + [pbNoFullScreen, pbNoEmail];
		// PDFボタンを表示						// 追加
		Buttons := Buttons + [pbExportQuick];	// 追加
		// キャプションを表示
		ShowCaptions := True;
  end;
end;
```

プレビュー画面を表示してみると、PDFボタンが追加されています。

![4_preview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/d4aa2c15-df5b-aec6-a08b-810ce0d7eac4.jpeg)

PDFファイルを出力し、Adobe Acrobat Readerで表示してみます。

![8_ExportPDF.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/8a67db3d-43b0-4563-7397-b0dfb59ac716.jpeg)


![4_PDF.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/58083040-8be1-049c-6c5b-7576c3c1f9de.jpeg)

日本語の部分が□になってますね。

## レポートを修正しよう

![5_form.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/1021e7c4-5589-a13b-8f34-14233dd4fb05.jpeg)


フォーム上にあるfrxReport1を右クリックして「Edit Report...」を選択すると、レポートデザイナーが開きます。[^2]

[^2]: frxReport1をダブルクリックして、開くこともできます。


![6_EditReport.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/77144ffa-0746-bdf2-d372-419cd9e90c89.jpeg)


"[Elements]"のプロパティにて、Fontプロパティのフォント名を「ＭＳ ゴシック」に、「文字セット」を「日本語」に設定します。
また、データを日本語に書き換えて文字数も増えたので、すべて表示できるように幅を広げておきます。

コンパイル後、PDFファイルを出力して、Adobe Acrobat Readerで表示してみます。

![7_PDF.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/634a9ffd-d154-e604-193d-4485167046c0.jpeg)


今度は、日本語も正しく表示されています。

## プレビュー画面以外からPDFを出力してみよう

フォームにTRadioGroupを追加し、オブジェクトインスペクタにて、Itemsプロパティに

- 印刷
- 印刷プレビュー
- PDF出力

を設定し、ItemIndexプロパティを1に設定します。

![9_DesignForm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/7992f708-d5e1-2b0e-f015-f333d3a40ca1.jpeg)


そして、ボタンのOnClickイベントで、プレビュー画面を表示している箇所をRadioGroupのItemIndexプロパティの値によって、印刷・印刷プレビュー・PDF出力を実行できるように変更します。

```pascal:Unit1.pas
procedure TForm1.Button1Click(Sender: TObject);
begin
  StringDS.RangeEnd := reCount;
  StringDS.RangeEndCount := sl.Count;

  // 変更：ここから
  case RadioGroup1.ItemIndex of
    0:	// 印刷
      begin
        frxReport1.PrepareReport(True);
        frxReport1.Print;
      end;
    1:	// 印刷プレビュー
      frxReport1.ShowReport;
    2:	// PDF出力
      begin
        frxReport1.PrepareReport(True);
        frxReport1.Export(frxPDFExport1);
      end;
  end;
  // 変更：ここまで
end;
```

コンパイル後、RadioGroupで「PDF出力」を選択し、ボタンをクリックすると「PDFファイルへのエクスポート」ダイアログが表示し、PDFファイルが出力できます。

## PDF出力するとき、ダイアログやメッセージ ウィンドウを表示したくない場合

「PDFファイルへのエクスポート」ダイアログを表示せずに、PDF出力したい場合、TfrxPDFExportのShowDialogプロパティをFalseに設定します。
このとき、TfrxPDFExportのFileNameプロパティにて、出力するPDFのファイル名を指定しておく必要があります。

また、PDFファイル出力中に表示するメッセージ ウィンドウ
![export_mess.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318490/afd8f019-406e-2aa0-d782-78671c690b05.jpeg)
を非表示にするには、TfrxPDFExportのShowProgressプロパティをFalseに設定します。

## 最後に
プログラム内でPDFファイルを生成する処理が必要なとき、ダイアログを出さすにPDF出力したい場合など、結構、あるかと思います。


FastReport以外でも、
Excelを帳票の代わりに使っている場合、
[[ エクセル操作フォームEx ] [ PDF 形式の文書で保存 ] - Mr.XRAY](http://mrxray.on.coocan.jp/Delphi/plExcelEx/E412_SavePDFDoc.htm)
の方法で、PDF出力できますし、
Windows 10 に搭載されている「Microsoft Print to PDF」を利用し、プログラムから「印刷結果を名前を付けて保存」ダイアログを出さずにPDF出力する方法があるようです。

この「Microsoft Print to PDF」でPDF出力する方法に関しては、また別の機会にでも、記事を書きたいと思います。