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

2021年3月20日14:28:05 发表评论 1,005 次浏览

PDF文档转换为一组图像可能听起来并不那么有趣, 但是它可以具有一些应用程序。由于无法轻松复制图像中的内容, 因此转换使文档严格"只读", 并为抄袭提供了额外的保护。当你需要一些现成的幻灯片进行快速办公室演示或将其嵌入到报告和博客中时, 这些图像也可能会派上用场。

但是, 在本文中, 我们将局限于一个较小的示例, 即从给定的PDF文档生成图像预览。你可能会问:"为什么要预览?"。好吧, 可能是因为他的图书馆管理系统, 她的在线电子书零售商店或某些疯狂的周末编程挑战需要它。你认为你可以在哪里在项目中使用此概念?请在评论中让我知道。

现在从头开始实现完整的转换算法是不可行的, 因此我们将坚持使用第三方库来简化我们的任务。在这种情况下, 我发现很有吸引力的方法基于以下工具:

  • 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
  
exec ( "ls -l" , $output_str , $return_val );
  
foreach ( $output_str as $line ) {
     echo $line . "\n" ;
}
  
?>;

在Linux上, 此示例将执行ls命令并将所有目录和文件列出到控制台上。

我们可以使用这个概念并执行鬼脚本PHP代码中的命令。这是我的操作方式;

<?php 
  
function is_pdf ( $file ) {
     $file_content = file_get_contents ( $file );
      
     if ( preg_match( "/^%PDF-[0-1]\.[0-9]+/" , $file_content ) ) {
         return true;
     }
     else {
         return false;
     }
}
  
function create_preview ( $file ) {
     $output_format = "jpeg" ;
     $antialiasing = "4" ;
     $preview_page = "1" ;
     $resolution = "300" ;
     $output_file = "preview.jpg" ;
  
     $exec_command  = "gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=" . $output_format . " " ;
     $exec_command .= "-dTextAlphaBits=" . $antialiasing . " -dGraphicsAlphaBits=" . $antialiasing . " " ;
     $exec_command .= "-dFirstPage=" . $preview_page . " -dLastPage=" . $preview_page . " " ;
     $exec_command .= "-r" . $resolution . " " ;
     $exec_command .= "-sOutputFile=" . $output_file . " '" . $file . "'" ;
  
     echo "Executing command...\n" ;
     exec ( $exec_command , $command_output , $return_val );
      
     foreach ( $command_output as $line ) {
         echo $line . "\n" ;
     }
  
     if ( ! $return_val ) {
         echo "Preview created successfully!!\n" ;
     }
     else {
         echo "Error while creating the preview.\n" ;
     }
}
  
function __main__() {
     global $argv ;
     $input_file = $argv [1];
  
     if ( is_pdf( $input_file ) ) {
         // Create preview for the pdf
         create_preview( $input_file );
     }
     else {
         echo "The input file " . $input_file . " is not a valid PDF document.\n" ;
     }
}
  
__main__();
      
?>

执行从

__主要__()

在命令行中获取PDF文件。它检查输入文件是否为有效的PDF。如果有效, 则执行

鬼脚本

在输入文件上执行命令。

输出如下:

$ php pdf_preview.php input.pdf
Excuting 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()使用以下代码运行。

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 );
}

该代码是不言自明的。我们正在定义一个实例麦格克类型和设置各种参数, 如分辨率, 文件格式等。要渲染的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文档创建预览的方式。希望你从这篇文章中学到了新的东西。你想要哪种方法?有进一步改进的建议吗?随时在评论中提及他们。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: