喫茶XRAYトップページ

[▲前のスレッド]

[9358] PDF作成のライブラリ返信 削除
2015/10/30 (金) 18:16:21 Mr.XRAY
以下に,Synopse PDF engine のリンクを追加しました.
前にテストした時に日本語が使用できなかったのですが,
au さんのところに日本語を扱ったサンプルがありました.

[720][07_PDF 文書の作成や操作関係の参考リンク - Adobe サイト以外]
http://mrxray.on.coocan.jp/Delphi/plSamples/720_Acrobat.htm#07


[9359] Re:PDF作成のライブラリ返信 削除
2015/10/31 (土) 21:38:49 Mr.XRAY
> 前にテストした時に日本語が使用できなかったのですが,
> au さんのところに日本語を扱ったサンプルがありました.


au さんが貼っているリンクは以下なのですが,

[PDF Engine (Page 1) / Delphi Open Source]
http://synopse.info/forum/viewforum.php?id=1

本日,今現在,
ダウンロードは,当サイトの記事にもあるように,以下の GitHub です.
Fire Fox では右下の [Download ZIP]をクリックするとダウンロードできます.

[synopse/SynPDF · GitHub]
https://github.com/synopse/SynPDF

↑からダウンロードした 1.7.2 は日本語フォントも問題なく,使用可能
であることを確認しています.


[9361] Re2:PDF作成のライブラリ返信 削除
2015/10/31 (土) 23:44:42 Harry
こんばんわ。

やはりマスターも Synopse PDF engine に目を付けてましたか。
ちょっと試してみたところ、某掲示板の今回の質問者さんの用途である、
メタファイルのPDF化には最適なのではと感じました。

ただよく分からないのは、なぜメタファイルを作ってから印刷してたのか、
ということ。直接印刷するのに比べて、何かメリットあるのかな??


▼ Mr.XRAYさん
> [synopse/SynPDF · GitHub]
> https://github.com/synopse/SynPDF
>
> ↑からダウンロードした 1.7.2 は日本語フォントも問題なく,使用可能
> であることを確認しています.


自分はGitHubの最新ではなく、Synopseサイトのものを使いました。
http://synopse.info/fossil/wiki?name=PDF+Engine

ここ↑のsynpdf.zipですと、中身は2015/05/28の日付になってます。
バージョンが見当たらなかったので、SynopseCommit.incに書いてある、
'1.18.1417' がそうなのかと思ったんですが。
GitHubの 1.7.2 って、どこに記載されているんですか?

[9362] Re3:PDF作成のライブラリ返信 削除
2015/11/1 (日) 06:50:25 Mr.XRAY
▼ Harryさん

> こんばんわ。

おはようございます.

> バージョンが見当たらなかったので、SynopseCommit.incに書いてある、
> '1.18.1417' がそうなのかと思ったんですが。
> GitHubの 1.7.2 って、どこに記載されているんですか?


わわわっ !! スミマセン.私の間違いです.
以前テストした値をそのまま書いていました(汗)
記事の方もすぐ直します.ハイ.

>自分はGitHubの最新ではなく、Synopseサイトのものを使いました。
>http://synopse.info/fossil/wiki?name=PDF+Engine


メインページもこちらがいいですね.
こちらにしておきます.
ありがとうございました.

# GitHub に置いてあるのは repository 用ではないかと
# ファイル名を変えていますが,どちらも中身は同じようです.


誤字脱字の達人の Mr.XRAY でした.


[9363] Re3:PDF作成のライブラリ返信 削除
2015/11/1 (日) 07:20:28 Mr.XRAY
▼ Harryさん

> ただよく分からないのは、なぜメタファイルを作ってから印刷してたのか、
> ということ。直接印刷するのに比べて、何かメリットあるのかな??


ハハハッ.
私にも分かりませんです.
推測ですが,今回の質問は,多分,PDF を作成するプログラムのテストを
してみたかっただけ,なのではないかと...

>やはりマスターも Synopse PDF engine に目を付けてましたか。

日本語フォントが使用できれば,個人的には強力だと思っています.
設計時にレポート形式で扱うのであれば,FastReport ということになりそうです.


[9360] フォント名を英語のフォント名に変換返信 削除
2015/10/31 (土) 21:42:03 Mr.XRAY
> 前にテストした時に日本語が使用できなかったのですが,
> au さんのところに日本語を扱ったサンプルがありました.


au さんが使った方法は,また別の機会に使用するかも知れません.
そこで,以下のようなサンプルを作成しておきました.

[10_指定フォント名を英語フォント名に変換 - Direct2D]
http://mrxray.on.coocan.jp/Delphi/plSamples/884_FontCharSetCodePages.htm#10


