ファイルのプロパティ参照方法

解決


tama  2003-07-25 13:27:48  No: 51852  IP: [192.*.*.*]

OSはWIN2000でVC++6.0で開発しております。
例えばテキストファイルのプロパティで、ファイルを右クリックからプロパティをみると
全般タブ、セキュリティタブ、概要タブがあります。
PDFファイルにはこれにPDFのプロパティというタブが加わります。
このPDFのプロパティの内容を取得したいと思っております。

どなたか方法をご存知の方がおられたら教えてください。
よろしくお願い致します。

編集 削除
sato  2003-07-25 13:54:06  No: 51853  IP: [192.*.*.*]

AcrobatSDKを使用するなら、取得メソッドがあります。
("PDDocGetInfo"で取得できます)

AcrobatSDKを使用しないのであれば、すみませんがわかりません。。。

編集 削除
tama  2003-07-25 14:31:28  No: 51854  IP: [192.*.*.*]

sato様、ありがとうございます。

PDDocGetInfoはVBの方の掲示板のでもあって、見てみましたが、
私は初心者なので、VC++での使用方法がちょっとわかりませんでした・・・。
大変申し訳ありませんが、使い方も教えてもらってもよいでしょうか?

よろしくお願いします!

編集 削除
sato  2003-07-25 15:19:25  No: 51855  IP: [192.*.*.*]

Cから使用するのは Core_API です。なので、ドキュメントは 「CoreAPIReference.pdf」を参照してください。PDDocGetInfoで検索すれば見つかるはずです。
また、AcrobatSDKにはサンプルも入ってます。Samplesフォルダ内の「Metadata\DocInformation」のサンプルが参考になると思います。

ご参考までに"作成日付"を取得しようとすると以下のようになると思います。
====================================================================
PDDoc pdDoc;
char buff[256];

pdDoc = PDDocOpenEx(asInPathName, ASGetDefaultFileSys(), NULL, NULL, false);
PDDocGetInfo(pdDoc, "CreationDate", buff, sizeof(buff));
====================================================================

細かいところは省いてますので、サンプルを参照しながら試してみてください。

AcrobatSDKはなかなか難しいので(私は難しかった。。)ちょっと凝ったことをやりたい場合はディベロッパーサポート(有料)を利用した方がよいかもしれません。

編集 削除
tama  2003-07-31 14:20:48  No: 51856  IP: [192.*.*.*]

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

ちょっと私には難しすぎて実現が今だにできていない状態です。(^^;

Samplesフォルダは探したのですが、ちょっと私のAcrobatには入っていないようです。PDDocGetInfoについてはネット上にも全然ないですよね。

いちかばちか下記をいきなり書いたら当然エラーになりました(^^;
PDDoc pdDoc;
char buff[256];

何処のドキュメントから調べられるか教えて頂ける方いらっしゃいましたら、
よろしくお願い致します。。

編集 削除
pbmplus  2003-08-01 23:10:58  No: 51857  IP: [192.*.*.*]

<AcrobatSDKを使わずにベタで取得する方法>

〜 タイトル、サブタイトル、作成者、
  キーワード作成、変換、作成日時、変換日時を取得 〜

1)まず、相互参照テーブル(個々のPDFオブジェクトの位置情報)をPDFファイルから取得
2)「trailer」から「/Info」で示されるPDFオブジェクト番号を取得
3) 2)で取得したPDFオブジェクトから「/Title /Subject /Author /Keywords /Creator /Producer /CreationDate /ModDate」
オブジェクトを取得(「trailer」に「/Info」が無い場合は情報はないということになる)

個々のオブジェクトからテキスト情報を取得するには
基本的に「/??? ()」で括られている括弧内(xxx)の部分を抜き取ればよい。
ただし、その部分のテキストは「8進数表記、Unicode(Normal/AsciiHexEncodnig)、PDFDocEncoding」と
「エスケープ処理(AsciiHexEncodnigの場合は処理なし)」を行っている場合があるので
若干、手間取るのが通例。詳細はPDFの仕様書を参照してください。

