extractbbのInvalid xref table

extractbbのInvalid xref table

- 阿部 紀行 の投稿
返信数: 14
mupdf (http://mupdf.com/)内のmutoolで作ったextractbbが不正とされてしまうようです.xref tableに空行が含まれているのがまずいようなので,とりあえず場当たり的に対処をしてみました.添付してみます.
阿部 紀行 への返信

Re: extractbbのInvalid xref table

- Akira Kakuto の投稿
pdfobj.c は最近変化していて,パッチがあたらない
ので,手動であててみました。平田さんの OK が出たら
コミット致します。
Akira Kakuto への返信

Re: extractbbのInvalid xref table

- h s の投稿
xref の各エントリは厳密に20バイト(改行含む)の固定フォーマットで
空行は xref table 内では不正ではないでしょうか。

本来mutoolを直すべきではないかと思います。

ですが、空行を許しても害はないと思うので、空行、空白文字のみの行、
空白文字とコメントのみの行なども無視するようにしてはどうでしょうか。
h s への返信

Re: extractbbのInvalid xref table

- aminophen の投稿
別所で議論があったのですが、PDF Reference sixth edition (1.7) の Example G.1 などでは
「trailer」直前に空行があります。このような空行自体は不正ではないと思われます。
xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
0000000300 00000 n
0000000384 00000 n

trailer
mutool や Java (FreeHEP) もこのような構造の PDF を作り、dvipdfmx にはじかれます。
aminophen への返信

Re: extractbbのInvalid xref table

- h s の投稿
例示の他の部分も見ると本当にそれが空行を意図したもの
かはわかりませんが。

仕様上は xref テーブル内では、サブセクションが必要なだ
け続くとあるだけで、xref テーブルの終端をどう決定するか
は明記されてないように思います。

trailer が現れたら終わりとするという今の実装も正しいとは
言えませんが、空行を許容するのも妥当とは思えません。
(xref テーブル「内」の空行は不正だと思います)
空行も許されるのであれば、コメント行のみならず、インダイ
レクト・オブジェクトがくることも許容されない理由はないので
ぐちゃぐちゃになります。



h s への返信

Re: extractbbのInvalid xref table

- aminophen の投稿
> xref テーブルの終端をどう決定するかは明記されてないように思います。

同意します。とはいえ、それが逆にいえば「終端が空行でも違反ではない」と解釈できるため
mutool は違反していない → はじかれるのはおかしい
というのが阿部 紀行さんのパッチの思惑だと思います。
ほんとうの Invalid xref table は「Adobe Reader で開いただけで保存を求められる場合」ですかね。

ただ、私自身も PDF は詳しくありません。
本トピックは「どうするのが正しいのか」というたたき台的に考えていただければと思います。

# GeoGebra ユーザから PDF が読めないという指摘をしばしば受けてきたのが背景にあります。
# 一例が岩崎 隆盛さんの test.pdf です。
aminophen への返信

Re: extractbbのInvalid xref table

- h s の投稿
この部分はオリジナルの dvipdfm から変わらない部分なので、実装した
Mark. A. Wicks さんがどういう意図でこのようにしたかははっきり分かり
ませんが、「例外的に固定フォーマット」とされる xref テーブルに関連し
た部分なので寛容な仕様にはなっていないんじゃないのでしょうか。
h s への返信

Re: extractbbのInvalid xref table

- 阿部 紀行 の投稿
>trailer が現れたら終わりとするという今の実装も正しいとは
言えませんが、空行を許容するのも妥当とは思えません。

trailerチェック直前に改行のスキップを行う,とすれば良いでしょうか?
阿部 紀行 への返信

Re: extractbbのInvalid xref table

- h s の投稿
>trailerチェック直前に改行のスキップを行う,とすれば良いでしょうか?

とにかくあらゆるところで空行を受け付けるのであれば、trailer チェック
の前とその後の 内側ループの fread() の前ですかね。

あと、空行が許されると解釈するのであれば、仕様上、コメントのみから
なる行も許容すべきではないかと思います。

Adobe Reader の実装だとさらに空白文字(とコメント)のみからなる行も
許されるようです。
h s への返信

Re: extractbbのInvalid xref table

- 阿部 紀行 の投稿
そうするとこんな感じでどうでしょう?正規表現で書くと[ \t]*(%.*)?にマッチするような行をスキップするようにしてみたつもりです.
阿部 紀行 への返信

Re: extractbbのInvalid xref table

- h s の投稿
ここで議論するのはふさわしくないでしょうし、私もメンテナからは外れているので
回答するのにふさわしくないですが、一応。

PDF の仕様上、空白文字は

 0x00 (NULL), 0x09 (Tab), 0x0a(LF), 0x0c (FF), 0x0d (CR), 0x32 (Space)

です。

また、空行を許容するのであれば、仕様解釈上は
  • xref キーワードに(同一行で)続く空白文字とコメント
  • trailer の(同一行の)前の空白文字
  • サブセクションの開始の二つの数字の前後の空白文字等
    (間はスペース1個と仕様書に記載があります)
も特に許されないことはないと思います。

こんな仕様で固定長フォーマットを導入する意義があるのか疑問ですが。

dvipdfmx に関しては、ファイル IO は mfileio.c に、PDF のパースに関しては
pdfparse.c にということになっているので、ふさわしい場所に置かれたほうが
いいかと思います。

書き出し側は厳しく、読み込み側は緩くというのが好ましい態度だと思いますの
で、mutool などの書き出し側にも、余計な空行など書かないようにさせるのが
いいのではないでしょうか。
h s への返信

Re: extractbbのInvalid xref table

- 阿部 紀行 の投稿
ありがとうございます.きちんとやるとなると面倒そうですね…….自分がごちょごちょやるよりも適切な場所に投げた方がよい気もしてきました.
# 休みも終わるし
阿部 紀行 への返信

Re: extractbbのInvalid xref table

- aminophen の投稿
> extractbbのInvalid xref table

後のためのメモ:
この件は,r39346 で修正していただきました。TeX Live 2016 に入るでしょう。
http://tug.org/pipermail/tex-live/2016-January/037653.html
Akira Kakuto への返信

Re: extractbbのInvalid xref table

- 阿部 紀行 の投稿
> pdfobj.c は最近変化していて,パッチがあたらない
お手数おかけしました.ありがとうございます.
# 新しいソースをとっておこう……

> 平田さんの OK が出たらコミット致します。
PDFに詳しい人のコメントがもらえるとありがたいです.
阿部 紀行 への返信

Re: extractbbのInvalid xref table

- aminophen の投稿
後のために情報だけ書いておくと:forum:923 の件です。

- MuPDF の mutool
- GeoGebra など(Java の FreeHEP ライブラリ)
の PDF が読めるようになるはずです(IGOR の場合は本当に不正なので従来どおり落ちます)。ありがとうございます。