为了机器学习目的(sckit-学习),我需要从很多PDF文件中提取原始文本。首先,我使用xpdf xpdf来完成这个任务:
exe = r'"'+os.path.join(xpdf_path,"pdftotext.exe")+'"'
cmd = exe+" "+"\""+pdf+"\""+" "+"\""+pdf+".txt"+"\""
subprocess.check_output(cmd)
with open(pdf+".txt") as f:
texto_converted = f.read()但不幸的是,对他们中的少数人来说,我无法获得文本,因为他们在他们的pdf源上使用“流”,比如这一个。
结果是这样的:
59!"#$%&'()*+,-.#/#01"21"" 345667.0*(879:4$;<;4=<6>4?$@"12!/ 21#$@A$3A$>@>BCDCEFGCHIJKIJLMNIJILOCNPQRDS QPFTRPUCTCVQWBCTTQXFPYTO"21 "#/!"#(Z[12\&A+],$3^_3;9`Z &a# .2"#.b#"(#c#A(87*95d$d4?$d3e#Z"f#\"#2b?2"#`Z 2"!eb2"#H1TBRgF JhiO
jFK# 2"k#`Z !#212##"elf/e21m#*c!n2!!#/bZ!#2#`Z "eo ]$5<$@;A533> "/\ko/f\#e#e#p我甚至尝试使用zlib + regex:
import re
import zlib
pdf = open("pdfa.pdf", "rb").read()
stream = re.compile(b'.*?FlateDecode.*?stream(.*?)endstream', re.S)
for s in re.findall(stream,pdf):
s = s.strip(b'\r\n')
try:
print(zlib.decompress(s).decode('UTF-8'))
print("")
except:
pass结果是这样的:
1 0 -10 -10 10 10 d1
0.01 0 0 0.01 0 0 cm
1 0 -10 -10 10 10 d1
0.01 0 0 0.01 0 0 cm我甚至尝试了pdftopng (xpdf)之后尝试了tesseract,但没有成功,所以,有没有任何方法从PDF中提取纯文本,比如使用Python或第三方应用程序?
发布于 2020-05-22 07:15:38
如果您想解压缩PDF文件中的流,我可以建议您使用qdpf,但是在这个文件上
qpdf --decrypt --stream-data=uncompress document.pdf out.pdf也无济于事。
我不知道为什么您在xpdf和tesseract方面的工作没有成功,您可以使用image的convert在临时目录和tesseract中创建PNG文件:
import os
from pathlib import Path
from tempfile import TemporaryDirectory
import subprocess
DPI=600
def call(*args):
cmd = [str(x) for x in args]
return subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode('utf-8')
def ocr(docpath, lang):
result = []
abs_path = Path(docpath).expanduser().resolve()
old_dir = os.getcwd()
out = Path('out.txt')
with TemporaryDirectory() as tmpdir:
os.chdir(tmpdir)
call('convert', '-density', DPI, abs_path, 'out.png')
index = -1
while True:
# names have no leading zeros on the digits, would be difficult to sort glob() output
# so just count them
index += 1
png = Path(f'out-{index}.png')
if not png.exists():
break
call('tesseract', '--dpi', DPI, png, out.stem, '-l', lang)
result.append(out.read_text())
os.chdir(old_dir)
return result
pages = ocr('~/Downloads/document.pdf', 'por')
print('\n'.join(pages[1].splitlines()[21:24]))这意味着:
DA NÃO REALIZAÇÃO DE AUDIÊNCIA DE AUTOCOMPOSIÇÃO NO CASO EM CONCRETO
Com vista a obter maior celeridade processual, assim como da impossibilidade de conciliação entre如果您在Windows上,请确保PDF文件不会在不同的进程中打开(比如PDF查看器),因为Windows似乎不喜欢这样做。
最后的print是有限的,因为整个输出是相当大的。
这种转换和OCR-ing需要一段时间,所以您可能需要取消call()中的call()注释,以获得一些进展感。
发布于 2020-05-18 17:50:00
您可以使用两种相当简单的技术。
1)谷歌的"Tessaract“开源OCR (光学字符识别)。您可以均匀地将此应用于所有PDF,尽管将所有数据转换为像素,然后对它们进行神奇的处理,在计算上将更加昂贵。哪个更重要,工程师时间还是CPU时间?有一个青蒿琥酯模块。请注意,此工具适用于图像格式,因此您必须使用类似于GhostScript (另一个开源项目)的工具将所有PDF页面转换为图像,然后在这些图像上运行pytessaract。
2) pyPDF可以获取每个页面,并以编程方式提取任何文本绘制操作,并按其绘制到页面上的顺序进行。这可能与页面的逻辑阅读顺序完全不同.虽然PDF可以绘制所有的‘a’,然后是‘b’‘(等等),但实际上用“字体a”绘制所有东西更有效,然后用“字体b”绘制所有的东西。重要的是要注意,“字体b”可能只是“字体a”的斜体版本。这会产生一个更短、更高效的绘图命令流,尽管这样做可能不是一个好的商业决定。
这里的缺点是,一堆随机的PDF文件可能需要您做一些OCR。一个错误的PDF (一个字体子集没有“到unicode”数据)不能正确挖掘文本,即使它只有文本绘图操作。如果你不知道前五个符号是"g-l-y-p-h",那么从“字体C”画一到五字形并不意味着什么,因为这就是它们的使用顺序。
另一方面,如果您已经有了本地的pdf或者所有的PDFs都来自某个已知的源(例如Word的pdf转换器),那么您将提前知道该期待什么。
请注意,上面提到的唯一实际使用的东西是Ghostscript。我记得它有一个坚实的命令行界面,很多年前我们用它为一些在线PDF查看器生成图像。
https://stackoverflow.com/questions/61839856
复制相似问题