【问题标题】:PHP Imagick PDF conversion Text aliasingPHP Imagick PDF 转换 文本别名
【发布时间】:2014-05-29 21:58:33
【问题描述】:

我在 PHP 中使用 Imagick 将 PDF 文件转换为 JPEG 时遇到了一些麻烦。 经过大量研究,我能够将 CMYK pdf 转换为 RGB jpg,而无需进行奇怪的颜色转换……但是现在,我的最后一个问题:文本完全别名!原始 PDF 文件中的文本未矢量化。

一个例子:

代码如下:

$imagick = new Imagick();

$imagick->setResolution(150,150);
$imagick->readImage('file.pdf');

//CMYK PROFILE
$icc = file_get_contents('USWebCoatedSWOP.icc'); 
$imagick->profileImage('icc', $icc); 
$imagick->setImageColorspace(imagick::COLORSPACE_CMYK); 

//RGB PROFILE
$icc = file_get_contents('sRGB_IEC61966-2-1_no_black_scaling.icc'); 
$imagick->profileImage('icc', $icc); 
$imagick->setImageColorspace(imagick::COLORSPACE_RGB); 

$imagick->setImageFormat( "jpg" );
$imagick->setImageCompression(imagick::COMPRESSION_JPEG); 
$imagick->setImageCompressionQuality(90); 

header( "Content-Type: image/jpeg" );
echo $imagick;

【问题讨论】:

  • 你能发布一个示例 pdf 吗?
  • 谢谢。似乎有一个重复的问题,这里有答案 - stackoverflow.com/a/16435640/778719 但是接受的答案对我不起作用,但也许我做错了什么。
  • @Danack 我真的不这么认为,因为我的问题最可能的原因是 Ghostscript...
  • 糟糕 - 我昨天对错误的问题进行了近距离投票。然后撤销了接近投票,但是忘记删除评论了。

标签: php imagick antialiasing


【解决方案1】:

Image Magick 使用 Ghostscript 实际渲染 PDF,我认为您使用的是具有 a bug in it 的 Ghostscript 版本,这会导致文本无法正确消除锯齿。

我测试了您提供的代码,以及使用命令直接调用 Ghostscript。

gs -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=1 -sDEVICE=pngalpha -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r150  -sOutputFile=foo-%d.png flyer.pdf

默认情况下,我的 Centos 机器使用的是 Ghostscript 8.70 版,无论是从 Imagick 还是从上面的 gs 命令调用时,它都会显示您所看到的问题。从here 下载 9.14 版可以使文本在使用命令行时正确消除锯齿,并且在通过 Imagick 调用时可能会正确消除锯齿。

【讨论】:

  • 我想你明白了!我试图在我的服务器上更新 ghostscript,但 yum 更新没有包被标记为更新......我将在当天晚些时候进一步调查!
  • 您可以从该服务器下载文件并从目录运行它,您无需安装更新版本进行测试。
【解决方案2】:

这很可能不是抗锯齿的问题。

将分辨率提高到 400,看看会发生什么。

$imagick->setResolution(400,400);

【讨论】:

  • 这肯定是锯齿的问题……即使分辨率更高,文本的外观总是一样的……我发布的屏幕截图没有缩放,像素显示完全一样!
  • 试试这个? php.net/manual/en/imagick.setcompressionquality.php,第一条评论说根据 php 版本使用不同的命令。也许你的不起作用?
  • 我 99% 确定这不是分辨率问题或压缩问题。通过放大文本,绝对没有 jpeg 伪影。如果我提高分辨率,它会变得更好,但是 1)它太重了 2)它仍然是混叠的。这是一个别名问题,但似乎谷歌在这个问题上不是我的朋友!我发现使用带有命令行的 imagemagick 有更多选项,而 dTextAlphaBits 听起来像是解决此类问题的一个选项……使用 php 找不到类似的功能。
  • php.net/manual/en/book.imagick.php - 这是我唯一能给你的建议。搜索您认为需要的功能,然后用谷歌搜索它的用法。
猜你喜欢
  • 2012-02-06
  • 2017-06-11
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2019-01-27
相关资源
最近更新 更多