php-vips быстрее при конвертации pdf в pngs, вы можете попробовать это.
Я сделал вам пример программы:
#!/usr/bin/env php
<?php
require __DIR__ . '/vendor/autoload.php';
use Jcupitt\Vips;
for ($i = 1; $i < count($argv); $i++) {
$image = Vips\Image::newFromFile($argv[$i], [
"dpi" => 300,
# n is number of pages to render, -1 means render all pages in a tall, thin
# strip
"n" => -1,
# this enables image streaming
"access" => "sequential"
]);
$page_height = $image->get("page-height");
$n_pages = $image->get("n-pages");
echo($argv[$i] . " has " . $n_pages . " pages\n");
for ($p = 0; $p < $n_pages; $p++) {
echo(" rendering page " . $p . " ...\n");
$page = $image->crop(0, $p * $page_height, $image->width, $page_height);
$page->writeToFile($argv[$i] . "_page_" . $p . ".png");
}
}
Я могу запуститьэто примерно так:
$ /usr/bin/time -f %M:%e ../convert-vips.php nipguide.pdf
nipguide.pdf has 58 pages
rendering page 0 ...
...
rendering page 57 ...
107808:31.72
Таким образом, он сделал 58 pngs за 32 секунды и потребовал максимум 110 Мб оперативной памяти.Он не создает никаких временных файлов - эти 110 МБ охватывают все.
png - очень медленный формат файла.Если вместо этого вы сохраните как jpg, это займет около 6 секунд для всего.
Я попробовал версию вашего кода imagick:
#!/usr/bin/env php
<?php
for ($i = 1; $i < count($argv); $i++) {
$imagick = new Imagick();
$imagick->setResourceLimit(6, 1);
$imagick->setResolution(300, 300);
$imagick->readImage($argv[$i]);
$pages = $imagick->getNumberImages();
echo($argv[$i] . " has " . $pages . " pages\n");
for ($x = 0; $x < $pages; $x++) {
echo(" rendering page " . $x . " ...\n");
$imagick->readImage($argv[$i] . "[" . $x . "]");
$imagick->setImageFormat("png");
$imagick->writeImage($argv[$i] . "_page_" . $x . ".png");
}
$imagick->clear();
$imagick->destroy();
}
Запуск, который я вижу:
$ /usr/bin/time -f %M:%e ../convert-imagick.php nipguide.pdf
nipguide.pdf has 58 pages
rendering page 0 ...
...
rendering page 57 ...
255640:223.26
Таким образом, 220 с (почти в 7 раз медленнее) и 260 Мб памяти.Использование памяти - это еще не все - при разрешении 300 DPI imagick создаст 65 МБ файла в / tmp для каждой страницы, поэтому в целом требуется около 5 ГБ памяти.