リンクをクリップボードにコピー
コピー完了
フォーラムの皆さま
PDF規格の勉強も兼ねて、個人でPDF処理ツールを作成している者です。
PDFファイルを読み取って出力する機能を開発したのですが、一部の出力ファイルをAdobe Acrobat Proで開けない事象が発生しています。
作成したツールは内容の編集を行っていませんが、オブジェクトの順番などが変わっており元のファイルと完全に同一ではありません。
Acrobat Proでは開けない場合、
「この文書を開くときにエラーが発生しました。文書を読み取り中に問題が発生しました(14)。」
というエラーが出ます。
このエラーについて調べると、Ctrlキーを押しながらOKボタンをクリックすることで追加の説明を出すことができるというコメントをインターネット上で見つけたため試してみると
「dictオブジェクトを指定してください。」
というメッセージでした。
Acrobat Proでは開けないのですが、Chrome・EdgeのPDF表示機能ではエラーなく表示されており、作成したツールに重大な誤りがあるわけではないと考えています。
ツールに入力するPDFファイルを変えるとAcrobat Proで開ける場合もあります。
出力されたファイルをテキストエディタで開いて比べてみたのですが、違いとして見つけられたのはファイルの最初に現れるオブジェクトがDictionary(この場合はOK)であるかStream(この場合はダメ)であるかというものでした。
「dictオブジェクトを指定してください。」というメッセージに関連していそうな違いだと思います。
ただ、Linearized PDFの場合最初のオブジェクトはLinearization parameter dictionaryになるということは把握しているのですが、出力ファイルはLinearized PDFではないため最初のオブジェクトは何でも構わないのでは?とも思います。
(開ける場合のPDFファイルも、最初のDictionaryはLinearization parameter dictionaryではないです。)
以上が現状と考察になります。
何かご存知のことがありましたら指摘いただけると助かります。
試行錯誤の結果、自己解決できました。
アドバイスをくださった皆さま、ありがとうございました。
他の方の参考になる可能性は低いですが、エラー解決の経緯を残しておきます。
1. https://itextpdf.com/products/rups こちらのツールで出力ファイルを開き、"Save as"するとAdobe Readerでも開けるPDFファイルが出力された
2. 見比べると、/Info がDictionary (Indirect object)であるか(こちらはOK)Dictionary in an object stream(こちらはダメ)の違いがあった
3. 他のPDFファイルでDictionary in an object streamの場合、Cross-reference tableを使っていない形式だった
4. ということで、Cross-reference table・Trailer dictionaryを使わずCross-reference streamのみでリファレンスを記述すると解決した
エラーが発生していたときはCross-reference table・Cross-re
...リンクをクリップボードにコピー
コピー完了
内容でいえばこちらの投稿の続きだと思います。
ただ、この内容でいえば、開発者であったとしても、作成したツールの状態、PDF構造全部を見ないと、何がどう、ということは何も言えないのではないでしょうか。
またAcrobatの開発関係でいえば、英語コミュニティのAcrobat SDK コミュニティはありますが、自作ツールのPDF構造問題はさすがに取り上げるべきところではないと思います。
リンクをクリップボードにコピー
コピー完了
assuse様
ご指摘の通り、前の投稿と同内容です。
スパム判定を受けたので新しく投稿していたのですが、こちらの古い投稿のスパム判定が解除されて復活したみたいです。
リンクをクリップボードにコピー
コピー完了
どういった構成になっているかが問題なので、これだけの情報では判断できませんが、必要な子要素の間接参照が欠落しているのではないでしょうか。
フィルター処理やリソースの参照ではオブジェクト内からさらに子要素の参照を行いますが、そういったオブジェクトに欠落が生じている可能性はありませんか?
EdgeやChrome等は一部のリソース情報を無視してレンダリングしますので、必ずしも正しいレンダリング結果が得られるとは言えない事にも注意が必要です。
リンクをクリップボードにコピー
コピー完了
Ten A 様
コメントありがとうございました。
自作ツールの処理では、すべてのオブジェクトを番号順に読み取って出力しています。
オブジェクトの番号も変えていないので、欠落や参照ミスはないと思うのですが…。
「ブラウザのPDFビューワーは一部情報を無視している」という指摘は他の方からもあったのですが、具体的に何が参照されないかご存知でしょうか?
リンクをクリップボードにコピー
コピー完了
ブラウザーの実装には明るくはありませんが、Resourcesに含まれるExtGStateに含まれる拡張情報が処理されないのは多いかと思います。
並べ替えただけであるのなら、クロスリファレンステーブル、特にサブセクションに関する部分の整合性等に問題が生じているか、直接参照オブジェクトを含む構造が崩れているなどが考えられるところです。
まあ、こればかりは現物のバイナリをクロスリファレンス参照しながら確認しないことには何が起きているのかは判断しにくいでしょう。
リンクをクリップボードにコピー
コピー完了
試行錯誤の結果、自己解決できました。
アドバイスをくださった皆さま、ありがとうございました。
他の方の参考になる可能性は低いですが、エラー解決の経緯を残しておきます。
1. https://itextpdf.com/products/rups こちらのツールで出力ファイルを開き、"Save as"するとAdobe Readerでも開けるPDFファイルが出力された
2. 見比べると、/Info がDictionary (Indirect object)であるか(こちらはOK)Dictionary in an object stream(こちらはダメ)の違いがあった
3. 他のPDFファイルでDictionary in an object streamの場合、Cross-reference tableを使っていない形式だった
4. ということで、Cross-reference table・Trailer dictionaryを使わずCross-reference streamのみでリファレンスを記述すると解決した
エラーが発生していたときはCross-reference table・Cross-reference streamを両方使ったハイブリッド形式で記述していました。
この形式での記述に何らかの問題があったようです。
(PDF規格に則って記述していたつもりでしたが、どこかに読み違いがあったと思われます。)