【问题标题】:How to use crop from PDF to PNG tiles using ImageMagick如何使用 ImageMagick 从 PDF 裁剪到 PNG 瓷砖
【发布时间】:2016-12-03 00:04:06
【问题描述】:

早安,

我在将 PDF 裁剪为 PNG 时遇到很大问题

PDF 大约为 1.6MB (2500x2500),一个过程大约需要 7-10 分钟并生成 700MB 的临时文件。
例如

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

一个 PDF 必须生成大小为 25% 到 200% 的 PNG

在这里,我生成密度、大小以调整大小的属性(以 % 为单位)以及网格行数和列数

$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 会占用我所有的空间 (40GB) => ~35GB 的临时文件

我的问题在哪里,我做错了什么?

我试图将下面的参数传递给函数 $additional var:

"-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
版权所有:版权所有 (C) 1999-2012 ImageMagick Studio LLC
特点:OpenMP
Ubuntu 14.04.4 LTS
2GB/2CPU

已编辑

一段时间后设法替换了 GhostScript 上的 ImageMagick

gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r240 -sOutputFile=\"file.png\" file.pdf 但不明白如何缩放和裁剪图像。

使用 ImageMagick 进行裁剪会生成约 35GB 的临时文件,并且比以前需要更多时间。

【问题讨论】:

  • 这个问题看起来很相关stackoverflow.com/questions/12562471/…。您可以分两个阶段进行转换 (1) 使用gs 生成未缩放的 PNG,如答案 (2) 中所建议的,然后重新缩放/裁剪它,使用 convert 生成每个缩放的 PNG。跨度>
  • 谢谢,昨天意识到,gs 方式更快,更容易迈出第一步。现在正在寻找缩放和裁剪的方法。将查看您提供的问题!

标签: pdf imagemagick png


【解决方案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 = 文件.png
  • $r = 120
  • $ex = 4000
  • $dim = $matches[1]

步骤:

  1. 在我以后可以使用 png 大小播放之后,给我原始文件的尺寸
  2. 将 pdf 转换为具有我需要的宽高比大小的 png
  3. 将 png 转换为我希望的尺寸,纵横比为 1:1
  4. 裁剪所有内容

这个过程在我的机器上需要 27.59 秒,图像分辨率为 4000x4000,文件大小 - 只有 1.4MB 和 0-30MB 的临时文件。

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2014-01-17
    • 2015-02-13
    • 2019-01-15
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多