喫茶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


[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 ゴシック にしたら...
とほほ...


[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 なんです。
>
> アハハハツ と笑って誤魔化す.
> ですね.


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



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