個々のオブジェクトとプロパティ情報との関連性は以下の通りです。
------------------------------
/Title (タイトル)
/Subject (サブタイトル) 
/Author (作成者)
/Keywords (キーワード)
/Creator (作成)
/Producer (変換)
/CreationDate (作成日時)
/ModDate (変換日時)
------------------------------

(例)
30869 0 obj
<< 
/Producer (Acrobat Distiller 5.00 for Macintosh)
/Subject (Adobe Portable Document Format \(PDF\))
/Creator (FrameMaker 6.0)
/Title (PDF Reference, Third Edition)
/Author (Adobe Systems Incorporated)
/ModDate (D:20011129091656-08'00')
/CreationDate (D:20011117171008Z)
>> 
endobj

〜暗号化の有無〜
「trailer」に「/Encrypt」があれば暗号化された
PDFファイル。無い場合は暗号化されていないPDFファイルである。

〜PDFのバージョン〜 
ファイルの先頭にPDFファイルのバージョン
が必ず記述されるのでそれを取得するだけでよい。

(例)
%PDF-1.3  ← バージョン 1.3
%PDF-1.4  ← バージョン 1.4
%PDF-1.5  ← バージョン 1.5

〜WEB表示用に最適化〜
最初の「xref」の位置がファイルの先頭から173バイト目であれば
そのPDFファイルは「WEB表示用に最適化」されている。(反則的手法)


# SDK情報じゃないので、役に立たなかったらごめんなさい。

編集 削除
tama  2003-08-04 10:53:02  No: 51858  IP: [192.*.*.*]

pbmplusさん。ありがとうございます!!

とても親切なご説明ありがとうございます。
私が未熟なせいでちょっとわからないところがあるので、是非教えてください。。

> 1)相互参照テーブル(個々のPDFオブジェクトの位置情報)をPDFファイルか> ら取得
という「相互参照テーブル」の取得というのがどのようにしたら良いか、ちょっとわかりません。。。

例の
> 30869 0 obj
というのは変数指定でしょうか?初心者の私には初めてみる形です;;

ここまで聞いてしまうのは申し訳ないと思いますが。。
勉強不足ですみません。。;;
よろしくお願い致します。

