TSMH’s blog

多趣味人間のメモ

印刷やPDFなど、Printerについて

Delphi印刷機能について色々メモしたいと思います

PDFを吐き出す機能もね

docwiki.embarcadero.com

(......まあサイトはもう結構詳しく書いたんですけど、わかりやすく、よく使う機能をメモしようと思いまーす

 

ユニットファイル

uses

  FMX.Printer ;

プリンターのプロパティ設定

まず、デザインのところパレット【 TPrinterSetupDialog 】を追加する

次は、【 TButton 】を追加する
(ここはアプリの設計によって違いますけど、とりあえず一番わかりやすいの方法で

procedure TFmPrint.PrintSetClick(Sender: TObject); //ButtonのOnClickイベント
begin
    PrinterSetupDialog1.Execute;
end;

印刷

もう一個【 TButton 】を追加する 

procedure TFmPrint.PrintClick(Sender: TObject); //ButtonのOnClickイベント
begin
  with Printer do
    begin
      ActivePrinter.SelectDPI(300, 300); //解像度の設定

      BeginDoc;

      //印刷したいイメージ

      Canvas.DrawBitmap(

        Print_Image.Bitmap,
        TRectF.Create(0, 0, Print_Image.Bitmap.Width, Print_Image.Bitmap.Height),
        TRectF.Create(0, 0, PageWidth, PageHeight),
        1.0);

      EndDoc;
    end;
end;

--------------------------------

with do を使いたくない場合

procedure TFmPrint.PrintClick(Sender: TObject); //ButtonのOnClickイベント
begin
      Printer.ActivePrinter.SelectDPI(300, 300); //解像度の設定

      Printer.BeginDoc;

      //印刷したいイメージ

      Printer.Canvas.DrawBitmap(

        Print_Image.Bitmap,
        TRectF.Create(0, 0, Print_Image.Bitmap.Width, Print_Image.Bitmap.Height),
        TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight),
        1.0);

      Printer.EndDoc;
end;

DPIについて

f:id:TSMH:20220418145552p:plain

らしいです

いろいろ参考資料を貼ります~

dpi - Wikipedia

解像度(DPI)とは?画質や画素数(ピクセル)高さの違いを簡単に解説 | BOXIL Magazine

【解像度とdpi】印刷のために画像解像度を設定しよう | バンフーオンラインショップ

画面解像度?印刷解像度?ポスター印刷に関する解像度について | ソクプリブログ

FMX.Printer.TPrinterのプロパティについて

PDFを吐き出すとかを入る前に、先にいろいろPrinterのプロパティを紹介しようと思います
(私の偏見でよく使うやつを紹介します~)

  • FMX.Printer.TPrinter.ActivePrinter

現在アクティブのプリンタを示します。  

  • FMX.Printer.TPrinter.Aborted

ユーザーが印刷ジョブを中止したかどうかを判別します。 
Aborted が True の場合、印刷ジョブは中止されます。 False の場合には、ユーザーは印刷ジョブを中止していません。

  • FMX.Printer.TPrinter.Printing

Printing を使用すると、ジョブが印刷中かどうかを判別します。 
Printing は、アプリケーションが BeginDoc メソッドを呼び出しており、かつ、まだ EndDoc メソッド(または Abort メソッド)を呼び出していないときに、True となります。 

 

  • FMX.Printer.TPrinter.PageHeight

現在の印刷中のページの高さを、ピクセルで示します。 
PageHeight を使用すると、現在の印刷中のページの高さを、ピクセルで知ることができます。 

  • FMX.Printer.TPrinter.PageWidth

現在の印刷中のページの高さを、ピクセルで示します。 
PageHeight を使用すると、現在の印刷中のページの高さを、ピクセルで知ることができます。 

  • FMX.Printer.TPrinter.PageNumber

現在印刷中のページ番号を示します。 

 

  • FMX.Printer.TPrinter.Printers

利用可能なすべてのプリンターをリストします。

  • FMX.Printer.TPrinter.Count

システムで利用可能なプリンター数を示します。 

  • FMX.Printer.TPrinter.Title

オペレーティング システムによって提供されている印刷マネージャ内に一覧され、またネットワーク ヘッダー ページ上にあるテキストを判別します。 
Title は、オペレーティング システムによって提供されている印刷マネージャ(たとえば、Windows の場合には Print Manager と呼ばれる)、またはプリンターソフトウェアによって、ネットワーク タイトル ページのために使用されます。 

 

FMX.Printer.TPrinter Properties - RAD Studio API Documentation

システムで利用可能なプリンターを表示

TButton 】と【 TMemo】追加するぞ

procedure TForm1.Button2Click(Sender: TObject);
var
    i: integer;
begin
    for i := 0 to Printer.Count - 1 do
      begin
          Memo1.Lines.Add(Printer.Printers[i].Title);
      end;
end;

はい、こういう感じですね

PDFの生成

大体ここまで来たらPDF生成のやり方はもう分かると思いますね
印刷する前にプリンターを指定すればいいってことです

  Printer.ActivePrinter := Printer.Printers[5];   
  //ここの5はただの例、リストの順番はパソコンによって変わります
  Printer.ActivePrinter.SelectDPI(1200, 1200);

  Printer.BeginDoc;

      //印刷処理

  Printer.EndDoc;

こういう感じです

  for i := 0 to Printer.Count - 1 do
  begin
    if Printer.Printers[i].Title ='Microsoft Print to PDF' then 処理;
  end;

これと一緒に組み合わせるとPDFの生成はできます

(やり方人それぞれなので省略しまーす((ただ疲れただろうかお前

 

*注意点*

Printer.ActivePrinter := Printer.Printers[5]; 

これやるとこれからのプリンターはリスト5のプリンターになります

TempPrinter, PDFPrinter : TPrinterDevice;

こんな感じでサブを作って代入した方が無難かなと思います

最初は先に今のデフォルトプリンターをTempPrinterに保存

TempPrinter := Printer.ActivePrinter;

'Microsoft Print to PDF'プリンターをPDFPrinter に保存

PDFPrinter := Printer.Printers[5];

使う時は直接代入

Printer.ActivePrinter := PDFPrinter ;