从给定坐标提取 PDF 文本

发布于 2024-11-10 08:51:57 字数 62 浏览 9 评论 0 原文

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

有人可以帮我吗?

I would like to extract text from a portion (using coordinates) of PDF using Ghostscript.

Can anyone help me out?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

丑疤怪 2024-11-17 08:51:57

是的,使用 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 的 < code>ps2ascii.ps PostScript 实用程序(更好)

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

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

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

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

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

第三: XPDF 的 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(第一页)到 17(最后一页),保留双密码的布局受保护的命名 PDF 文件(使用用户和所有者密码 secretsupersecret),采用 Unix EOL 约定,但不在 PDF 页面之间插入分页符,通过 less...

pdf转文本-h 显示所有可用的命令行选项。

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


pdftotext 更新:

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

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

如果与 -layout 参数一起使用,则效果最佳。


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

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

mutool draw -F txt the.pdf

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

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

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

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

根据我的经验,虽然它不支持您可以想象的最直接的 CLI 界面:在您习惯了它,它会做它承诺做的事情,对于您向它扔的大多数 PDF...


而且还有更多选项:

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

Yes, with Ghostscript, you can extract text from PDFs. But no, it is not the best tool for the job. And no, you cannot do it in "portions" (parts of single pages). What you can do: extract the text of a certain range of pages only.

First: Ghostscript's txtwrite output device (not so good)

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

This will output all text contained on pages 3-5 to stdout. If you want output to a text file, use

   -sOutputFile=textfilename.txt

gs Update:

Recent versions of Ghostscript have seen major improvements in the txtwrite device and bug fixes. See recent Ghostscript changelogs (search for txtwrite on that page) for details.


Second: Ghostscript's ps2ascii.ps PostScript utility (better)

This one requires you to download the latest version of the file ps2ascii.ps from the Ghostscript Git source code repository. You'd have to convert your PDF to PostScript, then run this command on the PS file:

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

If the -dSIMPLE parameter is not defined, each output line contains some additional info beyond the pure text content about fonts and fontsize used.

If you replace that parameter by -dCOMPLEX, you'll get additional infos about colors and images used.

Read the comments inside the ps2ascii.ps to learn more about this utility. It's not comfortable to use, but for me it worked in most cases I needed it....

Third: XPDF's pdftotext CLI utility (more comfortable than Ghostscript)

A more comfortable way to do text extraction: use pdftotext (available for Windows as well as Linux/Unix or Mac OS X). This utility is based either on Poppler or on XPDF. This is a command you could try:

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

This will display the page range 13 (first page) to 17 (last page), preserve the layout of a double-password protected named PDF file (using user and owner passwords secret and supersecret), with Unix EOL convention, but without inserting pagebreaks between PDF pages, piped through less...

pdftotext -h displays all available commandline options.

Of course, both tools only work for the text parts of PDFs (if they have any). Oh, and mathematical formula also won't work too well... ;-)


pdftotext Update:

Recent versions of Poppler's pdftotext have now options to extract "a portion (using coordinates) of PDF" pages, like the OP asked for. The parameters are:

  • -x <int> : top left corner's x-coordinate of crop area
  • -y <int> : top left corner's y-coordinate of crop area
  • -W <int> : crop area's width in pixels (defaults to 0)
  • -H <int> : crop area's height in pixels (defaults to 0)

Best, if used with the -layout parameter.


Fourth: MuPDF's mutool draw command can also extract text

The cross-platform, open source MuPDF application (made by the same company that also develops Ghostscript) has bundled a command line tool, mutool. To extract text from a PDF with this tool, use:

mutool draw -F txt the.pdf

will emit the extracted text to <stdout>. Use -o filename.txt to write it into a file.

Fifth: PDFLib's Text Extraction Toolkit (TET) (best of all... but it is PayWare)

TET, the Text Extraction Toolkit from the pdflib family of products can find the x-y-coordinate of text content in a PDF file (and much more). TET has a commandline interface, and it's the most powerful of all text extraction tools I'm aware of. (It can even handle ligatures...) Quote from their website:

Geometry
TET provides precise metrics for the text, such as the position on the page, glyph widths, and text direction. Specific areas on the page can be excluded or included in the text extraction, e.g. to ignore headers and footers or margins.

In my experience, while it's does not sport the most straight-forward CLI interface you can imagine: after you got used to it, it will do what it promises to do, for most PDFs you throw towards it...


And there are even more options:

  1. podofotxtextract (CLI tool) from the PoDoFo project (Open Source)
  2. calibre (normally a GUI program to handle eBooks, Open Source) has a commandline option that can extract text from PDFs
  3. AbiWord (a GUI word processor, Open Source) can import PDFs and save its files as .txt: abiword --to=txt --to-name=output.txt input.pdf
只想待在家 2024-11-17 08:51:57

我不确定 GhostScript 是否可以接受坐标,但您可以将 PDF 转换为图像并将其作为从给定坐标裁剪的子图像或作为整个图像连同坐标发送到 OCR 引擎。某些 OCR API 接受矩形参数来缩小 OCR 区域。

查看 VietOCR 的工作示例,该示例使用 Tesseract 作为 OCR 引擎,GhostScript 作为 PDF 到图像转换器。

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.

〗斷ホ乔殘χμё〖 2024-11-17 08:51:57

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

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

然后是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 也可以仅返回位于该区域的文本或位于该区域的文本以及信息关于文本的字体,例如名称、颜色和大小。

Debenu Quick PDF Library can extract text from a defined area on a page. The SetTextExtractionArea function lets you specify the x and y coordinates and then you can also specify the width and height of the area.

  • Left = The horizontal coordinate of the left edge of the area
  • Top = The vertical coordinate of the top edge of the area
  • Width = The width of the area
  • Height = The height of the area

Then the GetPageText function can be called immediately after this to extract the text from that defined area.

Here's an example using C# (though the library is multi-platform and can be used with many different programming languages):

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);

Using GetPageText it is also possible to return just the text located in that area or the text located in that area as well as information about the text's font such as name, color and size.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文