2

ユーザーから送信されたPDFを取得し、各ページを画像として抽出してから、それらの画像を配列に入力するルーチンを作成しようとしています。すべてのページを1つの画像に追加する例をいくつか見つけましたが、必要なことを実行する例はありません。

これは私が持っているものですが、空の配列を返します:

function PdfToImg($pdf_in) {
    $img_array = array();
    $im = new imagick();
    $im->readimageblob($pdf_in); // reading image from binary string
    $num_pages = $im->getnumberimages();
    $im->setimageformat("png");

for ($x =1;$x <= $num_pages; $x++) {
    $img = $im->previousimage();
    $img_array .= $img;
    }
    return $img_array;
}

ここでの注意点の1つは、これらのファイルをディスクに書き込めないことです。文字列/配列を使用する必要があります。ImageMagickのマニュアルを調べましたが、複数の画像を配列に出力することについては何も見つかりませんでした。ディスクに保存された一連のファイルにのみ出力されました。

更新:(06/13/2012)必要なものを達成する方法を見つけましたが、それは醜く、非効率的で、確かに遅いですが、他の方法はなかったようです。

function PdfToImg3($pdf_in) {
    $img_array = array();
    $im = new imagick();
    $im->readimageblob($pdf_in);
    $num_pages = $im->getnumberimages();
    $i = 0;
    for($x = 1;$x <= $num_pages; $x++) {
        $im = new imagick();
        $im->readimageblob($pdf_in);
        $im->setiteratorindex($i);
        $im->setimageformat('png');
        $img_array[$x] = $im->getimageblob();
        $im->destroy();
        $i++;
    }
    $im->destroy();
    return $img_array;
}

$ img_arrayという名前の配列を生成します。着信PDFのページは、PNG画像データの文字列として$img_arrayのキー内にあります。

より良い方法があるはずです、なぜnextImage()が機能しないのですか?毎回imagickオブジェクトを再初期化/(新規作成)せずにsetIteratorIndexを使用できないのはなぜですか?私は何かが欠けているに違いありませんが、ドキュメントにはギャップのある穴があり、Google、ImageMagickフォーラム、StackOverflowはこれが正常に行われていることについて何も知りません。

テスト済み:非常に低速で、17ページの単純なPDFはほぼ1分かかります。

更新2:(07/11/2012)このコードビットが入ったより大きなプロジェクトを終えた後、私はいくつかのポイントに戻ってパフォーマンスを改善することにしました。これは私が思いついたものです:

    $img_array = array();
    $im = new imagick();
    $im->readimageblob($pdf_in);
    $num_pages = $im->getnumberimages();
    $im->destroy();
    $i = 0;
    for($x = 1;$x <= $num_pages; $x++) {
        $im = new imagick();
        $im->readimageblob($pdf_in);
        $im->setResolution(300,300);
        $im->setiteratorindex($i);
        $im->setimageformat('png');
        $img_array[$x] = $im->getimageblob();
        $im->destroy();
        $i++;
    }
    return $img_array;

この変更により、4ページの複雑なPDF変換が21〜25秒から約2〜3秒に短縮されました。一部の変更が役に立った理由を理解していますが、他の変更はそれほど明確ではありません。うまくいけば、誰かがこれが役に立つと思うでしょう。

UPDATE3:パフォーマンスが大幅に向上した理由を理解し、「setResolution」を「readImageBlob」より下に移動すると、DPI設定が無視されます。デフォルトは72です。これに注意して、宣言を元に戻し、150に減らして達成しました。同様の結果ですが、それでもはるかに優れたパフォーマンスです。こちらのphp.netのメモを参照してください。

4

1 に答える 1

2

このブロブの読み取りと破棄は、おそらく私たちの速度を大幅に低下させます。実際、ブロブはまったく必要ありません。ピールされたコードは次のようになります。

$img_array = array();
$im = new imagick();
$im->setResolution(150,150);
$im->readImageBlob($pdf_in);
$num_pages = $im->getNumberImages();
for($i = 0;$i < $num_pages; $i++) 
{
    $im->setIteratorIndex($i);
    $im->setImageFormat('jpeg');
    $img_array[$i] = $im->getImageBlob();
 }
 $im->destroy();
于 2013-05-09T18:20:58.440 に答える