[Delphi:90719] PDF用コンポーネントをお使いでしょうか?

2,149 views
Skip to first unread message

渡辺

unread,
Sep 24, 2008, 10:27:10 PM9/24/08
to Del...@ml.users.gr.jp
渡辺です。

 DelphiからPDFファイルを出力したいのですが、
 実際にコンポーネントなどを使われた事のある方はいらっしゃいますか?

 ComponentSourceなどにはいくつか見られますし、
 EmbarcaderoにもGnostice PDF ToolKitの紹介があります。
  (ちなみにGnosticeの方はちょっと高いように思えます。)

 Printer.Canvasに書いているのをそのまま出力したいのです。
 値段の幅もいろいろあるようですが、安い方が良いです。

 また、コンポーネントでなくても他の方法でも構いません。

 ご意見をお聞かせ下さい。
 よろしくお願いします。

 

TAKAHASHI, Tomohiro

unread,
Sep 24, 2008, 10:44:26 PM9/24/08
to Del...@ml.users.gr.jp
高橋(智)です。

コンポーネントではないのですが、仮想プリンタの
[ライブPDF]
http://www.livepdf.jp/
などいかがでしょうか?

--
高橋智宏
Java読書会( http://www.javareading.com/bof/ )

渡辺 wrote:
snip

渡辺

unread,
Sep 25, 2008, 2:01:37 AM9/25/08
to Del...@ml.users.gr.jp
高橋さん、ありがとうございます。
渡辺です。

試してみました。
OLEサーバでもあるということなのでしょうか。
OLEサーバの辺りがよく分かっていないので、突拍子もない事をしているかもし
れません。
しかし、よく分からないのに、書いてみたら上手く動いています。

Delphi2007 for Win32
LivePdfをインストールしたPCでとくにコンポーネントの登録などはせずに
下記のコードで動いています。
PDFの生成中のダイアログは表示されますが、これはOKです。

動いているのでいいのですが、
コンポーネントに関する情報もまだ欲しいと思っています。
wPDFなど値段もそこそこなので使ってみたいと思っているのですが、
どなたか使った事がある方はいらっしゃらないでしょうか?

// たぶんあまり良くない例
procedure TfrmMain.btnPrnClick(Sender: TObject);
var
v:variant;

function GetLivePDFPrinter:boolean;
var
i:integer;
begin
result := false;
for I := 0 to Printer.Printers.Count - 1 do
if Pos('LivePDF',Printer.Printers[i])>0 then
begin
Printer.PrinterIndex := i;
result := true;
exit;
end;
end;
begin

if not GetLivePDFPrinter then exit;

v := CreateOleObject('LivePDF.Printer');

// プリンタAPIのSetFilePathで指示をしておくと
// 出力ファイル名を尋ねてくるダイアログが表示されない。
v.SetFilePath('c:\test.pdf');

Printer.BeginDoc;

//Fontを指定しておかないと化ける場合がありました。
Printer.Canvas.Font.Name := 'MS Pゴシック';

Printer.Canvas.にごちゃごちゃと書く。
//必要に応じてPrinter.NewPage;

Printer.EndDoc;
end;


渡辺

unread,
Sep 25, 2008, 5:53:13 PM9/25/08
to Del...@ml.users.gr.jp
渡辺です。

続きです。
タイプライブラリを取り込めました。

コンポーネント->コンポーネントのインポート->タイプライブラリの取り込み
でLivePDFが見つかったので、それを選んだらLivePDF_TLBを作成してくれました。

これならコンパイル時にエラーチェックもしてくれるので良かったようです。
ちなみにここではこのprocedure内でIPrinterを宣言しているので、
このprocedureが完了した時点でサーバ(=LivePDF)も終了してくれます。


uses LivePDF_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
aLivePDF:IPrinter;


function GetLivePDFPrinter:boolean;
var
i:integer;
begin
result := false;
for I := 0 to Printer.Printers.Count - 1 do
if Pos('LivePDF',Printer.Printers[i])>0 then
begin
Printer.PrinterIndex := i;
result := true;
exit;
end;
end;
begin

if not GetLivePDFPrinter then exit;

aLivePDF := CoPrinter.Create;
aLivePDF.SetFilePath('c:\xxx.pdf');

Printer.BeginDoc;
Printer.Canvas.Font.Name := 'MS Pゴシック';
Printer.Canvas.TextOut(100,100,'こんにちは');
Printer.EndDoc;

end;

渡辺

unread,
Sep 25, 2008, 6:10:26 PM9/25/08
to Del...@ml.users.gr.jp

渡辺です。

もう1点。

LivePDF_TLBの中に、
type
Printer=Iprinter;

という定義があるため、
いつものPrinter.Canvasを使うためにはPrinters.Printer.Canvasと
しなくちゃダメな場合もありました。

で、
type
Printer=IPrinter;

type
LivePDFPrinter=IPrinter;

にリファクタリング機能を使って変更してみたら、
Printers.Printer.Canvasは必要なく、
Printer.Canvasだけでうまく行くようになりました。

takashi

unread,
Sep 25, 2008, 7:36:56 PM9/25/08
to Del...@ml.users.gr.jp
以前 ビューア が欲しくて色々と調べました。
実際には利用していないのであくまで参考程度の話です。

インターネットで調べると色々な情報がありました。
調べると沢山、日本語でDelphiでの例もありました。

調べた結論から書くと
pdfライブラリを取り込むと Adobe のライセンスに引っかかります。
個人で遊ぶ程度なら問題ないと思いますが、配布できないので
調べても無駄になります。

pdf作成では、OpenSource 関連で使えるものが見つかると思います。

Open Office を利用して カルクなどの出力を PDF ファィルとして
出力するテストプログラムと書いた覚えがありますが詳しく覚えていません


以下参考になりそうなサイトの一部です。(メモに残っていたものです)

http://www.adobe.com/devnet/pdf/pdf_reference.html

http://opentype.jp/files_press/PDFACC_flyer_J_final.pdf#search='pdf ISO 標準'
http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

http://www.newtone.co.jp/

> __________ NOD32 3472 (20080925) 情報 __________
>
> このメールはNOD32によって検査済みです。
> http://canon-sol.jp
>

--
takashi <taka...@csjpn.com>


Takahiro Kawakami

unread,
Sep 26, 2008, 6:10:40 AM9/26/08
to Del...@ml.users.gr.jp
川上です
久しぶりの投稿です。

POP over SSLについてどなたかお知恵を拝借できませんでしょうか。
環境はDelphi2005 pro + Indy10です。

今までは通常のPOP3で以下のようにアクセスしていました。
// 設定
IdPOP31.Host := trim(txtPop.Text);
IdPOP31.Password := trim(txtPass.text);
IdPOP31.Port := 110;
IdPOP31.Username := trim(txtUser.text);

// 接続
try
IdPOP31.Connect;
finally
// 接続成功
if(IdPOP31.Connected=true)then begin
end
// 接続失敗
else begin
end;
end;

ところが最近、Gmailの設定で受信しなければならなくなり、
その際に受信でエラーとなるため調べてみると
POP over SSLであるらしいことが分かりました。

ネット上でいろいろ検索してみたのですが、
http://groups.google.co.jp/group/alt.comp.lang.borland-delphi/browse_thread/thread/c6f4c918e1b1b5a2
http://codezine.jp/article/detail/400?p=2
http://ruminatedrumblings.blogspot.com/2008/07/indy-and-https-post.html
http://www.marcocantu.com/tips/oct06_gmail.html
フォームに TIdSSLIOHandlerSocketOpenSSL を貼り付けて
libeay32.dll libssl32.dll ssleay32.dll をアプリケーションの起動フォルダに入れ、
以下のように書いて実行してみたところ、

// 設定
IdSSLIOHandlerSocketOpenSSL1.Destination:='pop.gmail.com:995';
IdSSLIOHandlerSocketOpenSSL1.Host := 'pop.gmail.com';
IdSSLIOHandlerSocketOpenSSL1.Port := 995;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode := [];
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0;

IdPOP31.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
IdPOP31.Host := trim(txtPop.Text);
IdPOP31.Password := trim(txtPass.text);
IdPOP31.Port := 995;
IdPOP31.Username := trim(txtUser.text);

// 接続
try
IdPOP31.Connect;
 ~以下同上

プロジェクト Satellite.exe は例外クラス EIdOSSLCouldNotLoadSSLLibrary
(メッセージ 'Could not load SSL library.')を送出しました。
という例外が出ました。

SSLライブラリはアプリケーションと同じフォルダにおいてあります。
プロパティが足りないor間違って設定されているのでしょうか

何かご存知の方がいらっしゃいましたらよろしくお願いいたします。

<=--------------------------------------------=>

 有限会社 電助システムズ 川上 貴弘
 DENSUKE SYSTEMS Co.,Ltd. Takahiro Kawakami
 103-0013 東京都中央区日本橋人形町2-35-14 山田ビル2F
 TEL:03-5695-7088 FAX:03-5695-7089
 mail:kawa...@densuke.jp

<=--------------------------------------------=>


Nakaji

unread,
Sep 26, 2008, 9:56:19 AM9/26/08
to Del...@ml.users.gr.jp
中島と申します。

ICSでやったらどうですか?
http://www.overbyte.be/eng/products/ics.html

Sampleもあるし、Forumも活発ですよ。

Indy必須なのかな!?

On Fri, 26 Sep 2008 19:10:40 +0900
"Takahiro Kawakami" <kawa...@densuke.jp> wrote:

> 川上です
> 久しぶりの投稿です。
>
> POP over SSLについてどなたかお知恵を拝借できませんでしょうか。
> 環境はDelphi2005 pro + Indy10です。


--
Nakaji <nak...@quotasystem.net>


ポン太

unread,
Sep 26, 2008, 8:13:08 PM9/26/08
to Del...@ml.users.gr.jp
川上 さん、こんにちは。ポン太 です。


>プロジェクト Satellite.exe は例外クラス EIdOSSLCouldNotLoadSSLLibrary
>(メッセージ 'Could not load SSL library.')を送出しました。
>という例外が出ました。
>
>SSLライブラリはアプリケーションと同じフォルダにおいてあります。
>プロパティが足りないor間違って設定されているのでしょうか

dllが読み込めないというエラーメッセージなので、プロパティーは関係ないと
思います。

アプリケーションと同じフォルダが絶対にパスが通っているとは限らないはず
(多分)ですので、間違いなくパスが通った例えば%SystemRoot%にdllを置いて
みるとか。
あるいは同名の違うdllであるとか。同名の違うdllの場合は、Indyのソース上で
エラーの出ている行を特定すればはっきりすると思います。


2008/09/27(土) 09:07 ポン太

Marks

unread,
Sep 27, 2008, 4:04:52 AM9/27/08
to Del...@ml.users.gr.jp
佐々木です。

コンポーネントなら

http://www.est.hi-ho.ne.jp/takeshi_kanno/

http://delphiholic.hopeseeds.com/?eid=303668

があるようです

渡辺

unread,
Sep 28, 2008, 9:51:40 PM9/28/08
to Del...@ml.users.gr.jp
佐々木さん、ありがとうございます。
 渡辺です。

これは良さそうですね。

今回はPrinterに印刷する部分が出来上がっているので、
LivePrinterPDFを使おうと思いますが、
きちんとしたPDFファイルを作るにはこちらが良さそうです。
バージョンが古いのは寂しい気もしますが、
次の機会に使ってみたいと思います。

ありがとうございました。

佐々木さんは書きました:

渡辺

unread,
Sep 28, 2008, 10:22:50 PM9/28/08
to Del...@ml.users.gr.jp
takashiさん、ありがとうございます。
 渡辺です。

> インターネットで調べると色々な情報がありました。
> 調べると沢山、日本語でDelphiでの例もありました。
>
ありますね。

> 調べた結論から書くと
> pdfライブラリを取り込むと Adobe のライセンスに引っかかります。
> 個人で遊ぶ程度なら問題ないと思いますが、配布できないので
> 調べても無駄になります。
>

OpenSourceで公開されている物もそうなんでしょうか?


> pdf作成では、OpenSource 関連で使えるものが見つかると思います。

インストールする数に合わせると結構かかりますね・・。

ありがとうございました。


Takahiro Kawakami

unread,
Sep 28, 2008, 11:51:40 PM9/28/08
to Del...@ml.users.gr.jp
ありがとうございます
川上です

中島様


> ICSでやったらどうですか?
> http://www.overbyte.be/eng/products/ics.html
>
> Sampleもあるし、Forumも活発ですよ。
>
> Indy必須なのかな!?

必須というわけではありませんが、(大した量ではありませんが)いままで
触ってきているので、Indyがいいかな…と。
ちょっと時間のある時に見てみます。

ポン太様


> dllが読み込めないというエラーメッセージなので、プロパティーは関係ないと
> 思います。
>
> アプリケーションと同じフォルダが絶対にパスが通っているとは限らないはず
> (多分)ですので、間違いなくパスが通った例えば%SystemRoot%にdllを置いて
> みるとか。
> あるいは同名の違うdllであるとか。同名の違うdllの場合は、Indyのソース上で
> エラーの出ている行を特定すればはっきりすると思います。

%SystemRoot% つまり C:\windows\に置いても同様の例外が発生します。
(オプションのシステム環境変数にありました)

いろいろ試したところ、例外発生後、もう一度受信をすると正しく受信が出来ました。

ただし、やはりdllを読み込んでいないようで、プログラムと同じフォルダ、%SystemRoot%
のDLLを全て削除しても同様の挙動でした。
http://pc11.2ch.net/test/read.cgi/tech/1093654251/638-642
ここにも同様のことが書いてあり、こちらはDLLで解決したようです。

バージョンは 0.98e、h、iを使用しましたが、特に目に見える違いはありませんでした。

うーん、なにがいけないんでしょうか…

ポン太

unread,
Sep 29, 2008, 1:20:45 AM9/29/08
to Del...@ml.users.gr.jp
川上 さん、こんにちは。ポン太 です。


>いろいろ試したところ、例外発生後、もう一度受信をすると正しく受信が出来ました。

パスの問題じゃないとすると、ソースを追っていくしかないんじゃないですか。
あるいはIndyのバージョンが古い場合はバージョンアップするか。
ちなみに私のところのDelphi5+Indy10(10.0.52)でIdHTTPでhttpsをGetするとい
う簡単なテストプログラムを作っても、同様のRSOSSLCouldNotLoadSSLLibraryの
例外は発生しませんでした。


2008/09/29(月) 13:17 ポン太

takashi

unread,
Sep 29, 2008, 3:32:50 AM9/29/08
to Del...@ml.users.gr.jp
> OpenSourceで公開されている物もそうなんでしょうか?

誤解を招いてしまったようで申し訳ありません。
OpenSourceのものは、無料で問題ないと思います。

一般に無料で公開されているものでも配布する場合は
有料といったこともあるので注意して下さい。

前にも書いたとおり、以前は pdf を開く事を重点に調べていました。
pdf ファイルは文字コードと関係するため色々と難しいと思いました。
(以前は調べている最中に面倒になって、海外のコンポーネント
を購入しましたが見事に日本語が化けました)

出力に関して以前調べたときは openoffice の uno をベースとし
たサンプルが結構ありました。例えば↓のような形で pdf を作成
できたりしましたが、実際に業務で利用するためには結構面倒だと
思います。


OpenSourceのものは、現在は開発がストップしているものも
多いようなので、色々と調べていただけるとうれしいです。


procedure TForm6.MakePDF(InFileName, OutFileName:string);
var
wWriter : TOOoWriter;
begin
try
wWriter := TOOoWriter.Create;
try
if wWriter.Connect then
try
if wWriter.OpenDocument(InFileName) then
try
wWriter.SaveToPDF(OutFileName);
finally
wWriter.CloseDocument;
end;
finally
wWriter.Disconnect;
end;
finally
wWriter.free;
end;
except
on e:exception do
begin
Showmessage(e.message);
end;
end;
end;


--
takashi <taka...@csjpn.com>


Takahiro Kawakami

unread,
Sep 29, 2008, 3:42:38 AM9/29/08
to Del...@ml.users.gr.jp
ポン太様

Indy10のバージョンは10.0.0.0でした。
もしやと思い、096mをダウンロードしてきたら
あっさり動いてくれました。

ありがとうございました。
お騒がせしました。

かわかみたかひろ

渡辺

unread,
Sep 29, 2008, 4:25:28 AM9/29/08
to Del...@ml.users.gr.jp

takashi さん、ありがとうございます。
渡辺です。


>> OpenSourceで公開されている物もそうなんでしょうか?
>>
>
> 誤解を招いてしまったようで申し訳ありません。
> OpenSourceのものは、無料で問題ないと思います。
>
> 一般に無料で公開されているものでも配布する場合は
> 有料といったこともあるので注意して下さい。
>

分かりました。

> OpenSourceのものは、現在は開発がストップしているものも
> 多いようなので、色々と調べていただけるとうれしいです。
>
現在、開発がストップというのがたくさんあって寂しいですね。
今回は仮想プリンタのLivePDFがとっても楽なのでこれで行こうと思います。
Obsoleteが気になりますがPowerPDFも良さそうです。

また時間を見て調べてみたいと思います。
ありがとうございました。

Reply all
Reply to author
Forward
0 new messages