日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pdf内容差异对比

發布時間:2023/12/9 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pdf内容差异对比 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景:防止抄襲!word對比就很容易,所以這里介紹pdf內容對比技術。

一、環境

  • win10
  • python3.9.6

二、思路

pdf轉圖片jpg,圖片轉文字,文字進行對比。

  • 將 PDF 文件的每一頁轉換為一個圖片
  • 圖片轉為文字,對文字進行比較,再得到一個差異圖。
  • 將所有生成的差異圖像拼接成一個 PDF 文件
  • 三、實現效果

    使用方法:python diff-pdf.py test1.pdf test2.pdf
    結果如下:

    四、部分程序

    主要使用模塊:pdfminer,io中的StringIO。

    4.1 讀取pdf

    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] = dictionaryreturn pages

    4.2 pdf轉文本

    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 = 0caching = Truepagenos = set()i = 0for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching,check_extractable=True):i += 1if i != page_no:continueinterpreter.process_page(page)fp.close()device.close()str = retstr.getvalue()retstr.close()return str

    4.3 pdf比較

    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.3fontscale = 1html_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:breakcompare_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 完整程序

    點擊:完整源碼

    總結

    以上是生活随笔為你收集整理的pdf内容差异对比的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。