[9365] Synopse PDF engine返信 削除
2015/11/4 (水) 18:16:35 Mr.XRAY
おおっ!! すごい.

[TMetaFileからPDFを作成するには?]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201510/15100012.txt

私もあの後,少し Sytnopse PDF engine をテストしてみました.
日本語の文字間隔が正常に描画されないケースがありました.
某掲示板の Harry さんの参考になりますね.
あれだけあれば,検索でヒットする可能性が高くなるでしょう.

>調べてみるとフォント関連は積み残しが多く、細かい問題が発生する場合があるようです。

そういうことなんですか.なるほど.
メタファイルは,メタファイル自身にもフォント情報が格納されますから,
PDF 作成のプログラムで扱うのは結構面倒なのかも知れません.


[9366] Re:Synopse PDF engine返信 削除
2015/11/4 (水) 22:23:29 Harry
▼ Mr.XRAYさん
> あれだけあれば,検索でヒットする可能性が高くなるでしょう.

あはは、マスターにはすべてお見通しですね、それを狙ってたことも。
なるべく情報(良いことも、悪いことも)を集約しておいたほうが良い
だろうと思って、書き連ねてみました。

ですが肝心の質問者さんの問題は、今のところ解決の見通しが立ちません。
実は、もし質問者さんがデバッガに慣れていない場合を考えて、フォントの
emユニット値を取得する小さなコードも書いたんですが、よく考えると、
私が遭遇した「幅が細くなり、間隔が広がる」という事例じゃないので、
ほぼ無意味だろうと判断して投稿しませんでした。

使用したフォントそのものズバリな情報と、メタファイル描画のコードが
提示されない限り、何も分かりませんねぇ…。

なお、パッチ箇所は SynPdfユニット内のTPdfTTF.Create の下の方です。
(なんとこのクラス、メソッドはコンストラクタしかありません!)
「究極の一行パッチ」ですと、ほぼ最下行の↓コレを書き換えるだけです。
//            Width := (cardinal(fhmtx[Glyph*2])*1000) shr fUnitsPerEmShr else
            Width := fhmtx[Glyph*2]*1000 div head^.unitsPerEm else

が、これではせっかくのシフト演算による高速化をドブに捨ててしまうので、
ちゃんとしたパッチでは 2の累乗、1000、その他 の3通りにしてみました。

#パッチをコミットしてもらうにはどうしたらよいのか、それが問題です。

[9367] Re2:Synopse PDF engine返信 削除
2015/11/4 (水) 23:00:03 Mr.XRAY
▼ Harryさん

> > あれだけあれば,検索でヒットする可能性が高くなるでしょう.
>
> あはは、マスターにはすべてお見通しですね、それを狙ってたことも。
> なるべく情報(良いことも、悪いことも)を集約しておいたほうが良い


なんですよ.
で,コードがあるし,何か書こうか,Delphi Forum はどうかな ?
と考えていたのですが,あれだけ書いてあれば,と...
後は読んだ方が適当に... でいいかなと...

> #パッチをコミットしてもらうにはどうしたらよいのか、それが問題です。

