この質問は参照と比較するためのものです。答えは下記の受け入れられた回答。
私は何時間もかけて、早くて簡単なものを探しましたが、正確なPDF ドキュメントのページ数を取得する方法。私は PDF を頻繁に扱うグラフィック印刷および複製会社で働いているため、ドキュメントを処理する前に、ドキュメントのページ数を正確に把握する必要があります。PDF ドキュメントはさまざまなクライアントから提供されるため、同じアプリケーションで生成されず、同じ圧縮方法も使用されません。
私が見つけた答えのいくつかを紹介します不十分あるいは単に動作しない:
使用イマジック(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+)/
( を探す/N <number>
)も機能しません。ドキュメントには の複数の値が含まれる可能性があるためです/N
。すべてではないにしても、ほとんどのないページ数を含みます。ソース。
では、信頼性が高く正確な作業とは何でしょうか?
ベストアンサー1
次のような単純なコマンド ライン実行可能ファイル:pdf情報。
それはLinuxとWindows用にダウンロード可能いくつかの小さな PDF 関連プログラムを含む圧縮ファイルをダウンロードします。それをどこかに解凍します。
そのファイルの1つはpdf情報(またはpdfinfo.exe(Windows の場合) PDF ドキュメントで実行して返されるデータの例:
Title: test1.pdf
Author: John Smith
Creator: PScript5.dll Version 5.2.2
Producer: Acrobat Distiller 9.2.0 (Windows)
CreationDate: 01/09/13 19:46:57
ModDate: 01/09/13 19:46:57
Tagged: yes
Form: none
Pages: 13 <-- This is what we need
Encrypted: no
Page size: 2384 x 3370 pts (A0)
File size: 17569259 bytes
Optimized: yes
PDF version: 1.6
今のところ、誤ったページカウントが返される PDF ドキュメントは見たことがありません。また、非常に高速で、200 MB を超える大きなドキュメントでも、応答時間はわずか数秒以下です。
PHP では、出力からページ数を抽出する簡単な方法があります。
// Make a function for convenience
function getPDFPages($document)
{
$cmd = "/path/to/pdfinfo"; // Linux
$cmd = "C:\\path\\to\\pdfinfo.exe"; // Windows
// Parse entire output
// Surround with double quotes if file name has spaces
exec("$cmd \"$document\"", $output);
// Iterate through lines
$pagecount = 0;
foreach($output as $op)
{
// Extract the number
if(preg_match("/Pages:\s*(\d+)/i", $op, $matches) === 1)
{
$pagecount = intval($matches[1]);
break;
}
}
return $pagecount;
}
// Use the function
echo getPDFPages("test 1.pdf"); // Output: 13
もちろん、このコマンドライン ツールは、外部プログラムからの出力を解析できる他の言語でも使用できますが、私は PHP で使用しています。
純粋なPHPではないことは分かっています、しかし外部プログラムは方法PDF 処理がより優れています (質問にあるように)。
これが皆さんのお役に立てば幸いです。私は、この問題の解決策を見つけるのに長い時間を費やしてきましたが、PDF のページ数に関する多くの質問を見てきましたが、その中で私が探していた答えは見つかりませんでした。そのため、私はこの質問を作成し、自分で答えました。
セキュリティ通知:ドキュメント名がユーザー入力またはファイルのアップロードから入力される場合にescapeshellarg
使用します。$document