この質問は、参照と比較のためのものです。解決策は、以下の受け入れられた回答です。
PDFドキュメントのページ数を取得するための、高速で簡単ですが、ほとんど正確な方法を何時間も探しました。私は、PDF を頻繁に扱うグラフィック印刷および複製会社で働いているため、文書を処理する前に、文書内のページ数を正確に把握する必要があります。PDF ドキュメントはさまざまなクライアントから提供されるため、同じアプリケーションで生成されていないか、同じ圧縮方法を使用していません。
以下は、私が不十分である、または単に機能していないことがわかった回答の一部です。
Imagick (PHP 拡張機能) の使用
Imagick には多くのインストールが必要で、apache を再起動する必要があり、最終的に機能するようになったとき、処理に驚くほど時間がかかり (ドキュメントごとに 2 ~ 3 分) 1
、すべてのドキュメントで常にページが返されました (作業コピーが表示されていません)。これまでのImagickの)なので、捨てました。それはgetNumberImages()
とidentifyImage()
メソッドの両方でした。
FPDI (PHP ライブラリ) の使用
FPDI の使用とインストールは簡単ですが (ファイルを抽出して PHP スクリプトを呼び出すだけです)、圧縮技術の多くは FPDI ではサポートされていません。次に、エラーを返します。
FPDF エラー: このドキュメント (test_1.pdf) は、FPDI に同梱されている無料のパーサーではサポートされていない圧縮技術を使用している可能性があります。
ストリームを開き、正規表現で検索します。
これにより、PDF ファイルがストリームで開かれ、ページ数などを含む何らかの文字列が検索されます。
$f = "test1.pdf";
$stream = fopen($f, "r");
$content = fread ($stream, filesize($f));
if(!$stream || !$content)
return 0;
$count = 0;
// Regular Expressions found by Googling (all linked to SO answers):
$regex = "/\/Count\s+(\d+)/";
$regex2 = "/\/Page\W*(\d+)/";
$regex3 = "/\/N\s+(\d+)/";
if(preg_match_all($regex, $content, $matches))
$count = max($matches);
return $count;
/\/Count\s+(\d+)/
(looks for/Count <number>
) は機能しません。内部にパラメーターが含まれているドキュメントはごくわずかであり/Count
、ほとんどの場合、何も返されません。ソース。/\/Page\W*(\d+)/
( を探します/Page<number>
) はページ数を取得しません。ほとんどの場合、他のデータが含まれています。ソース。/\/N\s+(\d+)/
ドキュメントには;の複数の値を含めることができるため、 (looks for/N <number>
) も機能しません。/N
すべてではないにしても、ほとんどの場合、ページ数は含まれていません。ソース。
では、信頼性が高く正確な作業とは何でしょうか?