📜  如何在PHP中将 PDF 文档转换为预览图像?

📅  最后修改于: 2022-05-13 01:56:26.876000             🧑  作者: Mango

如何在PHP中将 PDF 文档转换为预览图像?

将 PDF 文档转换为一组图像可能听起来不那么有趣,但它可以有一些应用程序。由于无法轻易复制图像中的内容,因此转换使文档严格“只读”,并为抄袭带来了额外的保护。当您需要一些现成的幻灯片来进行快速的办公室演示或将它们嵌入到您的报告和博客中时,这些图像也可能会派上用场。
然而,在这篇文章中,我们将把自己限制在一个小得多的例子上,即从给定的 PDF 文档生成图像预览。 “为什么要预览?”,你可能会问。好吧,一个人可能需要它来用于他的图书馆管理系统、她的在线电子书零售店或只是为了一些疯狂的周末编程挑战。你认为你可以在哪里使用这个概念到你的项目中?请在评论中告诉我。
现在从头实现完整的转换算法是不可行的,所以我们将坚持使用 3rd 方库来减轻我们的任务。我发现在这种情况下很有吸引力的方法基于以下工具:

  • Ghostscript:它是一个可用于所有三个主要平台的命令行实用程序,即。 Windows、Linux 和 Mac,可解释 PostSript 和 PDF 文件。您可以在其官方网站上阅读更多相关信息。
  • ImageMagick:它是一个免费的开源软件套件,用于显示、转换和编辑光栅图像和矢量图像文件。它适用于大多数主流编程语言,包括PHP。这是快速概览的标准文档。

使用 Ghostscript

要在您的项目中使用 Ghostscript,请从安装开始。如果您使用的是 Windows,请从其下载页面下载可执行文件。
Linux 用户可以通过他们的默认包管理器直接安装 Ghostscript;

# RPM based distros, Fedora 26/27/28
$ sudo dnf install ghostscript

通过此命令验证安装,

$ gs --version

安装后,移动到包含 PDF 文件的目录并运行以下命令。

$ gs -dSAFER -dBATCH -sDEVICE=jpeg \
-dTextAlphaBits=4 -dGraphicsAlphaBits=4 \ 
-dFirstPage=1 -dLastPage=1 -r300 \
-sOutputFile=preview.jpg input.pdf

这将从文档中生成第一页的图像。让我们了解它的实际作用;

  • -sDEVICE:设置图像的输出文件格式。
  • -sTEXTVAL, -sGRAPHICVAL:为结果图像设置抗锯齿。允许的值为 1、2 和 4。
  • -r{NUM}:设置图像的分辨率(以 dpi 为单位)。
  • -sFirstPage, -sLastPage:设置要渲染的文档的第一页和最后一页。
  • -sOutputFile:设置输出文件的名称。
  • input.pdf:它是用于转换的实际 pdf 文档。

现在为了在PHP中使用这个命令,我们调用 exec()函数。例如:

php
;


php


php
function create_preview ( $file ) {
    $output_format = "jpeg";
    $preview_page = "1";
    $resolution = "300";
    $output_file = "imagick_preview.jpg";
 
    echo "Fetching preview...\n";
    $img_data = new Imagick();
    $img_data->setResolution( $resolution, $resolution );
    $img_data->readImage( $file . "[" . ($preview_page - 1) . "]" );
    $img_data->setImageFormat( $output_format );
 
    file_put_contents( $output_file, $img_data, FILE_USE_INCLUDE_PATH );
}


此示例在 Linux 上将执行 ls 命令并在控制台上列出所有目录和文件。
我们可以使用这个概念并从我们的PHP代码中执行ghostscript命令。这是我的做法;

PHP


执行从 __main__() 开始,它在命令行获取 PDF 文件。它检查输入文件是否是有效的 PDF。如果有效,它会在输入文件上执行ghostscript命令。
输出:

$ php pdf_preview.php input.pdf
Executing command...
GPL Ghostscript 9.22 (2017-10-04)
Copyright (C) 2017 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Preview created successfully!!

使用 ImageMagick

像往常一样,我们将从将 ImageMagick 二进制文件安装到系统中开始。从依赖项开始;

$ sudo dnf install gcc php-devel php-pear

之后,安装 ImageMagick;

$ sudo dnf install ImageMagick ImageMagick-devel

然后安装PHP包装类;

$ sudo pecl install imagick
$ sudo bash -c "echo "extension=imagick.so" > /etc/php.d/imagick.ini"

如果您打算在 LAMP 架构上使用它,请考虑重新启动 Apache Web 服务器;

$ sudo service httpd restart

现在我们的系统已经准备就绪,我们可以在示例项目中使用 ImageMagick。脚本的基本功能保持不变。您所要做的就是将 create_preview()函数的内容替换为以下代码。

PHP

function create_preview ( $file ) {
    $output_format = "jpeg";
    $preview_page = "1";
    $resolution = "300";
    $output_file = "imagick_preview.jpg";
 
    echo "Fetching preview...\n";
    $img_data = new Imagick();
    $img_data->setResolution( $resolution, $resolution );
    $img_data->readImage( $file . "[" . ($preview_page - 1) . "]" );
    $img_data->setImageFormat( $output_format );
 
    file_put_contents( $output_file, $img_data, FILE_USE_INCLUDE_PATH );
}

代码是不言自明的。我们正在定义一个 Imagick 类型的实例并设置各种参数,如分辨率、文件格式等。您要呈现的 PDF 页面在文件名后面作为数组索引提及。例如:

First page: input.pdf[0]
Second page: input.pdf[1]
.
.
.
Nth page: input.pdf[N - 1]

输出:

$ php pdf_preview.php input.pdf
Fetching preview...

你们中的一些人可能想知道为什么要使用这种方法而不是前一种方法。好吧,我发现 ImageMagick 与PHP代码非常一致。编程中的命令行看起来不太好,有时会变得难以理解。但是,使用相同的配置集,Ghostscript 生成的图像文件比 ImageMagick 渲染的图像文件小。我不确定这是否是因为一些优化问题,但差异并不是那么大的问题。选择其中之一只是基于您自己的口味。
这就是您为给定 PDF 文档创建预览的方式。我希望你从这篇文章中学到了一些新东西。您更喜欢哪种方法?对进一步改进有什么建议吗?随时在评论中提及它们。