从给定坐标提取 PDF 文本
Posted
技术标签:
【中文标题】从给定坐标提取 PDF 文本【英文标题】:PDF text extraction from given coordinates 【发布时间】:2011-09-05 10:43:03 【问题描述】:我想使用 Ghostscript 从 PDF 的一部分(使用坐标)中提取文本。
谁能帮帮我?
【问题讨论】:
在坐标上你会遇到很多麻烦。这需要找到文档中的每个文本单元格,计算字符串宽度和换行,然后计算裁剪窗口并决定包含/排除。然后是视觉排序的任务。很难。 【参考方案1】:是的,使用 Ghostscript,您可以从 PDF 中提取文本。但不,它不是这项工作的最佳工具。不,你不能在“部分”(单页的一部分)中做到这一点。你可以做什么:只提取一定范围的页面的文本。
第一:Ghostscript'stxtwrite
输出设备(不太好)
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)。
二:Ghostscript的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 以了解有关此实用程序的更多信息。它使用起来不舒服,但对我来说,它在大多数情况下都有效,我需要它....
第三:XPDF'spdftotext
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
参数一起使用。
第四:MuPDF的mutool draw
命令也可以提取文本
跨平台、开源的MuPDF 应用程序(由开发Ghostscript 的同一家公司开发)捆绑了一个命令行工具mutool
。要使用此工具从 PDF 中提取文本,请使用:
mutool draw -F txt the.pdf
会将提取的文本发送到<stdout>
。使用-o filename.txt
将其写入文件。
第五个:PDFLib 的文本提取工具包 (TET)(最好的……但它是 PayWare)
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设备需要哪个版本的ghostscript? 第一个选项“不太好”和第二个选项“更好”在什么方面? @musiphil:在撰写上述内容时,第二个选项可以更好地控制输出。同时,txtwrite
设备增加了一个新特性(当前 GS 版本为 9.06):您可以添加为参数-dTextFormat=0 | 1 | 2 | 3
(默认为 3)。有关详细信息,请参阅respective Ghostscript documentation。我只知道这些,但我还没有对它们进行深入测试,所以我还没有(还) 将这两个选项与当前的 GS 版本进行比较有更新的个人意见...
您好,我想从 pdf 中删除/删除所有图像,以便 pdf 仅包含文本。可能吗?请评论。谢谢
@codin:评论不是为了讨论一个全新的话题。请提出一个新问题,将其标记为[ghostscript]
+ [pdf]
,我会尽力回答。还请说明您的请求的目的是什么。节省文件大小?删除图像中包含的信息?还是?【参考方案2】:
我不确定 GhostScript 是否可以接受坐标,但您可以将 PDF 转换为图像并将其作为从给定坐标裁剪的子图像或与坐标一起作为整个图像发送到 OCR 引擎。一些 OCR API 接受一个矩形参数来缩小 OCR 的区域。
查看VietOCR 的工作示例,它使用Tesseract 作为其OCR 引擎,并使用GhostScript 作为PDF 到图像的转换器。
【讨论】:
如果文本作为文本而不是图像存储在 PDF 文件中,这将是一个非常糟糕的主意。【参考方案3】: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 也可以只返回位于该区域的文本或位于该区域的文本以及有关文本字体的信息,例如名称、颜色和大小。
【讨论】:
以上是关于从给定坐标提取 PDF 文本的主要内容,如果未能解决你的问题,请参考以下文章