是python的新手,正在尝试读取PDF文件以提取ID No.
。到目前为止,我已经成功使用pdfplumber
从PDF文件中提取了文本。下面是代码块:
import pdfplumber
with pdfplumber.open('ABC.pdf') as pdf_file:
firstpage = pdf_file.pages[0]
raw_text = firstpage.extract_text()
print (raw_text)
以下是文本输出:
Welcome to ABC
01 January, 1991
ID No. : 10101010
Welcome to your ABC portal. Learn
More text here..
Even more text here..
Mr Jane Doe
Jack & Jill Street Learn more about your
www.abc.com
....
....
....
但是,无法找到进一步解析此非结构化文本的最佳方法。期望最终输出仅为ID号,即10101010
。顺便提一句,该脚本将用于相当大量的PDF,因此性能值得关注。
答案 0 :(得分:4)
尝试使用正则表达式:
import pdfplumber
import re
with pdfplumber.open('ABC.pdf') as pdf_file:
firstpage = pdf_file.pages[0]
raw_text = firstpage.extract_text()
m = re.search(r'ID No\. : (\d+)', raw_text)
if m:
print(m.group(1))
当然,您必须遍历所有 PDF的内容-而不仅仅是首页!也要问问自己,每页是否可能有多个匹配项。无论如何:您比我更了解输入的结构(并且我们无权访问示例文件),所以我将其作为练习留给您。
答案 1 :(得分:0)
如果ID号的长度始终相同,我将尝试使用find-function查找它的位置。 position = raw_text.find('ID No. : ')
应该返回ID号中I的位置。position + 9应该是ID的第一位。当数字的长度始终为8时,您可以使用int(raw_text[position+9:position+17]
)
答案 2 :(得分:0)
如果您是Python的新手,并且实际上需要处理大量数据,建议您将Scala作为替代方法。
对于一般的数据处理,尤其是对正则表达式匹配而言,获得结果所需的时间大大减少。
以下是您在Scala中而不是Python的问题的答案:
import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.parser.PdfTextExtractor
val fil = "ABC.pdf"
val textFromPage = (1 until (new PdfReader(fil)).getNumberOfPages).par.map(page => PdfTextExtractor.getTextFromPage(new PdfReader(fil), page)).mkString
val r = "ID No\\. : (\\d+)".r
val res = for (m <- r.findAllMatchIn(textFromPage )) yield m.group(0)
res.foreach(println)