シーン:盗作を防ごう!単語の比較は非常に簡単なので、ここにpdfコンテンツ比較テクノロジーがあります。
1.環境
- win10
- python3.9.6
2.アイデア
pdfから画像jpg、画像からテキスト、比較用のテキスト。
- PDFファイルの各ページを画像に変換します
- 画像がテキストに変換され、テキストが比較され、差分マップが取得されます。
- 生成されたすべての差分画像を1つのPDFファイルにステッチします
3.効果を実現する
使用方法:python diff-pdf.pytest1.pdftest2.pdf
結果は次のとおりです。
4.プログラムの一部
主に使用されるモジュール:pdfminer、ioのStringIO。
4.1PDFを読む
def read_pdf(self, file_name):
rsrcmgr = PDFResourceManager()
laparams = LAParams()
fp = open(file_name, 'rb')
parser = PDFParser(fp)
document = PDFDocument(parser)
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
pages = {
}
for page in PDFPage.create_pages(document):
dictionary = {
}
dictionary['textbox'] = []
dictionary['textline'] = []
interpreter.process_page(page)
layout = device.get_result()
for item in layout:
if isinstance(item, LTTextBox):
dictionary['textbox'].append(item)
for child in item:
if isinstance(child, LTTextLine):
dictionary['textline'].append(child)
pages[layout.pageid] = dictionary
return pages
4.2pdfからテキストへ
def convert_pdf_to_txt(self, path, page_no=-1):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
fp = open(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos = set()
i = 0
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching,
check_extractable=True):
i += 1
if i != page_no:
continue
interpreter.process_page(page)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
return str
4.3pdfの比較
def compare_pdf(self, file1, file2, header_text, x_margin=10, compare_margin=0.2):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
fp = open(file1, 'rb')
parser = PDFParser(fp)
document = PDFDocument(parser)
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
out = StringIO()
layoutmode = 'normal'
scale = 1.3
fontscale = 1
html_coverter = HTMLPrivateConverter(rsrcmgr, out, scale=scale,
layoutmode=layoutmode, laparams=laparams, fontscale=fontscale,
imagewriter=None, header_text=header_text, x_margin=x_margin)
interpreter = PDFPageInterpreter(rsrcmgr, device)
testpages = PDFPage.create_pages(document)
file_dict = self.read_pdf(file2)
for page in testpages:
interpreter.process_page(page)
layout = device.get_result()
html_coverter.page_begin(layout)
if file_dict.get(layout.pageid) == None:
break
compare_page = file_dict[layout.pageid]
for item in layout:
if isinstance(item, LTTextBox):
html_coverter.begin_div('textbox', 1, item.x0 + html_coverter.x_margin, item.y1, item.width,
item.height,
item.get_writing_mode())
for child in item:
if isinstance(child, LTTextLine):
self.compare_textline(child, compare_page, html_coverter, compare_margin)
html_coverter.put_newline()
html_coverter.end_div()
html_coverter.page_end()
fp.close()
device.close()
retstr.close()
return out.getvalue()
4.4完全なプログラム
クリック:完全なソースコード