如何使用(例如)graphicsmagick 将具有多个页面的大型 pdf 有效地转换为具有节点(在后端)的单独(高分辨率)jpg?

问题描述 投票:0回答:2

我想使用节点(在我的后端)将包含许多(数百个!)页面的大型 PDF 转换为单独的 jpg,以便将它们存储在数据库中以供进一步使用。

为此,我选择了 npm 包“gm”,它在后台使用“graphicsmagick”。

我遇到了几个大问题。例如,node似乎无法一次“消化”大量页面。由于“gm”是同步的,它不会等待,而是尝试几乎立即开始转换所有页面,这会“冻结”我的节点应用程序,即,它永远不会停止工作,并且不会生成任何页面。如果我将页数限制为 20 页,则效果非常好。

我找不到任何有关“gm”或“graphicsmagick”的文档,提供转换(大)pdf 的“最佳实践”。

我遇到的两个最相关的问题是:

a) 有没有办法告诉“graphicsmagick”为每个 pdf 页面生成单独的 jpg 文件?例如,“imagemagick”就是“开箱即用”地做到这一点。更具体一点

convert -density 300 test.pdf test.jpg

会生成“test-0.jpg”、“test-1.jpg”、“test-2.jpg”等文件

gm convert -density 300 test.pdf test.jpg

仅生成一个 jpg 文件(pdf 的第一页)。

b) 有没有办法使用“gm”重用相同的“Buffer”来生成 jpg 图像?我认为使用大缓冲区(> 100MB)调用“gm”数百次并不是最好的方法

这是我现在正在使用的代码:

import gm from 'gm';
import fs from 'fs';

// Create "Buffer" to be used by "gm"
const buf = fs.readFileSync('test.pdf');

// Identify number of pages in pdf
gm(buf, 'test.pdf').identify((err: any, value: gm.ImageInfo) => {
  if (err) {
    console.log('err');
  } else {
    const actualArray: string[] = value.Format.toString().split(',');
    let numPages: number = actualArray.length;
    // Loop through all pages and produce desired output
    for (let currentPage: number = 0; currentPage < numPages; currentPage++) {
      gm(buf, `test.pdf[${currentPage}]`)
        .density(150, 150)
        .quality(90)
        .write(`test${currentPage}.jpg`, (err: any) => {
          if (err) console.log(err);
        });
    }
  }
});

这个方法

  • 不适用于大型 pdf 文件(至少在我的机器上不行)
  • 非常慢(大概是因为它几乎立即调用“gm”数百次,“缓冲区”> 100MB)

是否有“最佳实践”方法可以正确做到这一点?任何提示将不胜感激!

graphicsmagick gm
2个回答
1
投票

对于商业免费的开源任务,您需要避免那些依赖于后台许可的 GhostScript PDF 处理的任务,例如 ImageMagick GraphicsMagick 等。

如果是个人使用,请考虑 Ghostscript 的姐妹 MuTool。这通常是最快的方法,请参阅:将 pdf 转换为 jpg 图像最快的方法是什么?

因此,完成此任务的最佳 FOSS 主力是 Poppler,将 PDF 转换为图像页面的方法是 pdftoppm,它具有多种输出格式,包括 2 种 jpg 类型。不过,我建议考虑将 PNG 作为文档的首选输出。任何尺寸差异都可以通过像素清晰度来补偿。

  • 对于 OCR 使用 ppm
  • 对于文档/LineART 使用 PNG
  • 对于照片使用标准 JPEG

-png : 生成 PNG 文件
-jpeg :生成 JPEG 文件
-jpegcmyk :生成 CMYK JPEG 文件
-jpegopt :jpeg选项,格式为

<opt1>=<val1>[,<optN>=<valN>]*

典型的 Windows 命令行

"bin\pdftoppm.exe" -png  -r %resolution% "%filename.pdf%" "%output/rootname%"

0
投票

您可以尝试使用 pdfimages utilite(poppler 或 xpdf 项目)获取原始图像从 pdf 中提取

© www.soinside.com 2019 - 2024. All rights reserved.