我试图找到将多个pdf转换为jpeg图像的最快方法,而不会造成质量损失。我有以下代码:
$this->imagick = new \Imagick();
$this->imagick->setresolution(300,300);
$this->imagick->readimage($this->uploadPath . '/original/test.pdf');
$num_pages = $this->imagick->getNumberImages();
for($i = 0;$i < $num_pages; $i++) {
$this->imagick->setIteratorIndex($i);
$this->imagick->setImageFormat('jpeg');
$this->imagick->readimage($asset);
// i need the width, height and filename of each image to add
// to the DB
$origWidth = $this->imagick->getImageWidth();
$origHeight = $this->imagick->getImageHeight();
$filename = $this->imagick->getImageFilename();
$this->imagick->writeImage($this->uploadPath . '/large/preview-' . $this->imagick->getIteratorIndex() . '.jpg');
$this->imagick->scaleImage($origWidth / 2, $origHeight / 2);
$this->imagick->writeImage($this->uploadPath . '/normal/preview-' . $this->imagick->getIteratorIndex() . '.jpg');
//add asset to the DB with the given width, height and filename ...
}
这是非常缓慢的,部分是因为分辨率太大但是我没有添加它,图像上的文字质量非常差。此外,我首先保存图像,然后还保存较小版本的文件的事实可能不是很优化。
那么有没有人有更好的方法呢?也许只有ghostscript?
最低要求是我需要2个版本的转换图像。实际尺寸版本和半尺寸版本。我需要将宽度,高度和文件名添加到数据库中。
答案 0 :(得分:1)
你可以使用Ghostscript,如果你设置“-sDEVICE = jpeg -sOutputFile = out%d.jpg”,那么每个页面都会被写入一个单独的文件。
请注意,由于JPEG是一种有损压缩方法,因此无法将PDF格式化为JPEG而没有质量损失。您是否考虑过使用无损格式,例如PNG或TIFF?
要获得不同大小的相同图像,您需要以不同的分辨率渲染文件两次,在Ghostscript中使用'-r'设置分辨率。可以从图像文件中轻松读取宽度和高度,也可以使用pdf_info.ps获取每个页面大小。请注意,PDF文件可以包含多个不同大小的页面,我希望您不要期望它们都是相同的....