python-3.x 我正在尝试比较pdf文件,并只提取差异

inkz8wg9  于 2023-02-01  发布在  Python
关注(0)|答案(2)|浏览(507)

下面我使用的代码是帮助我比较文件,并找到作为CSV文件的差异。
但是,我在CSV文件中得到的结果,是从两个文件中提取的随机行集,或者不是在文档中的顺序。我该如何解决这个问题?有没有更好的方法来比较PDF?

`from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
from itertools import chain
import pandas as pd
from time import sleep
from tqdm import tqdm

# List of pdf files to process
pdf_files = ['file1.pdf', 'file2.pdf']

# Create a list to store the text from each PDF
pdf1_text = []
pdf2_text = []

# Iterate through each pdf file
for pdf_file in tqdm(pdf_files):
    # Open the pdf file
    with open(pdf_file, 'rb') as pdf_now:
        # Extract text using pdfminer
        rsrcmgr = PDFResourceManager()
        sio = StringIO()
        codec = 'utf-8'
        laparams = LAParams()
        device = TextConverter(rsrcmgr, sio, codec=codec, laparams=laparams)
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        for page in PDFPage.get_pages(pdf_now, set()):
            interpreter.process_page(page)
        text = sio.getvalue()
        text = text.split('\n')
        if pdf_file == pdf_files[0]:
            pdf1_text.append(text)
        else:
            pdf2_text.append(text)

        device.close()
        sio.close()
        sleep(20)

pdf1_text = list(chain.from_iterable(pdf1_text))
pdf2_text = list(chain.from_iterable(pdf2_text))

differences = set(pdf1_text).symmetric_difference(pdf2_text)

## Create a new dataframe to hold the differences
differences_df = pd.DataFrame(columns=['pdf1_text', 'pdf2_text'])

# Iterate through the differences and add them to the dataframe
for difference in differences:
    # Create a new row in the dataframe with the difference from pdf1 and pdf2
    differences_df = differences_df.append({'pdf1_text': difference if difference in pdf1_text else '',
                                        'pdf2_text': difference if difference in pdf2_text else ''}, ignore_index=True)

# Write the dataframe to an excel sheet
differences_df = differences_df.applymap(lambda x: x.encode('unicode_escape').decode('utf-8') if    isinstance(x, str) else x)

differences_df.to_excel('differences.xlsx', index=False, engine='openpyxl')`
fwzugrvs

fwzugrvs1#

下面的代码段生成文档中排序文本行的列表。
请注意,PyMuPDF包支持PDF和六种其他文档类型(XPS、EPUB、MOBI等),所以相同的代码可以处理这些类型中的任何一种。

import fitz # package PyMuPDF

def sorted_lines(filename):  # returns sorted text lines
    lines = []  # the result
    doc = fitz.open(filename)
    for page in doc:
        page_lines = []  # lines on this page
        all_text = page.get_text("dict", flags=fitz.TEXTFLAGS_TEXT)
        for block in all_text["blocks"]:
            for line in block["lines"]:
                text = "".join([span["text"] for span in line["spans"]])
                bbox = fitz.Rect(line["bbox"])  # the wrapping rectangle
                # append line text and its top-left coord
                page_lines.append((bbox.y0, bbox.x0, text))
        # sort the page lines by vertical, then by horizontal coord
        page_lines.sort(key=lambda l: (l[0], l[1]))
        lines.append(page_lines)  # append to lines of the document
    return lines

# make lists of sorted lines for the two documents
lines1 = sorted_lines(filename1)
lines2 = sorted_lines(filename2)

# now do your comparison / diff of the lines
ozxc1zmp

ozxc1zmp2#

两个相同大小的pdf文件即使在屏幕或打印机上的内容相同,也会有不同的表现,原因是无限的。同样,两个不同的文件可以产生100%相同的墨水或像素布局。因此,比较可能是有问题的。
这里两个文件应该输出相同的文本:-

>pdftotext style1.pdf -

Syntax Error: Unknown font tag ''
Syntax Error (266): No font in show
Syntax Error: Can't get Fields array<0a>

但另一个副本有一个小的变化

>pdftotext style2.pdf -
Hello World!

对于两个PDF文件的受控比较,MuPDF或其他一些库适合于定制查询,然而,如果你需要的是最快的编号页面(或所有文本)的文本比较,那么写一行命令用于pdf到文本提取,另一行命令用于文件比较会更快。然而,在这个故意说明陷阱的例子中,第一个文件需要调整才能符合要求。
使用原始比较没有多大用处,因为PDF通常不同,除非实际上相同

fc /A /20 style1.pdf style2.pdf && echo same || echo different
Comparing files style1.pdf and STYLE2.PDF
***** style1.pdf
%PDF-1.0
...
endobj
***** STYLE2.PDF
%PDF-1.0
...
endobj
*****

***** style1.pdf
endobj
...
%%EOF
***** STYLE2.PDF
endobj
...
%%EOF
*****

与众不同

所以在修正第一个文件之后

>pdftotext style1(fixed).pdf && pdftotext style2.pdf

>fc /A /20 style1(fixed).txt style2.txt && echo same || echo different
Comparing files style1(fixed).txt and STYLE2.TXT
FC: no differences encountered

相同

然而,一切并非如表面所见:
放置样式和比例不同

因此,测试两个文件差异的最有效方法是:
对结果的一部分使用文本比较,对第二个意见使用两个文件的图形呈现。

相关问题