我怎样才能 pdfgrep 一个 pdf 以便只显示粗体匹配项?
How can I pdfgrep a pdf so that only bold matches are shown?
我正在尝试列出 pdf 中出现的所有粗体字符串及其页码。但是我不想列出那些不是粗体的地方。
到目前为止我有:
pdfgrep -n -o "String" Input.pdf
但我不知道如何捕捉大胆的一面...
Link转pdf:https://ilarisblog.files.wordpress.com/2021/07/ilaris.pdf(直接下载,不是我的网站)
如果幸运的话,在极少数情况下,您可能会说第 x 页使用 CID Bold & Normal 之类的字体,例如它们可能是不同的字体或粗细,举一个例子,它是人为设计的,所以并不少见, 但说明了几点。
所以有命令行工具可以深入研究字体和文本并提供详细信息
name type emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
CIDFont+F1 CID TrueType yes no yes 11 0
[List All Fonts], The number of fonts in this PDF file is: 1
CIDFont+F1 CID TrueType yes no yes 11 0
line:
word: x=42.48..51.65 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: '1.'
word: x=54.78..97.35 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'Surgical'
word: x=100.55..133.15 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'rooms'
word: x=136.37..158.21 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'and'
word: x=161.46..203.55 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'services'
word: x=206.77..212.91 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: '–'
word: x=217.78..229.70 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'To'
word: x=232.69..272.34 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'include'
word: x=275.41..316.39 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'surgical'
word: x=319.33..347.75 y=103.29..121.01 base=115.32 fontSize=11.04 space=0: 'suites'
line: x=42.48..347.75 y=103.29..121.01 base=115.32 '1. Surgical rooms and services – To include surgical suites'
然而 none 显示行中途的差异。
这里只有一种字体(F1),所有文字都是一个流,分为3部分。
所以仔细观察我们可以在第二行看到左边看起来较粗的字形有 1 磅厚(但该行的其余部分也是如此)使用完全相同的字体 字体名称自始至终都是 CID+F1,我本可以让它使用另一个名称,但关键是该行的一半都不是“粗体”。那 1 点边框宽度怎么样,我可以测试一下吗?不,第 2 行的两半都是 1 点边框宽度,区别在于较暗的一半比右半部分更不透明(描边不透明度为 100%),所以看起来更厚。如果不使用 PDF 库来分解整个字体结构及其应用程序,您就无法在外部进行 grep。
我并不是说您不能使用提取工具将文本提取为“BOLDER”和“不太粗体”或报告某些文本的名称中包含粗体,但纯文本流有什么用, 那就是说有些字母可能是粗体有些字母可能不是,你可以从图像提取中看到。
您将需要一个库来分析可以说明粗体文本的各种方式,然后将其与纯文本 grepper 一起使用。
[稍后编辑]
您提供了一个复杂的示例,其中肯定使用许多不同的名称定义了字体,例如 MinionPro-Bold,所以有一些希望,但是样式应用于每个页码,因此我们可以说每个页面(即使是空白的也有 BOLD :-) 所以如何提取该页码和任何其他文本,在 SO 上提供了许多示例,大多数使用 Python 混合结果(通常是 PDFMiner),但我不会使用除非你很了解它。
一些提取器的报告很可能相互矛盾,因为“正文”的主要块报告总体上它们是粗体容器,即使大多数内部文本不是,所以可能需要二次划分成子组,也许丢弃分类为 MinionPro-Regular 并保持 Aniron-Bold-SC700.
那么最佳答案是什么
好吧,你需要一种格式,其中字体的内联更改是常态,例如 XML 或 HTML 并且可以在转换为 FB2 或 ePub 时找到这些格式,所以我的第一个方法是尝试转换为 ePub 并提取 HTML 页面以 grep 那些,并且有许多方法可以命令行转换 PDF 2 ePuB 或 HTML.
我正在尝试列出 pdf 中出现的所有粗体字符串及其页码。但是我不想列出那些不是粗体的地方。
到目前为止我有:
pdfgrep -n -o "String" Input.pdf
但我不知道如何捕捉大胆的一面...
Link转pdf:https://ilarisblog.files.wordpress.com/2021/07/ilaris.pdf(直接下载,不是我的网站)
如果幸运的话,在极少数情况下,您可能会说第 x 页使用 CID Bold & Normal 之类的字体,例如它们可能是不同的字体或粗细,举一个例子,它是人为设计的,所以并不少见, 但说明了几点。
所以有命令行工具可以深入研究字体和文本并提供详细信息
name type emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
CIDFont+F1 CID TrueType yes no yes 11 0
[List All Fonts], The number of fonts in this PDF file is: 1
CIDFont+F1 CID TrueType yes no yes 11 0
line:
word: x=42.48..51.65 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: '1.'
word: x=54.78..97.35 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'Surgical'
word: x=100.55..133.15 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'rooms'
word: x=136.37..158.21 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'and'
word: x=161.46..203.55 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'services'
word: x=206.77..212.91 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: '–'
word: x=217.78..229.70 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'To'
word: x=232.69..272.34 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'include'
word: x=275.41..316.39 y=103.29..121.01 base=115.32 fontSize=11.04 space=1: 'surgical'
word: x=319.33..347.75 y=103.29..121.01 base=115.32 fontSize=11.04 space=0: 'suites'
line: x=42.48..347.75 y=103.29..121.01 base=115.32 '1. Surgical rooms and services – To include surgical suites'
然而 none 显示行中途的差异。
这里只有一种字体(F1),所有文字都是一个流,分为3部分。
所以仔细观察我们可以在第二行看到左边看起来较粗的字形有 1 磅厚(但该行的其余部分也是如此)使用完全相同的字体 字体名称自始至终都是 CID+F1,我本可以让它使用另一个名称,但关键是该行的一半都不是“粗体”。那 1 点边框宽度怎么样,我可以测试一下吗?不,第 2 行的两半都是 1 点边框宽度,区别在于较暗的一半比右半部分更不透明(描边不透明度为 100%),所以看起来更厚。如果不使用 PDF 库来分解整个字体结构及其应用程序,您就无法在外部进行 grep。
我并不是说您不能使用提取工具将文本提取为“BOLDER”和“不太粗体”或报告某些文本的名称中包含粗体,但纯文本流有什么用, 那就是说有些字母可能是粗体有些字母可能不是,你可以从图像提取中看到。
您将需要一个库来分析可以说明粗体文本的各种方式,然后将其与纯文本 grepper 一起使用。
[稍后编辑]
您提供了一个复杂的示例,其中肯定使用许多不同的名称定义了字体,例如 MinionPro-Bold,所以有一些希望,但是样式应用于每个页码,因此我们可以说每个页面(即使是空白的也有 BOLD :-) 所以如何提取该页码和任何其他文本,在 SO 上提供了许多示例,大多数使用 Python 混合结果(通常是 PDFMiner),但我不会使用除非你很了解它。
一些提取器的报告很可能相互矛盾,因为“正文”的主要块报告总体上它们是粗体容器,即使大多数内部文本不是,所以可能需要二次划分成子组,也许丢弃分类为 MinionPro-Regular 并保持 Aniron-Bold-SC700.
那么最佳答案是什么
好吧,你需要一种格式,其中字体的内联更改是常态,例如 XML 或 HTML 并且可以在转换为 FB2 或 ePub 时找到这些格式,所以我的第一个方法是尝试转换为 ePub 并提取 HTML 页面以 grep 那些,并且有许多方法可以命令行转换 PDF 2 ePuB 或 HTML.