【发布时间】:2011-09-05 10:43:03
【问题描述】:
我想使用 Ghostscript 从 PDF 的一部分(使用坐标)中提取文本。
谁能帮帮我?
【问题讨论】:
-
在坐标上你会遇到很多麻烦。这需要找到文档中的每个文本单元格,计算字符串宽度和换行,然后计算裁剪窗口并决定包含/排除。然后是视觉排序的任务。很难。
标签: pdf ghostscript text-extraction
我想使用 Ghostscript 从 PDF 的一部分(使用坐标)中提取文本。
谁能帮帮我?
【问题讨论】:
标签: pdf ghostscript text-extraction
是的,使用 Ghostscript,您可以从 PDF 中提取文本。但不,它不是这项工作的最佳工具。不,你不能在“部分”(单页的一部分)中做到这一点。你可以做什么:只提取一定范围的页面的文本。
txtwrite输出设备(不太好) gs \
-dBATCH \
-dNOPAUSE \
-sDEVICE=txtwrite \
-dFirstPage=3 \
-dLastPage=5 \
-sOutputFile=- \
/path/to/your/pdf
这会将第 3-5 页中包含的所有文本输出到标准输出。如果要输出到文本文件,请使用
-sOutputFile=textfilename.txt
gs更新:
最新版本的 Ghostscript 在 txtwrite 设备和错误修复方面进行了重大改进。有关详细信息,请参阅recent Ghostscript changelogs(在该页面上搜索 txtwrite)。
ps2ascii.ps PostScript utility(更好)这需要您从Ghostscript Git source code repository 下载最新版本的文件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 中的 cmets 以了解有关此实用程序的更多信息。它使用起来不舒服,但对我来说,它在大多数情况下都有效,我需要它....
pdftotext CLI 实用程序(比 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(f第一页)到 17(l最后一页),保留受双密码保护的命名 PDF 文件的布局(使用用户和所有者密码 secret 和 supersecret),使用 Unix EOL 约定,但没有在 PDF 页面之间插入分页符,通过 less...
pdftotext -h 显示所有可用的命令行选项。
当然,这两种工具都只适用于 PDF 的文本部分(如果有的话)。哦,数学公式也不会很好用...... ;-)
pdftotext 更新:
Poppler 的pdftotext 的最新版本现在可以选择提取“PDF 的一部分(使用坐标)” 页面,就像 OP 要求的那样。参数为:
-x <int> : 裁剪区域左上角x坐标-y <int> : 裁剪区域左上角的y坐标-W <int> :裁剪区域的宽度(以像素为单位)(默认为 0)-H <int> :裁剪区域的高度(以像素为单位)(默认为 0)最好,如果与-layout 参数一起使用。
mutool draw命令也可以提取文本跨平台、开源的MuPDF 应用程序(由开发Ghostscript 的同一家公司开发)捆绑了一个命令行工具mutool。要使用此工具从 PDF 中提取文本,请使用:
mutool draw -F txt the.pdf
会将提取的文本发送到<stdout>。使用-o filename.txt 将其写入文件。
TET,来自pdflib 系列产品的文本提取工具包可以在 PDF 文件(以及更多)中找到文本内容的 x-y 坐标。 TET 有一个命令行界面,它是我所知道的所有文本提取工具中功能最强大的。 (它甚至可以处理连字...)引自他们的网站:
几何
TET 为文本提供精确的度量,例如页面上的位置、字形宽度和文本方向。页面上的特定区域可以被排除或包含在文本提取中,例如忽略页眉和页脚或边距。
根据我的经验,虽然它没有你能想象到的最直接的 CLI 界面:在你习惯它之后,它会做它承诺做的事情,对于你扔给它的大多数 PDF...
还有更多选择:
podofotxtextract(CLI 工具)来自 PoDoFo 项目(开源)calibre(通常是处理电子书的 GUI 程序,开源)有一个命令行选项,可以从 PDF 中提取文本AbiWord(GUI 文字处理器,开源)可以导入 PDF 并将其文件另存为 .txt:abiword --to=txt --to-name=output.txt input.pdf
【讨论】:
txtwrite 设备增加了一个新特性(当前 GS 版本为 9.06):您可以添加为参数-dTextFormat=0 | 1 | 2 | 3(默认为 3)。有关详细信息,请参阅respective Ghostscript documentation。我只知道这些,但我还没有对它们进行深入测试,所以我还没有(还) 将这两个选项与当前的 GS 版本进行比较有更新的个人意见...
[ghostscript] + [pdf],我会尽力回答。还请说明您的请求的目的是什么。节省文件大小?删除图像中包含的信息?还是?
Debenu Quick PDF Library 可以从页面上的定义区域提取文本。 SetTextExtractionArea 函数可让您指定 x 和 y 坐标,然后您还可以指定区域的宽度和高度。
然后可以在此之后立即调用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 也可以只返回位于该区域的文本或位于该区域的文本以及有关文本字体的信息,例如名称、颜色和大小。
【讨论】: