[delphi-users:2059] PDFファイルをFirebirdのBlobフィールドで使う。

662 views
Skip to first unread message

mtan

unread,
Jul 25, 2011, 10:02:57 AM7/25/11
to delphi...@freeml.com
今、悩んでいます。
PDFファイルをDelphi(RAD Studio 2010)とFirebird(2.5)で管理したいのです。
目指しているのは、組織内の回覧板をPDFファイル化してデータベースに登録し、
パスワードを使って複数の職員が見たかまだ見ていないかをチェックしたいのです。
インターネットで調べてBlobフィールドにPDFファイルを登録できるようにはなった(未確認)のですが、
Blobフィールドからの取り出し方が分かりません。
TAcroPDFを使ってPDFファイルを表示させていますが、どうやってBlobのPDFを表示させればいいのでしょうか?

初めて参加させていただき、いきなりの質問で申し訳ありませんが、
どうかお助けください。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
クーポンサイトを選んで検索♪一番おトクなクーポンをGET!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdk58
-----------------------------------------------------[freeml by GMO]--

DEKO

unread,
Jul 25, 2011, 3:46:32 PM7/25/11
to delphi...@freeml.com
こんにちは。
なんだか Firebird の話が続きますね。

> Blobフィールドからの取り出し方が分かりません。

DBX4 / IBX / FIBPlus... Firebird との接続方法はイロイロありますが、
どれを利用しているのかを記載しておくとレスが得られ易いと思います。

質問内容からすると、格納しているデータが PDF であるかどうかは関係なさそうですね。
IBX + Firebird + BLOB のサンプルであれば以下のリンク先にあります。

[IBXを使用した場合の画像(BLOBデータ)の表示 (Delphi Q&A 掲示板)]
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200711/200711_07110038.html

--
by DEKO
-----------------------------
http://ht-deko.minim.ne.jp/
de...@ht-deko.minim.ne.jp
-----------------------------


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
友達の服をこっそり借りちゃお!「おしゃれ泥棒」OPEN!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdmht

mtan

unread,
Jul 25, 2011, 9:03:53 PM7/25/11
to delphi...@freeml.com
早速のお返事、ありがとうございます。

> DBX4 / IBX / FIBPlus... Firebird との接続方法はイロイロありますが、
> どれを利用しているのかを記載しておくとレスが得られ易いと思います。

IBXを使っています。

> IBX + Firebird + BLOB のサンプルであれば以下のリンク先にあります。
>
> [IBXを使用した場合の画像(BLOBデータ)の表示 (Delphi Q&A 掲示板)]
> http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200711/200711_07110038.html

「FirebirdのBlob登録できました(?)」と書きましたが、
それは、このリンク先を参考にしてできました。(?)
データは登録されているけれども、内容が確認できないため、詳細不明です。

このサイトに書いてあるのは

BS1 :TStream;
jpg1 :TJPEGImage;

BS1 := IBSQL.CreateBlobStream(IBSQL.FieldByName('PHUTO_Blob'),bmRead);
jpg1 := TJPEGImage.Create;
jpg1.LoadFromStream(BS1);
Image_X.Picture.Graphic := jpg1;

として、JPegを表示していますが、TAcroPDFではLoadFromStreamが使えませんよね?
jpg1 :TJPEGImage;
みたいなPDF用の変数(?)があるのでしょうか?

よろしくお願いします。

by mtan

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
戦国時代の武将達とともに天下統一を目指そう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdpqZ

sakai

unread,
Jul 25, 2011, 9:55:37 PM7/25/11
to delphi...@freeml.com
はじめまして、noriと申します。
ご要望を満たすか分かりませんが、御参考まで、関連しそうなサンプルを添付いたします。
Delphi6/7、TIBQurey、Firebird2あたりでwavファイル(音声ファイル)を保存
出力したものです。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
【重要】携帯電話向けMLメールの仕様変更のお知らせ
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdpVf

wav_file_sample.txt

mtan

unread,
Jul 26, 2011, 1:32:19 AM7/26/11
to delphi...@freeml.com
noriさん、ありがとうございます。
早速、試してみました。
PDF_Filesというテーブルは
PDF_No Integer
PDF_Files Blob
といった構造です。
pdfDispはTAcroPDFです。

// データ登録
procedure TNoticeForm.btnPDFRegClick(Sender: TObject);
var TMS:TMemoryStream;
begin
if pdfDisp.src='' then
begin
ShowMessage('PDFファイルを選択してください。');
Exit;
end;
//
try
TMS:=TMemoryStream.Create;
TMS.LoadFromFile(pdfDisp.src);
//
if not DM.IBTR.InTransaction then DM.IBTR.StartTransaction;
try
with DM.IBQ do
begin
Close;
SQL.Clear;
SQL.Add('insert into PDF_Files (PDF_No,PDF_Files) values(next value for PDF_No,:PDFS)');
ParamByName('PDFS').LoadFromStream(TMS,ftBlob);
ExecSQL;
end;
DM.IBTR.Commit;
except
DM.IBTR.Rollback;
ShowMessage('PDFの登録に失敗しました。');
end;
finally
TMS.Free;
end;
end;

// データ抽出
procedure TNoticeForm.btnSelectClick(Sender: TObject);
var TMS:string;
begin
with DM.IBQ do
begin
Close;
SQL.Clear;
SQL.Add('select * from PDF_Files where PDF_No=1');
Open;
if not DM.IBQ.FieldByName('PDF_Files').IsNull then
TBlobField(DM.IBQ.FieldByName('PDF_Files')).SaveToFile(TMS);
end;
pdfDisp.src:=TMS+'.pdf';
end;