どうなんでしょうね.Forum に書き込むとか...
PDF や メタファイルには詳しくないので,参考になります.
質問者に成り代わりまして,感謝致します(^^


[9368] Re3:Synopse PDF engine返信 削除
2015/11/4 (水) 23:56:59 Harry
▼ Mr.XRAYさん
> で,コードがあるし,何か書こうか,Delphi Forum はどうかな ?
> と考えていたのですが,あれだけ書いてあれば,と...
> 後は読んだ方が適当に... でいいかなと...


いえ、某掲示板は本来の目的が純粋に Q & A だと思いますし、なにより
内容がこなれていません。
Synopse も発展途上のようですし、様子を見て(将来的にでも)記事を
寄せていただければいいなー、と期待します。ぜひぜひ。

> PDF や メタファイルには詳しくないので,参考になります.
とんでもございません。おそれ多いです。

ところで…
先程ふと思い立ち、'MS 明朝' を試しますと、盛大に崩れました(笑)
'MS ゴシック' も同様です。
「等幅のコード、こんなんでいいの??」と感じてましたが、やはり問題
があるようです。
まだ先は長そう。。。。



[9369] Re4:Synopse PDF engine返信 削除
2015/11/5 (木) 12:39:44 Mr.XRAY
> 先程ふと思い立ち、'MS 明朝' を試しますと、盛大に崩れました(笑)
> 'MS ゴシック' も同様です。


ギョェ!! 気が付きませんでした.
う〜む.

下図の PDF を作成したコードです.
動作確認は,Windows 7 U64(SP1) + Delphi XE(UP1) Pro で,
表示は Acrobat Reader X です.

uses
  SynPdf;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  LvPDF  : TPdfDocument;
  LvPage : TPdfPage;
begin
  LvPDF := TPdfDocument.Create(False);
  try
    LvPDF.Info.Author       := 'Mr.XRAY';
    LvPDF.Info.CreationDate := Now;
    LvPDF.DefaultPaperSize  := psA4;
    LvPage := LvPDF.AddPage;

    LvPDF.Canvas.BeginText;
      LvPDF.Canvas.SetFont('MS P明朝', 80, []);
      LvPDF.Canvas.MoveTextPoint(30, 700);
      LvPDF.Canvas.ShowText('あいうえお', True);
    LvPDF.Canvas.EndText;

    LvPDF.Canvas.BeginText;
      LvPDF.Canvas.SetFont('MS 明朝', 80, []);
      LvPDF.Canvas.MoveTextPoint(30, 500);
      LvPDF.Canvas.ShowText('かきくけこ', True);
    LvPDF.Canvas.EndText;

    LvPDF.SaveToFile('ABC.pdf');
  finally
    FreeAndNil(LvPDF);
  end;
end;

[注意]
上のコードの場合,左下が,座標 (0, 0) となります.
上のコードは Delphi 2009以降 (ユニコード版) 専用です.




[9370] Re5:Synopse PDF engine返信 削除
2015/11/5 (木) 12:49:01 Mr.XRAY
> ギョェ!! 気が付きませんでした.
> う〜む.


てなわけで,フォントの TCharSet に SHIFTJIS_CHARSET を指定してみました.
最後の引数は False でも OK です.

    LvPDF.Canvas.BeginText;
      LvPDF.Canvas.SetFont('MS 明朝', 80, [], -1, SHIFTJIS_CHARSET, True);
      LvPDF.Canvas.MoveTextPoint(30, 500);
      LvPDF.Canvas.ShowText('かきくけこ', True);
    LvPDF.Canvas.EndText;



[9371] Re6:Synopse PDF engine返信 削除
2015/11/5 (木) 14:39:38 Mr.XRAY
> てなわけで,フォントの TCharSet に SHIFTJIS_CHARSET を指定してみました.
> 最後の引数は False でも OK です.


おっ!! いけるかも.と思ったら,MS ゴシック にしたら...
とほほ...


[9372] Re7:Synopse PDF engine返信 削除
2015/11/5 (木) 15:11:56 Mr.XRAY
> おっ!! いけるかも.と思ったら,MS ゴシック にしたら...
> とほほ...


半角の英数字だけだったら,以下でいけるようなんですが...
日本語,漢字等の全角文字があると...  うううっ
止めた !! これでおしまい !!

procedure TForm1.Button1Click(Sender: TObject);
var
  LvPDF  : TPdfDocument;
  LvPage : TPdfPage;
begin
  LvPDF := TPdfDocument.Create(False);
  try
    LvPDF.Info.Author       := 'テスト';
    LvPDF.Info.CreationDate := Now;
    LvPDF.DefaultPaperSize  := psA4;
    LvPDF.DefaultPageLandscape := True;
    LvPage := LvPDF.AddPage;

    LvPDF.Canvas.BeginText;
      LvPDF.Canvas.SetFont('MS Pゴシック', 80, []);
      LvPDF.Canvas.MoveTextPoint(30, 400);
      LvPDF.Canvas.ShowText('Delphi ABC', True);
    LvPDF.Canvas.EndText;

    LvPDF.Canvas.BeginText;
      LvPDF.Canvas.SetFont('MS ゴシック', 80, []);
      LvPDF.Canvas.MoveTextPoint(30, 200);
      LvPDF.Canvas.ShowText('Delphi ABC', True);
    LvPDF.Canvas.EndText;

    LvPDF.SaveToFile('ABC.pdf');
  finally
    FreeAndNil(LvPDF);
  end;
end;




[9373] Re7:Synopse PDF engine返信 削除
2015/11/5 (木) 18:42:47 Harry
▼ Mr.XRAYさん
> てなわけで,フォントの TCharSet に SHIFTJIS_CHARSET を指定してみました.

マスター、、、第5引数は文字セットじゃなく、AForceTTF なんです。

function SetFont(const AName: RawUTF8; ASize: Single;
  AStyle: TFontStyles; ACharSet: integer=-1; AForceTTF: integer=-1;
  AIsFixedWidth: boolean=false): TPdfFont; overload;

AForceTTFはこのようにコメントされています。
// an existing true type font has been specified
推測ですが、これは文字列でフォント名を指定するリスクを避けるための
オプションなんじゃないでしょうか。


とりあえず、等幅フォント問題の原因の端緒はつかめました。
文字のデフォルト幅が正しく取得できていないようです。

これは厳しいです。アドバンス幅についてはパッチの影響を受ける範囲が
今まで問題が発生してたケースだけなので気楽だったんですが…。
ピンポイントで根本原因を特定できなければアウトっぽいです。

今度は「デフォルト幅」についてお勉強です。。。。

[9374] Re8:Synopse PDF engine返信 削除
2015/11/5 (木) 19:21:55 Mr.XRAY
▼ Harryさん

> マスター、、、第5引数は文字セットじゃなく、AForceTTF なんです。

アハハハツ と笑って誤魔化す.
ですね.

> AForceTTFはこのようにコメントされています。
> // an existing true type font has been specified
> 推測ですが、これは文字列でフォント名を指定するリスクを避けるための
> オプションなんじゃないでしょうか。


なるほど.
でも,やってみないと分からんです.ハイ.


[9376] 入力支援の引数が1つずれる?返信 削除
2015/11/5 (木) 19:49:28 Mr.XRAY
> > マスター、、、第5引数は文字セットじゃなく、AForceTTF なんです。
>
> アハハハツ と笑って誤魔化す.
> ですね.


これなんですけど,言い訳なんですが,入力支援の強調文字(太字) ずれる
んですよね.
で,間違えちゃいました.他もそうなのかな ?
えっ ? 自分で確認すれば分かるだろう !! ハイ.



[9375] Re8:Synopse PDF engine返信 削除
2015/11/5 (木) 19:34:05 Mr.XRAY
▼ Harryさん

> ピンポイントで根本原因を特定できなければアウトっぽいです。

あれですね.
漢字圏の人が開発すれば,それはそれなりにチェックするんでしょうけど,
難しいところです.

先日 UP した
[06_ロケールの日付の書式を和暦に変更]
http://mrxray.on.coocan.jp/Delphi/plSamples/164_DatePickerComponent.htm#06

は,一年ほど前の某掲示板での話題なんですが,思い立って,やはり記事に
しておこうかなと,なんですが,
元号なんか,日本だけですからね.


[9377] Re9:Synopse PDF engine返信 削除
2015/11/7 (土) 23:31:17 Harry
▼ Mr.XRAYさん
> これなんですけど,言い訳なんですが,入力支援の強調文字(太字) ずれる
> んですよね.


DelphiのIDEがお茶目なのは今に始まったことではないはず…。


私は質問者さんからスルーされ、当の質問者さんは名を変えて次の質問…。
マスターが言ってた↓通り、なのかもしれませんね。

> 推測ですが,今回の質問は,多分,PDF を作成するプログラムのテストを
> してみたかっただけ,なのではないかと...



…などといったことにめげず、等幅フォント問題を修正するパッチが
出来ました! これで 'MS ゴシック' も 'MS 明朝' も 重なりません!

Synopse PDF engine の不具合修正方法の情報(某掲示板向けの草稿です)
http://osdn.jp/users/harry/pastebin/2304

気が向いたらお試しください。



[9378] Re10:Synopse PDF engine返信 削除
2015/11/8 (日) 07:51:40 Mr.XRAY
▼ Harryさん

> DelphiのIDEがお茶目なのは今に始まったことではないはず…。

仰せの通りでございます.ハイ (ショボン...)
 
> 私は質問者さんからスルーされ、当の質問者さんは名を変えて次の質問…。
> マスターが言ってた↓通り、なのかもしれませんね。


レスしている人をかなり無視していますね.
というか,そうい人が多いんですよね.
やる気があるのか,ないのか.
「解決しました」だけで終わる人なんか,「えっ? どうやったの?」とか.

でも,PDF 作成のことを考えるいい機会を与えてくれたことは確かです.

> Synopse PDF engine の不具合修正方法の情報(某掲示板向けの草稿です)
> http://osdn.jp/users/harry/pastebin/2304


やりっ〜 !! ひぇ〜,あわ〜,米〜... (^^;
早速,PDF の記事にリンクを追加させて頂きましたです.

>これは、{$ifdef UNICODE} の間違いではないかと…。

まっ,こういうことはよく,たまにあるもんです.
私の誤字脱字ようなもんでしょう.ハハハッ.

東アジアの圏内で共通して利用するには,MECSUtils を使用して書き換える
必要がありそうですね.

[MECSUtils リファレンス]
http://ht-deko.com/tech021.html


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82