ruby - 无法从特定 PDF 中提取文本和图像

标签 ruby pdf command-line ubuntu-14.04 pdfbox

谁能告诉我如何从 PDF 中提取所有文本和图像。我能够在类似的场景中提取图像,我使用 Google Docs 创建了一个包含几行文本和 2 个 png 图像的 PDF。但是,我无法从样本 pdf 中提取图像.

我尝试过以下方法:

在 ruby 中:

1)“pdf-reader”gem,仅支持提取少数格式的图像。

2)“docsplit”gem,它只能提取文本,无法提取图像。

命令行实用程序:

1)“pdfimages”工具,仅支持提取少数格式的图像。

Java 库:

1)“pdfbox”库,仅支持提取少数格式的图像。

最佳答案

1.

提取文本:

pdftotext -layout the.pdf -

将所有页面的文本提取到 <stdout> .

pdftotext -layout -nopgbrk the.pdf the-3-5.txt

将所有页面的文本提取到文件the.txt ,并且不要插入这些讨厌的 ^L 字符表示新页面。

pdftotext -f 3 -l 5 -layout the.pdf -

将第 3--5 页的文本提取到-3-5.txt。

2.

提取图像

pdfimages -f 4 -l 7 -j the.pdf myprefix--

将第 4 页到第 7 页的所有图像提取为 JPEG(如果可能!),并使用前缀 myprefix--- 命名它们。 .

如果无法提取为 JPEG,图像将提取为纯栅格 PPMPGM .

pdfimages的最新版本(Poppler 叉)让您指定 -png (以及更多)将所有图像获取为 PNG。

使用最新版本pdfimages为您提供以下选项:

$ pdfimages -h

   pdfimages version 0.33.0
   Copyright 2005-2015 The Poppler Developers - http://poppler.freedesktop.org
   Copyright 1996-2011 Glyph & Cog, LLC
   Usage: pdfimages [options] <PDF-file> <image-root>
     -f <int>       : first page to convert
     -l <int>       : last page to convert
     -png           : change the default output format to PNG
     -tiff          : change the default output format to TIFF
     -j             : write JPEG images as JPEG files
     -jp2           : write JPEG2000 images as JP2 files
     -jbig2         : write JBIG2 images as JBIG2 files
     -ccitt         : write CCITT images as CCITT files
     -all           : equivalent to -png -tiff -j -jp2 -jbig2 -ccitt
     -list          : print list of images instead of saving
     -opw <string>  : owner password (for encrypted files)
     -upw <string>  : user password (for encrypted files)
     -p             : include page numbers in output file names
     -q             : don't print any messages or errors
     [....]

您还想要什么图像格式?如果您需要其他格式,请使用 ImageMagick 的 convert命令。

此外,PDF 中没有嵌入其他“格式”。

基本上,嵌入 PDF 中的图像的唯一压缩方法是:

  • JPEG(然后 /DCTDEcode 过滤器被提及作为 PDF 查看器的解压缩提示),
  • JBIG2 (/JBIG2Encode),
  • 传真压缩 ( CCITTFaxDecode ) 和
  • JPEG2000 (JPXDecode)。

无论如何,嵌入 PDF 中的所有其他图像基本上都是纯光栅数据( PPMPGM ),并且它们的 PDF 内部压缩是可用于一般流的其他标准压缩方法之一压缩:

  • /FlateDecode (ZIP/Deflate 算法),
  • /LZWDecode (Lempel-Ziv-Welch 算法)和
  • /RunLengthDecode .

更新

抱歉,我现在才有时间查看您链接的示例 PDF。

正如 @mkl 在他的评论中所写,看起来像图像的并不总是 PDF 技术用语中的图像。例如,在 PDF 的第 7 页上有一个(著名的)虎头。它完全由向量元素组成,这些向量元素内联放置在页面的 /Contents 中。溪流。 所描绘的棋盘也是如此。

我相信老虎图像是在几十年前刚刚发布时借助某些矢量图形程序(Adobe Illustator?)设计的,并导出为 EPS。在某些情况下,PDF 查看器现在可以从其他内容中识别内联向量元素(可能是简单的水平线)。除非这些向量元素被“分组”到 XObject 中(pdfimages 也无法提取,但这将有助于手动隔离和提取...)

我知道的任何工具(免费开源软件,或免费的闭源软件)都无法自动提取这些向量元素。

PDF 术语中的“真实”图像是像素数据的矩形。这些是唯一可以通过 pdfimages 等工具提取的图像类型。 .

关于ruby - 无法从特定 PDF 中提取文本和图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30345709/

相关文章:

c# - 我的 PDF 语法坏了!如何将图像放入PDF?

javascript - HTML5 下载网站为 PDF

android - adb "geo fix"命令到Android真机?

java - 将多个二进制文件复制到一个二进制文件

ruby-on-rails - 将 Ruby on Rails 4 应用程序与 Phonegap 集成以构建原生 iOS 应用程序

pdf - 想要自定义或更改受密码保护的 PDF 中密码提示中显示的消息

ruby-on-rails - 批量导入数据有没有比ActiveRecord更好的解决方案?

command-line - 将 Chrome 与命令行工具集成

ruby - Rubymine 8.0.3 中的调试器不工作

ruby-on-rails - 如何通过关系访问 has_many 的表单数据?