しかし、
TBlobField(DM.IBQ.FieldByName('PDF_Files')).SaveToFile(TMS);
のところで、止まってしまいます。
何か変なことをしていますか?
また、登録すると、レコードが増えているのでうまく行っていると思っていますが、
確認できておりません。

よろしくお願いいたします。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdsB9

DEKO

unread,
Jul 26, 2011, 2:20:33 AM7/26/11
to delphi...@freeml.com
こんにちは。

> TAcroPDFではLoadFromStreamが使えませんよね?

Stream に格納できたのであれば、それを MemoryStream 等で
SaveToFile() して TAcroPDF の LoadFromFile() で読みこめばいいと思います。

> TBlobField(DM.IBQ.FieldByName('PDF_Files')).SaveToFile(TMS);
> のところで、止まってしまいます。

"止まる" という状況がよく判らないのですが...

var
IBS: TStream;
MS: TMemoryStream;
dFileName: String;
begin
dFileName := 'C:\TEST\TEST.PDF'; // ワーク

IBS := IBSQL.CreateBlobStream(IBSQL.FieldByName('PDF_Files'), bmRead);
MS := TMemoryStream.Create;
try
IBS.Seek(0, soFromBeginning);
MS.LoadFromStream(IBS);
MS.Seek(0, soFromBeginning);
MS.SaveToFile(dFileName);

AcroPDF1.LoadFile(dFileName);
finally
MS.Free;
IBS.Free;
end;
end;

例えば、このようなコードならその現象を回避する事ができますか?

--
by DEKO
-----------------------------
http://ht-deko.minim.ne.jp/
de...@ht-deko.minim.ne.jp
-----------------------------


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバーで使える掲示板を活用しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdtkg

mtan

unread,
Jul 26, 2011, 5:07:06 AM7/26/11
to delphi...@freeml.com
DEKOさん、ありがとうございます。
下記のごとく変更したらうまく行きました。

procedure TNoticeForm.btnSelectClick(Sender: TObject);
var TMS:TMemoryStream;
TSM:TStream;
dFileName:string;
begin
screen.Cursor:=crHourGlass;

dFileName:='TEST.PDF'; // ワーク

with DM.IBQ do
begin
Close;
SQL.Clear;

SQL.Add('select * from PDF_Files where PDF_No=2');


Open;
if not DM.IBQ.FieldByName('PDF_Files').IsNull then

begin
try
TSM:=DM.IBQ.CreateBlobStream(DM.IBQ.FieldByName('PDF_Files'),bmRead);
TMS:=TMemoryStream.Create;
TSM.Seek(0, soFromBeginning);
TMS.LoadFromStream(TSM);
TMS.Seek(0, soFromBeginning);
TMS.SaveToFile(dFileName);

pdfDisp.LoadFile(dFileName);
finally
TMS.Free;
TSM.Free;
end;
end;
end;
screen.Cursor:=crDefault;
end;

下記の部分はいまだに理解できませんが、
TSM.Seek(0, soFromBeginning);
TMS.LoadFromStream(TSM);
TMS.Seek(0, soFromBeginning);
TMS.SaveToFile(dFileName);
また勉強したいと思います。
これで組織内のペーパーレス化が画期的に進みます。

DEKOさんはじめメンバーの皆さん、本当にありがとうございました。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdvtQ

DEKO

unread,
Jul 26, 2011, 5:43:52 AM7/26/11
to delphi...@freeml.com
こんにちは。うまく行ったようでなによりです。

補足ですが、
Stream.Seek(0, beginning)
は、ストリームの先頭に巻き戻しているだけです。

CreateBlobStream() で読み込んだ直後、LoadFromStream() した直後の
Position がどうなるのか思い出せなかったので、保険で入れておきました。

また、BLOB フィールドで CreateBlobStream() を使う理由は、
ヘルプの記述にあります。

[DB.TDataSet.CreateBlobStream]
http://docwiki.embarcadero.com/VCL/ja/DB.TDataSet.CreateBlobStream

> ヒント: コードで直接 BLOB ストリームを作成するよりも
> CreateBlobStream を呼び出すことをお勧めします。
> これにより,ストリームがデータセットに対して適切であることが保証されます。
> また,BLOB データを常にメモリに格納するわけではないデータセットが,
> ストリームを作成する前に BLOB データを取り出すことも保証されます。

わざわざこう書いてあるという事は、
"他の方法では適切に読み出せない可能性がある" のかもしれません。

ただ、TBlobField.SaveToFile() も内部で CreateBlobStream() を
呼んでおり、nori さんの方法で失敗する理由がよく解りません。

--
by DEKO
-----------------------------
http://ht-deko.minim.ne.jp/
de...@ht-deko.minim.ne.jp
-----------------------------


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hdvNZ

auemura

unread,
Jul 26, 2011, 7:44:04 PM7/26/11
to delphi...@freeml.com
上村です。

>
> ただ、TBlobField.SaveToFile() も内部で CreateBlobStream() を
> 呼んでおり、nori さんの方法で失敗する理由がよく解りません。
>

流し読みしただけなんでハズしてる気もしますが、2063 のポストがソースからのコピペであるなら、SaveToFileに渡してるファイル名の変数TMSに値を設定してる箇所がないのでそれが原因かなと。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
クーポンサイトを選んで検索♪一番おトクなクーポンをGET!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hd2sT

kubo

unread,
Sep 10, 2011, 3:14:10 AM9/10/11
to delphi...@freeml.com

DEKOさん、ありがとうございます。
下記のごとく変更したらうまく行きました。

DEKOさんはじめメンバーの皆さん、本当にありがとうございました。

MLホームページ: http://www.freeml.com/delphi-users


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
「アルテイル」オンラインカードゲームで暇つぶし!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hnZga

Reply all
Reply to author
Forward
0 new messages