Synopse PDF Engine使ってみる その2

前回 とりあえず日本語が出力出来るようになったんですが、フォーラムを見てるとTPdfDocumentのCanvasであるTPdfCanvasを使うんじゃなくTPdfDocumentGDIのVCLCanvasを使うようにってな事が書いてありました。
TPdfDocumentGDIのVCLCanvasはTCanvas互換というかTMetafileCanvasが返ってくるみたいですね。
後は、VCLCanvasに対して普通に描画処理をすれば良いです。

前回の日本語フォント名を英語フォント名に変換する処理を追加しておけば問題無く日本語テキストで作成可能です。
ちなみに、どうしてもTPdfCanvasを使うならRenderMetaFileメソッドを使うと良いようです。

procedure TForm1.Button2Click(Sender: TObject);
var
  vPDF: TPdfDocumentGDI;
  vPage: TPdfPage;

  vRect: TRect;
  Cvs: TCanvas;

  vRc: TRect;
  vTxt: String;
  vTxtH: Integer;
begin
  vPDF := TPdfDocumentGDI.Create();
  try
    vPDF.Info.Author := 'テスト';
    vPDF.Info.CreationDate := Now;
    vPDF.DefaultPaperSize := psA4;
    vPage := vPDF.AddPage;
    // Canvasの取得
    Cvs := vPDF.VCLCanvas;
    // ページほぼ全体に四角を書いてみる
    vRect := Rect(0, 0, vPDF.VCLCanvasSize.cx, vPDF.VCLCanvasSize.cy);
    InflateRect(vRect, -10, -10);
    Cvs.Rectangle(vRect.Left, vRect.Top, vRect.Right, vRect.Bottom);
    // フォントの設定
    Cvs.Font.Name := 'MS P明朝';
    Cvs.Font.Size := 9;

    vTxtH := Cvs.TextHeight('A') + 2;

    vRc := Rect(vRect.Left, vRect.Top, vRect.Right, vRect.Top + vTxtH);
    vTxt := 'テスト';
    Cvs.TextRect(vRc, vTxt);

    vRc.Top := vRc.Top + vTxtH;
    vRc := Rect(vRc.Left, vRc.Top, vRc.Right, vRc.Top + vTxtH);
    vTxt := 'テスト2';
    // テキストをセンタリングして書いてみる
    DrawText(Cvs.Handle, vTxt, -1, vRc, DT_SINGLELINE Or DT_CENTER);

    vPDF.SaveToFile('ab.pdf');
  finally
    FreeAndNil(vPDF);
  end;
end;