0

Windows PC で PHP5 を使用して Apache を実行しています。Ghostscript と Image マジックを正常に構成しました。次のようにpdfサムネイルを生成するスクリプトがあります。

<?php
$file = 'test.pdf';
$page = 1;
$pdfpage = $page - 1;
$nh = 200;
$nw = 200;

$im = new imagick(realpath($file)."[$pdfpage]");
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
$im->setImageFormat("jpeg");
$im->sampleImage($nw,$nh);
$im->writeImage("test.jpg");
echo "true";
?>

これは私にとってとてもうまくいきます。$pageこのスクリプトは、変数に対応するページのサムネイルを生成します。ただし、ページ番号がドキュメント内の使用可能なページ数を超えている場合、これは機能しません。私が望むのは"false"、入力変数が PDF ファイルで使用可能なページ数を超えた場合、または imagick 関数の実行が困難な場合に表示またはエコーすることです。これどうやってするの?

4

2 に答える 2

1

理論的には、%n変数をコマンドの-formatパラメーターに使用して、メイン コマンドを実行する前にidentify、PDF を含む特定のファイルのページ数 (「フレーム」、「画像」) を見つけることができます。このようにして、結果を使用して正しい値をメイン コマンドに入力できるため、そもそもエラー メッセージが表示されません。

identify -format %n some.pdf

実際には、これは非常に遅くなる可能性があります(ImageMagick は完全な PDF を事実上最初にレンダリングしてページをカウントするように見えるため)。

したがって、外部のコマンドライン ツールを使用して PDF ページ数を取得することをお勧めしますpdfinfo。このツールは PDF ファイルに特化しており、この情報を探す場所を認識しています (この番号は PDF ファイルに必要なメタデータの一部であるため、pdfinfo は、すべてのページを最初にレンダリングしてから出力する必要はありません)。情報):

pdfinfo some.pdf | grep Pages:
pdfinfo some.pdf | grep Pages: | awk '{print $2}'

2 つのコマンドの異なるパフォーマンス レベルを確認するために、PDF-1.7 の公式 ISO 32000 仕様を保持するファイルに対して実行しました。

time identify  -format %n ~/Downloads/PDF32000_2008.pdf 
756

real  0m51.902s
user  0m50.133s
sys   0m1.090s


time pdfinfo ~/Downloads/PDF32000_2008.pdf | grep Pages: | awk '{print $2}'
756

real  0m0.138s
user  0m0.041s
sys   0m0.016s

したがって、756 ページの PDF ドキュメントのパフォーマンスの差は、51.9 秒と 0.138 秒 (または 376:1) です。

12 ページの PDF ファイルでもテストしました。ここでのパフォーマンス比率は 31:1 です。1 ページの PDF は 10:1 を示し、すべてpdfinfo.

古い IT マントラ: 「仕事には適切なツールを使用してください...」

于 2012-08-13T13:42:29.597 に答える
0
$file        = 'test.pdf';
$total_pages = 1; // Probably should already know pages but if you don't, you can find out with imagick
$pdfpage     = $page - 1;
$nh          = 200;
$nw          = 200;

try {
    for($current_page = $total_pages; $current_page >= 0;$current_page--) {
        $im = new imagick(realpath($file)."[$pdfpage]");
        $im->setCompression(Imagick::COMPRESSION_JPEG);
        $im->setCompressionQuality(100);
        $im->setImageFormat("jpeg");
        $im->sampleImage($nw,$nh);
        $im->writeImage("test.jpg");
        if ($im->haspreviousimage()) { // Imagick reads pages in reverse order, thats why we're getting the previous image
            $im->previousimage();
        } else {
            break;
        }
    }
} catch (ImagickException $e) {
    die('ImagickException ' . $e->getMessage());
} catch (Exception $e) {
    die('Exception ' . $e->getMessage());
}
于 2012-03-26T16:06:22.650 に答える