喫茶XRAYトップページ

[スレッド全体
]

[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