【问题标题】:How to find figure captions in a PDF?如何在 PDF 中查找图形标题?
【发布时间】:2019-11-29 09:14:36
【问题描述】:

我想开发一个 Python 脚本,它可以在 PDF 中找到所有图形标题。我想知道是否可以在搜索新的图形标题时收集所有图形标题并将它们附加到一个数组中。

我尝试搜索“Figure”这个词,然后抓取其中存在的整个句子,但效率不高,因为它不会找到标题中的所有句子,而是只找到句子用句号隔开。

编辑 以下是我打算使用的示例 PDF。如您所见,单词 Fig.1 写在图像的正下方。

新编辑 这是使用 pdf2htmlEX 转换的完整 HTML 文件: https://drive.google.com/open?id=1hYriVrTlwmxR35A2Jy7mKoO4ns2oWe3Z

【问题讨论】:

  • 你好,伊山。能否请您链接到示例 pdf,或者如果无法发布图形标题和周围文本的示例。到目前为止,您所拥有的代码示例也会有所帮助。
  • @Researcher 您好,我已经用示例 PDF 更新了帖子。我还没有任何示例代码,因为我不知道解决这个问题的正确方法。
  • 您可以尝试使用下面的 pypdf2 运行文本提取吗?有时这不起作用,但希望您对您的 pdf 感到幸运。完成此操作后,发布您获得的内容,搜索标题和其余文本之间的分隔符可能不会太难。
  • 如果这不起作用,接下来我会尝试将其转换为 html 并使用 beautifulsoup4 来查找字幕。
  • @Researcher 是的,我过去使用过 PyPDF2,但提取所有文本的问题是它找不到仅与图形标题相关的单词“Figure”。例如,“figure”也可以写在 PDF 中的其他地方,因此简单地搜索“figure”这个词并不是很理想。此外,PDF 阅读器会返回所有文本,但在间距、格式方面存在错误,并且某些单词是字节缓冲区。

标签: python python-3.x pdf figure


【解决方案1】:

此答案不完整,将在我们解决问题时更新它。

原始 PDF 副本:

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC335638/pdf/pnas00677-0355.pdf

第 1 步 - 尝试 pypdf

# importing required modules 
import PyPDF2 

# creating a pdf file object 
pdfFileObj = open('example.pdf', 'rb') 

# creating a pdf reader object 
pdfReader = PyPDF2.PdfFileReader(pdfFileObj) 

# printing number of pages in pdf file 
print(pdfReader.numPages) 

# creating a page object 
pageObj = pdfReader.getPage(0) 

# extracting text from page 
print(pageObj.extractText()) 

# closing the pdf file object 
pdfFileObj.close() 

这不合适,因为连单词都没有用空格隔开。

第 2 步 - 尝试 pdf2htmlEX

建议我们尝试将https://github.com/coolwanglu/pdf2htmlEX 转换为html,然后开发适当的选择器以与beautifulsoup4 一起使用。

pdf2htmlex 生成的 html 中每个单词都被标签包围,对我们毫无帮助。

第 3 步 - 尝试 pdfminer.six

https://github.com/pdfminer/pdfminer.six

这要好得多,但仍然不完美:

小脑控制运动的电路

约翰·C·埃克利斯著

AMA/ERF 生物医学研究所,芝加哥

1967 年 5 月 16 日发布

神经解剖学家普遍认为小脑提供 我们最初努力辨别功能的最大挑战 神经元模式中的意义,因为有一个刻板的和简单的 它的几何排列大概是因为这个原因 有独特的神经元成分。最精炼的知识 中枢神经系统中可用的微结构。这 近期对 Ram6n y Cajall 的开拓性调查导致 关于微观结构、几何学的令人着迷的发展 安排和数值评估。2

如图 1,3 所示,只有两种传入纤维 向小脑、攀爬纤维 (cf) 和 苔藓纤维 (mf);并且只有一种类型的传出纤维 来自小脑的浦肯野细胞 (Pc) 的轴突, 终止于小脑核(cn),否则主要在 代特氏核。攀爬纤维独特地分布在 单身

图。 1.-用Fox3绘制的一片叶子的透视图 小脑皮层。校长

组件以图表形式显示,并在 文本。

336

音量。 58, 1967

生理学:J.C. ECCLES

337

然后我们可以在输出上运行这段代码:

import re

# Read In Text
fileName = "sample.txt"
pdfTextfile = open(fileName, "r")
pdfText = pdfTextfile.read()

# Split text into blocks separated by double line break.
blocks = pdfText.split("\n\n")

# Remove all new lines within blocks to remove arbitary line breaks
blocks = map(lambda x : x.replace("\n", ""), blocks)

# Which blocks are figure captions?
captions = []
for block in blocks:
    if re.search('^fig', block, re.IGNORECASE):
        captions.append(block)

# Done!
for caption in captions:
    print(caption)
    print()

这可能需要更多的调整,因为 pdfminer.six 的输出不是很完美。

第 4 步 - 尝试 Tesseract

我很想知道在这种情况下 OCR 会有多好。首先将pdf转换为图像。然后安装以下内容:

sudo apt install tesseract-ocr
pip install pyocr

此代码将对图像执行 OCR。

from PIL import Image
import sys

import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)

tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))

langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang = langs[0]
print("Will use lang '%s'" % (lang))

imageFile = "page_1.jpg"

txt = tool.image_to_string(
    Image.open(imageFile),
    lang=lang,
    builder=pyocr.builders.TextBuilder()
)
open("page_1.txt","w").write(txt)

这会产生更好的文本块,但有一些拼写错误:

小脑控制运动的电路

由 Joun C. Eccuss 撰写

AMA/ERF 生物医学研究所,芝加哥

1967 年 5 月 16 日发布

神经解剖学家普遍认为小脑提供 我们最初努力辨别功能的最大挑战 神经元模式中的意义,因为有一个刻板的和简单的 其独特的神经元成分的几何排列。 想必也正因如此,才有了最精致的 中枢神经中可用的微观结构知识 系统。 Ram6n y Cajal 的先驱调查!已经导致 最近关于微观结构的迷人发展, 几何排列和数值评估。”

如图1所示,*只有两种传入纤维 向小脑、攀爬纤维 (cf) 和 苔藓纤维 (m/f);并且只有一种类型的传出纤维 来自小脑的浦肯野细胞 (Pc) 的轴突, 终止于小脑核(en),否则主要终止于 代特氏核。攀爬纤维独特地分布在 单身

小说。 1.——福克斯的透视图?叶子的一部分 小脑皮层。主要组成部分以图表形式显示 形式,并在正文中描述。

336

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多