0

我已经在 StackOverFlow 和谷歌上搜索了两天,仍然无法找到解决方案。我想要做的是创建一个 PHP 脚本:

  • 将 PDF 上传到我的网站
  • 将文档的每一页转换为单独的图像
  • 显示转换后的图像

大多数提出类似问题的用户都会使用 ImageMagick,但我的完美解决方案是 PHP 库,你知道吗?

4

2 回答 2

0

对于第一点和第三点,它们是网络上的大量信息或教程。

对于第二点,您可以使用这个作曲家包:https ://github.com/spatie/pdf-to-image

于 2020-05-06T21:02:07.023 回答
0

php-vips可以快速完成此操作,并且只需要少量内存。

例如:

#!/usr/bin/env php
<?php

require __DIR__ . '/vendor/autoload.php';

use Jcupitt\Vips;

for ($i = 1; $i < count($argv); $i++) {
  $image = Vips\Image::newFromFile($argv[$i]);
  $n_pages = $image->get("n-pages");
  echo($argv[$i] . " has " . $n_pages . " pages\n");

  for ($n = 0; $n < $n_pages; $n++) {
    echo("  rendering page " . $n . " ...\n");
    $page = Vips\Image::newFromFile($argv[$i], [
      "dpi" => 30,
      "page" => $n,
      # this enables image streaming
      "access" => "sequential"
    ]);
    $page->writeToFile($argv[$i] . "_page_" . $n . ".png");
  }
}

在 30 DPI 时,A4 页面的宽度约为 250 像素,这对于预览来说是可以的。在这台 2015 年的笔记本电脑上,我看到:

$ time ./convert-vips.php ~/pics/nipguide.pdf
/home/john/pics/nipguide.pdf has 58 pages
  rendering page 0 ...
  rendering page 1 ...
...
  rendering page 56 ...
  rendering page 57 ...

real    0m1.765s
user    0m1.645s
sys     0m0.230s

不到两秒即可呈现 58 个预览页面。

它具有以下不错的功能:

  1. 它使用 poppler 进行 PDF 渲染,而不是 GhostScript,因此它可以直接调用库。相比之下,像 imagick 这样的包使用 GhostScript 并且必须通过隐藏的临时文件来处理文档。这提供了有用的速度增加。

  2. Poppler 将生成高质量、抗锯齿的图像。使用 GhostScript,您需要以更高的分辨率进行渲染,然后按比例缩小,使其更慢。

  3. 它进行渐进式渲染(在内部,页面被渲染为一系列块),因此您可以根据需要生成非常高分辨率的输出文件。

Poppler 是 GPL,因此如果您要分发使用它构建的程序,您确实需要小心一点。

于 2020-05-07T03:19:43.000 回答