0

PDFファイルを一連のjpeg画像に変換するために動作するphpスクリプトがあります。

スクリプトがこれを達成する方法:

- Download pdf to local server.
- Create folders to place jpeg images, one folder for large images and one for small images.
- Extract images from pdfs to correct folders.
- Go through each of the files in the large folder and scale images to 1000 width.

これが私が使用しているコードの内訳です。

$outputfile = "filename";
$cmd = "wget -q \"$url\" -O books/$outputfile.pdf";
exec($cmd);

if(!is_dir("books/$outputfile")) mkdir("books/$outputfile");
if(!is_dir("books/large/")) mkdir("books/large/");
if(!is_dir("books/large/$outputfile")) mkdir("books/large/$outputfile");

set_time_limit(9000);

......................................................................
/* Skipped Code to figure out with & height of pdf: $width, $height */
......................................................................

/* Extract Images from PDF, once in a large size (first) and another at its original size */
exec("'gs' -o books/large/$outputfile/$outputfile-%06d.jpg -dDEVICEWIDTHPOINTS=$width -dDEVICEHEIGHTPOINTS=$height -dFIXEDMEDIA=true -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -dPDFFitPage=true -dUseCropBox=true -r300 -dJPEGQ=100 -dTextAlphaBits=4 'books/$outputfile.pdf'",$output1);
exec("'gs' -o books/$outputfile/$outputfile-%06d.jpg -dDEVICEWIDTHPOINTS=$width -dDEVICEHEIGHTPOINTS=$height -dFIXEDMEDIA=true -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -dPDFFitPage=true -dUseCropBox=true       -dJPEGQ=100 -dTextAlphaBits=4 'books/$outputfile.pdf'",$output2);

$directory = "/var/www/html/pdf/books/large/$outputfile/";
$d = dir($directory);
chdir($directory);

/* Scale image to be 1000px wide and auto height */
$largewidth = 1000;
$scale = 1000 / intVal($width);
$largeheight = intVal($height) * $scale;
while($entry = $d->read()) {
if($entry != "." && $entry != "..") {
    $size = getimagesize($entry);
    $fp = fopen($entry, "rb");
    if ($size && $fp) {
        $swidth = 1000;
        $scale = 1000 / intVal($size[0]);
        $sheight = intVal(intVal($size[1]) * $scale);

        $dimg = imagecreatetruecolor($swidth, $sheight);
        $simg = imagecreatefromjpeg($entry);

        imagecopyresampled($dimg,$simg,0,0,0,0,$swidth,$sheight,$size[0],$size[1]);
        imagejpeg($dimg,$entry,85);
    }
    else {
        echo "fail";
    }
}
}
$d->close();

問題は、pdf 全体を一連の画像に変換するのに 1 時間近くかかることです。PDF は通常、300 ~ 500 ページの長さです。

このコードで、もっと効率的にできると思うことはありますか?

最も時間がかかるのは、ファイルの最後で、大きなフォルダー内の各画像を調べて、幅を 1000 に縮小することです。

また、このサーバーに新しいphp拡張機能をインストールするためのアクセスが制限されているため、imagemagickも問題外だと思います.

ありがとうございました

4

1 に答える 1

1

ほとんどの時間は画像のスケーリングに費やされていると言うので、後でスケーリングするのではなく、Ghostscript に必要なサイズで画像を生成させたいと思うでしょう。

また、JPEG 画像をスケーリングすると、アーティファクトが現れる可能性が非常に高くなります。スケーリングする必要がある場合は、最終ステップまで JPEG を避ける必要があります。

私は PHP について何も知らないので、スクリプトについてコメントすることはできません。

于 2013-01-15T17:35:30.553 に答える