我必须将PDF页面中的文本从缩进中提取到CSV文件中。
PDF教科书的索引页面:
我应该将文本拆分为类和子类类型层次结构以及页码。例如,在图像中, 应用程序服务器 是该类, Apache Tomcat 是页码 275
这是CSV的预期输出:
我使用过Tika解析器来解析PDF,但是在解析的内容中没有正确维护缩进(不是唯一的),以便将文本拆分为类和子类。
这是解析文本的样子:
有人能建议我采用这种方法的正确方法吗?
答案 0 :(得分:4)
尽管我不了解pdf提取,但是可以从“已解析的文本”中重建层次结构,因为“子类”部分始终以额外的换行符开头和结尾。
带有以下测试文本:
Ftp.outboundGateway
以下代码:
AbstractRemoteFileOutboundGateway.Command.GET
产量:
app architect . 50
app logic . 357
app server . 275
tomcat . 275
websphere . 275
jboss . 164
architect
acceptance . 303
development path . 304
architecting . 48
architectural activity . 25, 320
希望这会有所帮助。
答案 1 :(得分:2)
这是解决方案:
代码:
import fitz
import json
import re
import csv
class MyClass:
def __init__(self, text, main_class):
my_arr = re.split("[.]*", text)
if main_class != my_arr[0].strip():
main_class = my_arr[0].strip()
self.main_class = main_class
self.sub_class = my_arr[0].strip()
try:
self.page = my_arr[1].strip()
except:
self.page = ""
def add_line(text, is_recording, main_class):
if(is_recording):
obj = MyClass(text, main_class)
if obj.sub_class == "Glossary":
return False, main_class
table.append(obj)
return True, obj.main_class
elif text == "Contents":
return True, main_class
return False, main_class
last_text = ""
is_recording = False
main_class = ""
table = []
doc = fitz.open("TCS_1.pdf")
page = doc.getPageText(2, output="json")
blocks = json.loads(page)["blocks"]
for block in blocks:
if "lines" in block:
for line in block["lines"]:
line_text = ""
for span in block["lines"]:
line_text += span["spans"][0]["text"].encode("utf-8")
if last_text != line_text:
is_recording, main_class = add_line(line_text, is_recording, main_class)
last_text = line_text
writer = csv.writer(open("output.csv", 'w'), delimiter=',', lineterminator='\n')
for my_class in table:
writer.writerow([my_class.main_class, my_class.sub_class, my_class.page])
# print(my_class.main_class, my_class.sub_class, my_class.page)