SDKの方はサンプルをみたのですが、全て英語でもの凄く難しいです;;。
ちゃんと全て和訳したのですが。。(^^;
こちらの方はもう少し調べてみます。。

編集 削除
sato  2003-08-04 10:56:52  No: 51859  IP: [192.*.*.*]

AcrobatSDK は Acrobatとは別モノですよ。Adobeのサイトからダウンロードできます。ドキュメント類は全て英語ですが、有料のサポートを受ければ一部日本語のドキュメントが手に入ります。
SDKを使用しないなら、pbmplusさんの方法でできるみたいですが。

編集 削除
tama  2003-08-04 11:19:50  No: 51860  IP: [192.*.*.*]

satoさん。ありがとうございます。

AcrobatSDKの資料をダウンロードしたのですが、全て英語だったんですよね(^^;
有料のサポートを受けたかったのですが、当社は貧乏なので。。という事で許可がおりません;;。(私はそれ以上に貧乏です。。)
プロパティの取得はpbmplusさんの方法でできそうです。(が、私はまだ実現できておりませんが;;)

編集 削除
pbmplus  2003-08-04 12:54:27  No: 51861  IP: [192.*.*.*]

>AcrobatSDK は Acrobatとは別モノですよ。

そうなんですか。自分はSDKは使ったことはないので知りませんでした(^^;

> 「相互参照テーブル」の取得というのがどのようにしたら良いか、ちょっとわかりません。。。

相互参照テーブルとはPDFの仕様書では「Cross Reference Table」と
なっていて個々のPDFオブジェクトのファイル上での位置情報を記録しています。

<PDFオブジェクトの例>

1 0 obj
<<
 ...
>>
endobj

2 0 obj
<<
 ...
>>
endpbj

3 0 obj
<<
 ...
>>
endobj

<相互参照テーブルの例>

xref
0 9
0000000000 65535 f
0000000012 00000 n
0000000184 00000 n
0000001672 00000 n
0000001888 00000 n
0000002185 00000 n
0000002569 00000 n
0000002992 00000 n
0000003218 00000 n
trailer
<<
 /Root 8 0 R
 /Size 9
>>
startxref
3324
%%EOF

詳細は以下のページなどを参照してください。

公式仕様書のダウンロードページ [en]
http://partners.adobe.com/asn/tech/pdf/specifications.jsp
手書きPDF入門 [ja] <- 必見
http://www.kobu.com/docs/pdf/pdfxhand.htm
狩野 作 [ja]
http://member.nifty.ne.jp/kanou_h/handmadepdf.txt

相互参照テーブルを取得する際の注意点としては、
1)相互参照テーブルは一つだけの場合と複数個ある場合がある
2)削除済みオブジェクト(ファイル上から既に削除されているオブジェクト)がある

> 例の
> > 30869 0 obj
> というのは変数指定でしょうか?

30869 0 obj
<<
 ...
>>
endobj

上記はあくまでも例です。毎回同じ番号とは限りません。

「30869」は単純にPDFオブジェクトの整理番号(ID)です。
「0」は PDFオブジェクトの世代番号(Generation)です。
「obj」はオブジェクトのはじまりの定型句です。
「endobj」はオブジェクトのおわりの定型句です。
「<<」はオブジェクト内容のはじまりの定型句です。(参照の場合は省略可能)
「>>」はオブジェクト内容のおわりの定型句です。(参照の場合は省略可能)

詳しくは「手書きPDF入門」が役に立つと思います。
http://www.kobu.com/docs/pdf/pdfxhand.htm

編集 削除
pbmplus  2003-08-04 13:20:31  No: 51862  IP: [192.*.*.*]

相互参照テーブルをキレイに取得できれば
PDFファイルの結合やPDFファイルの分解なども意外と簡単に
できるようになりますので、最初は大変ですが頑張って下さい。

それと、文書のプロパティを取得できるようになれば、
PDFのしおりも簡単に取得できるようになります。(技術的にほぼ同じ)

編集 削除
sato  2003-08-04 14:39:38  No: 51863  IP: [192.*.*.*]

ちょっと話題は変わりますが、以下のメーリングリストは
PDFについての情報交換ができます。ご参考までに。

http://www.inouedon.com/pdfml-j/

編集 削除
tama  2003-08-04 15:34:11  No: 51864  IP: [192.*.*.*]

satoさん、pbmplusさんありがとうございます!!

PDFファイル内部を1文字ずつ参照していき、"trailer"部分のデータを取得する事ができました。
実際には暗号化有無部分(/Encryptの有無)が取得したかったのです。
(記述し忘れていました。すみません。。)

PDFファイル内全ての文字を1文字ずつ参照しているのですが、"trailer"部分を取得しているだけなので処理時間も思ったより少なくてすみました。

本当に有難うございます!!

それに勉強できるサイト情報までご親切に教えてくださいましてありがとうございます。是非、参考にさせて下さい!

繰返しくどいのですが、有難うございました。

編集 削除
KOTO  2004-08-04 11:25:12  No: 51865  IP: [192.*.*.*]

今PDFファイルの中身をチェックするという開発を行っております。
この掲示板を拝見させていただき大変参考になりました。

でもまだ解決できない問題がありメールさせていただきました。
問題は以下です。
・全てのページがA4縦かどうかチェックし、エラーの箇所はページ番号を取得す  る方法。
・PDFファイルを開いた時の初期ページ番号をチェックしたい。
・フォントの埋め込みがされているかどうかチェックしたい。

以上です。説明不足かも知れませんが、どなたかアドバイスよろしくお願いします。

編集 削除