Как использовать обрезку из PDF в PNG плитки с помощью ImageMagick

Добрый день,

У меня есть большая проблема обрезка PDF в PNG

PDF составляет около 1,6 МБ (2500x2500), и один процесс занимает около 7-10 минут и генерирует 700 МБ временных файлов.
например

exec("convert -density 400 'file.pdf' -resize 150% -crop 48x24@ png32:'file_%d.png'");

Один PDF должен создавать PNG размером от 25% до 200%.

Здесь я генерирую такие атрибуты, как плотность, размер для изменения размера в% и количество строк и столбцов в сетке.

$x = 0; $y = 0;
for ($i = 25; $i <= 200; $i += 25) {
    $x += 8; $y += 4;

    $convert[$i] = ['density' => (($i < 75) ? 200 : ($i < 150) ? 300 : ($i < 200) ? 400 : 500), 'tiles' => implode("x", [$x, $y])];
}

После того, как я запускаю конвертер один за другим, это очень дорого по времени.

$file_cropper = function($filename, $additional = '') use ($density, $size, $tiles) {
    $pid = exec("convert -density $density ".escapeshellarg($filename)." -resize $size% -crop $tiles@ ".$additional." png32:".escapeshellarg(str_replace(".pdf", "_%d.png", $filename))." >/dev/null & echo $!");
    do {
        /* some really fast code */
    } while (file_exists("/proc/{$pid}"));
};

Если я запускаю его одновременно (8 процессов), тогда ImageMagick съедает все пространство, которое у меня есть (40 ГБ) => ~35 ГБ временных файлов

Где моя проблема, что я делаю не так?

я попытался передать параметры ниже функции $ дополнительные переменная:

"-page 0x0+0+0"
"+repage"
"-page 0x0+0+0 +repage"
"+repage -page 0x0+0+0"

ничего не меняется

Версия: ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
Авторское право: Copyright (C) 1999-2012 ImageMagick Studio LLC
Особенности: OpenMP
Ubuntu 14.04.4 LTS
2GB / 2CPU

РЕДАКТИРОВАНИЕ

Через некоторое время удалось заменить ImageMagick на GhostScript

gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r240 -sOutputFile=\"file.png\" file.pdf но не могу понять, как масштабировать изображение и обрезать его.

Обрезка с помощью ImageMagick создает ~ 35 ГБ временных файлов и занимает больше времени, чем раньше.

1 ответ

Решение

Мне удалось решить мою проблему таким образом:

  1. $info = exec("identify -ping %w {$original_pdf_file}"); preg_match('/(\d+x\d+)/', $info, $matches);
  2. "gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r{$r} -g{$dim} -dPDFFitPage -sOutputFile=\"{$png}\" {$filename}"
  3. "convert ".escapeshellarg($png)." -gravity center -background none -extent {$ex}x{$ex} ".escapeshellarg($png)
  4. "convert ".escapeshellarg($png)." -crop {$tiles}x{$tiles}! +repage ".escapeshellarg(str_replace(".png", "_%d.png", $png))

где:

  • $ filename = file.pdf
  • $ png = file.png
  • $ р = 120
  • $ ex = 4000
  • $ dim = $ соответствует [1]

Шаг:

  1. дает мне размер исходного файла после того, что я могу играть с размером PNG в будущем
  2. конвертирует pdf в png с нужным мне размером с соотношением сторон
  3. преобразует png в размер, который я хочу с соотношением сторон 1:1
  4. обрезать все

этот процесс занимает 27,59 с на моей машине с разрешением изображения 4000x4000 и размером файла - всего 1,4 МБ и 0-30 МБ временных файлов.

Другие вопросы по тегам