spatie/pdf-to-image

将PDF转换为图片

3.1.0 2024-09-14 17:02 UTC

README

Latest Version on Packagist Software License Quality Score Total Downloads

此包提供了一种易于使用的类,用于将PDF转换为一张或多张图片。

需求

您应已安装ImagickGhostscript。有关Ghostscript相关问题Imagick问题的更多信息,请参阅。

安装

该包可以通过composer安装,需要PHP 8.2+。

composer require spatie/pdf-to-image

如果您使用的是PHP < 8.2,请使用此包的2.0版本。

用法

将PDF转换为图片非常简单。

$pdf = new \Spatie\PdfToImage\Pdf($pathToPdf);
$pdf->save($pathToWhereImageShouldBeStored);

如果传递给saveImage的文件名具有扩展名jpgjpegpngwebp,则图片将以该格式保存;否则,输出格式将为jpg

save()方法返回一个包含保存的图片文件名的数组(如果保存了多张图片),否则返回一个包含保存的图片路径的字符串。

其他方法

获取PDF中的总页数

/** @var int $numberOfPages */
$numberOfPages = $pdf->pageCount();

检查文件类型是否为支持的输出格式

/** @var bool $isSupported */
$isSupported = $pdf->isValidOutputFormat('jpg');

默认情况下,只会渲染PDF的第一页。要渲染另一页,请调用selectPage()方法

$pdf->selectPage(2)
    ->save($pathToWhereImageShouldBeStored); //saves the second page

或者,使用selectPages()方法选择多页

$pdf->selectPages(2, 4, 5)
    ->save($directoryToWhereImageShouldBeStored); //saves the 2nd, 4th and 5th pages

更改输出格式

$pdf->format(\Spatie\PdfToImage\Enums\OutputFormat::Webp)
    ->save($pathToWhereImageShouldBeStored); //the saved image will be in webp format

设置输出质量(压缩质量)从0到100

$pdf->quality(90) // set an output quality of 90%
    ->save($pathToWhereImageShouldBeStored);

设置输出分辨率DPI

$pdf->resolution(300) // resolution of 300 dpi
    ->save($pathToWhereImageShouldBeStored);

指定输出图片的缩略图大小

$pdf
   ->thumbnailSize(400) // set thumbnail width to 400px; height is calculated automatically
   ->save($pathToWhereImageShouldBeStored);

// or:
$pdf
   ->thumbnailSize(400, 300) // set thumbnail width to 400px and the height to 300px
   ->save($pathToWhereImageShouldBeStored);

设置输出图片宽度

$pdf->size(400) // set the width to 400px; height is calculated automatically
    ->save($pathToWhereImageShouldBeStored);

设置输出图片的宽度和高度

$pdf->size(400, 300) // set the width to 400px and the height to 300px
    ->save($pathToWhereImageShouldBeStored);

获取PDF的尺寸。这可以用来判断PDF是否具有极高的分辨率。

/** @var \Spatie\PdfToImage\DTOs\PageSize $size */
$size = $pdf->getSize();

$width = $size->width;
$height = $size->height;

将所有页面保存为图片

$pdf->saveAllPages($directoryToWhereImagesShouldBeStored);

为Imagick设置合并图层方法

$pdf->layerMethod(\Spatie\PdfToImage\Enums\LayerMethod::Merge);

// or disable layer merging:
$pdf->layerMethod(\Spatie\PdfToImage\Enums\LayerMethod::None);

设置输出图片的背景颜色

$pdf->backgroundColor('white') // simple text for 'white' color
    ->save($pathToWhereImageShouldBeStored);

$pdf->backgroundColor('#fff') // code for 'white' color
    ->save($pathToWhereImageShouldBeStored);

$pdf->backgroundColor('rgb(255,255,255)') // rgb for 'white' color
    ->save($pathToWhereImageShouldBeStored);

关于Ghostscript的问题

此包通过Imagick使用Ghostscript。为此,Ghostscript的gs命令应该可以从PHP进程访问。对于PHP CLI进程(例如Laravel的异步任务、命令等...),这通常已经如此。

但是,对于PHP在FPM(例如在浏览器中运行此包时)的情况下,您可能会遇到以下问题

Uncaught ImagickException: FailedToExecuteCommand 'gs'

您可以在php-fpm.conf文件的末尾添加以下行并重新启动PHP FPM来修复此问题。如果您不确定php-fpm.conf文件的位置,您可以检查phpinfo()。如果您使用Laravel Valet,则php-fpm.conf文件位于/usr/local/etc/php/YOUR-PHP-VERSION目录中。

env[PATH] = /usr/local/bin:/usr/bin:/bin

这将指示PHP FPM在正确的位置查找gs二进制文件。

Imagick问题

如果您收到错误消息attempt to perform an operation not allowed by the security policy 'PDF',您可能需要将以下行添加到您的policy.xml文件中。此文件通常位于/etc/ImageMagick-[VERSION]/policy.xml,例如/etc/ImageMagick-7/policy.xml

<policy domain="coder" rights="read | write" pattern="PDF" />

测试

spatie/pdf-to-image 使用 PEST 框架进行单元测试。可以使用以下命令运行:

./vendor/bin/pest

变更日志

请参阅 变更日志 了解最近更改的详细信息。

贡献

请参阅 贡献指南 了解详细信息。

安全漏洞

请查阅 我们的安全策略 了解如何报告安全漏洞。

鸣谢

许可证

MIT 许可证(MIT)。请参阅 许可证文件 了解更多信息。