2009-08-21 10 views

Odpowiedz

5

Co masz na myśli przez "różnicę"? Różnica w tekście pliku PDF lub zmiana układu (na przykład osadzona grafika została zmieniona). Pierwsza jest łatwa do wykrycia, druga jest prawie niemożliwa do uzyskania (PDF jest BARDZO skomplikowanym formatem plików, który oferuje nieskończone możliwości formatowania plików).

Jeśli chcesz uzyskać różnicę tekstu, po prostu uruchom narzędzie PDF do tekstu na dwóch plikach PDF, a następnie użyj wbudowanej biblioteki różnicowej Pythona, aby uzyskać różnicę w przekonwertowanych tekstach.

To pytanie dotyczy konwersji tekstu na format PDF w python: Python module for converting PDF to text.

Niezawodność tej metody zależy od generatorów PDF, z których korzystasz. Jeśli używasz np. Adobe Acrobat i niektóre programy do tworzenia plików PDF oparte na Ghostscript, aby utworzyć dwa pliki PDF z dokumentu SAME Word, nadal można uzyskać różnicę, mimo że dokument źródłowy był identyczny.

Dzieje się tak dlatego, że istnieje wiele sposobów kodowania informacji z dokumentu źródłowego do pliku PDF, a każdy konwerter stosuje inne podejście. Często konwerter plików PDF na tekst nie może znaleźć prawidłowego przepływu tekstu, szczególnie w przypadku złożonych układów lub tabel.

+0

Wystarczy tekst. Generator PDF nie powinien stanowić problemu. – Goutham

+0

Jeśli potrzebujesz obsługi obrazów, możesz wyodrębnić pliki JPG z pliku pdf: http://nedbatchelder.com/blog/200712/extracting_jpgs_from_pdfs.html lub przekonwertować plik pdf na obraz i porównać go. –

0

to sprawdzić, może to być przydatne: http://pybrary.net/pyPdf/

+0

pyPdf nie był bardzo solidny w moich testach.rozbił się na plikach PDF stworzonych przez Illustrator/InDesign i inne programy do rysowania wektorowego. Jednak może to być ok dla prostych plików PDF z aplikacji pakietu Office. O wiele mocniejszą alternatywą jest pdftotext z zestawu narzędzi xpdf. – fbuchinger

3

Nie znam przypadku użycia, ale dla testów regresji skrypt, który generuje PDF za pomocą ReportLab, robię diff plików PDF przez

  1. Konwersja każda strona do obrazu za pomocą ghostsript
  2. Diffing każdą stronę przed obrazem strony standardowego formatu PDF, używając PIL

np

im1 = Image.open(imagePath1) 
im2 = Image.open(imagePath2) 

imDiff = ImageChops.difference(im1, im2) 

Działa to w moim przypadku do zgłaszania zmian wprowadzonych w wyniku zmian kodu.

+0

Czy jest jakiś odnośnik do twojego kroku nr 1? – yucer

2

Spełnione to samo pytanie w moim zaszyfrowanym unittest pdf, ani pdfminer, ani pyPdf nie działa dobrze dla mnie.

Oto dwie komendy (pdftocairo, pdftotext) działające idealnie na moim teście. (Ubuntu Instalacja: apt-get install Poppler-utils)

można uzyskać zawartość PDF poprzez:

from subprocess import Popen, PIPE 

def get_formatted_content(pdf_content): 
    cmd = 'pdftocairo -pdf - -' # you can replace "pdftocairo -pdf" with "pdftotext" if you want to get diff info 
    ps = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
    stdout, stderr = ps.communicate(input=pdf_content) 
    if ps.returncode != 0: 
     raise OSError(ps.returncode, cmd, stderr) 
    return stdout 

Wydaje pdftocairo można przerysować plików pdf, pdftotext można wyodrębnić cały tekst.

a następnie można porównać dwa pliki pdf:

c1 = get_formatted_content(open('f1.pdf').read()) 
c2 = get_formatted_content(open('f2.pdf').read()) 
print(cmp(c1, c2)) # for binary compare 
# import difflib 
# print(list(difflib.unified_diff(c1, c2))) # for text compare 
Powiązane problemy