45

我想使用 Ghostscript 从 PDF 的一部分(使用坐标)中提取文本。

谁能帮我吗?

4

3 回答 3

106

是的,使用 Ghostscript,您可以从 PDF 中提取文本。但不,它不是这项工作的最佳工具。不,你不能在“部分”(单页的一部分)中做到这一点。您可以做什么:仅提取特定范围页面的文本。

第一:Ghostscript的 txtwrite输出设备(不太好)

 gs \
   -dBATCH \
   -dNOPAUSE \
   -sDEVICE=txtwrite \
   -dFirstPage=3 \
   -dLastPage=5 \
   -sOutputFile=- \
   /path/to/your/pdf

这会将第 3-5 页中包含的所有文本输出到标准输出。如果要输出到文本文件,请使用

   -sOutputFile=textfilename.txt

gs更新:

Ghostscript 的最新版本在txtwrite设备和错误修复方面取得了重大改进。有关详细信息,请参阅最近的 Ghostscript 更改日志(在该页面上搜索txtwrite)。


二:Ghostscript 的ps2ascii.psPostScript 实用程序(更好)

这需要您从Ghostscript Git 源代码存储库下载文件ps2ascii.ps的最新版本。您必须将 PDF 转换为 PostScript,然后在 PS 文件上运行此命令:

gs \
  -q \
  -dNODISPLAY \
  -P- \
  -dSAFER \
  -dDELAYBIND \
  -dWRITESYSTEMDICT \
  -dSIMPLE \
   /path/to/ps2ascii.ps \
   input.ps \
  -c quit

如果-dSIMPLE未定义该参数,则每个输出行都包含一些关于所使用字体和字体大小的纯文本内容之外的附加信息。

如果将该参数替换为-dCOMPLEX,您将获得有关使用的颜色和图像的其他信息。

阅读ps2ascii.ps中的注释以了解有关此实用程序的更多信息。它使用起来不舒服,但对我来说,它在大多数情况下都有效,我需要它......

第三:XPDF 的 pdftotextCLI 实用程序(比 Ghostscript 更舒服)

一种更舒适的文本提取方式:使用pdftotext(适用于 Windows 以及 Linux/Unix 或 Mac OS X)。该实用程序基于 Poppler 或 XPDF。这是您可以尝试的命令:

 pdftotext \
   -f 13 \
   -l 17 \
   -layout \
   -opw supersecret \
   -upw secret \
   -eol unix \
   -nopgbrk \
   /path/to/your/pdf
   - |less

这将显示页面范围 13(第一页)到 17(最后一页),保留受双密码保护的命名 PDF 文件的布局(使用用户和所有者密码secret 和 supersecret 使用Unix EOL 约定,但没有在 PDF 页面之间插入分页符,通过更少的管道...

pdftotext -h显示所有可用的命令行选项。

当然,这两种工具都只适用于 PDF 的文本部分(如果有的话)。哦,数学公式也不会很好用...... ;-)


pdftotext更新:

Poppler 的最新版本pdftotext现在可以选择提取“PDF 的一部分(使用坐标)”页面,就像 OP 要求的那样。参数是:

  • -x <int>: 裁剪区域左上角的 x 坐标
  • -y <int>: 裁剪区域左上角的 y 坐标
  • -W <int>: 裁剪区域的像素宽度(默认为 0)
  • -H <int>: 裁剪区域的像素高度(默认为 0)

最好,如果与-layout参数一起使用。


第四:MuPDF的mutool draw命令也可以提取文本

跨平台的开源MuPDF应用程序(由开发 Ghostscript 的同一家公司开发)捆绑了一个命令行工具mutool. 要使用此工具从 PDF 中提取文本,请使用:

mutool draw -F txt the.pdf

将提取的文本发送到<stdout>. 用于-o filename.txt将其写入文件。

第五:PDFLib 的文本提取工具包 (TET)(最好的……但它是 PayWare)

TET是pdflib系列产品中的文本提取工具包,可以在 PDF 文件(以及更多)中找到文本内容的 xy 坐标。TET 有一个命令行界面,它是我所知道的所有文本提取工具中功能最强大的。(它甚至可以处理连字......)从他们的网站引用:

几何
TET 为文本提供精确的度量,例如页面上的位置、字形宽度和文本方向。页面上的特定区域可以被排除或包含在文本提取中,例如忽略页眉和页脚或页边距。

以我的经验,虽然它没有你能想象到的最直接的 CLI 界面:在你习惯它之后,它会做它承诺做的事情,对于你扔给它的大多数 PDF...


还有更多选择:

  1. podofotxtextract(CLI 工具)来自 PoDoFo 项目(开源)
  2. calibre(通常是处理电子书的 GUI 程序,开源)有一个命令行选项,可以从 PDF 中提取文本
  3. AbiWord(一个 GUI 文字处理器,开源)可以导入 PDF 并将其文件保存为 .txt:abiword --to=txt --to-name=output.txt input.pdf
于 2011-05-31T14:55:18.733 回答
1

I'm not sure GhostScript can accept coordinates, but you can convert the PDF to a image and send it to an OCR engine either as a subimage cropped from the given coordinates or as the whole image along with the coordinates. Some OCR API accepts a rectangle parameter to narrow the region for OCR.

Look at VietOCR for a working example, which uses Tesseract as its OCR engine and GhostScript as PDF-to-image converter.

于 2011-09-03T15:34:56.813 回答
1

Debenu Quick PDF Library可以从页面上的定义区域提取文本。SetTextExtractionArea函数允许您指定 x 和 y 坐标,然后您还可以指定区域的宽度和高度。

  • Left = 区域左边缘的水平坐标
  • Top = 区域上边缘的垂直坐标
  • 宽度= 区域的宽度
  • 高度= 区域的高度

然后可以在此之后立即调用GetPageText函数以从该定义区域中提取文本。

这是一个使用 C# 的示例(尽管该库是多平台的,可以与许多不同的编程语言一起使用):

DPL.LoadFromFile(@"Sample.pdf", "");
DPL.SetOrigin(1); // Sets 0,0 coordinate position to top left of page, default is bottom left
DPL.SetTextExtractionArea(35, 35, 229, 30); // Left, Top, Width, Height
string ExtractedContent = DPL.GetPageText(8);
Console.WriteLine(ExtractedContent);

使用 GetPageText 也可以只返回位于该区域的文本或位于该区域的文本以及有关文本字体的信息,例如名称、颜色和大小。

于 2015-08-05T13:51:57.813 回答