2009-08-21 117 views

Respuesta

5

¿Qué quiere decir con "diferencia"? Una diferencia en el texto del PDF o algún cambio en el diseño (por ejemplo, se redimensionó un gráfico incrustado). El primero es fácil de detectar, el segundo es casi imposible de obtener (PDF es un formato de archivo MUY complicado, que ofrece capacidades interminables de formateo de archivos).

Si desea obtener el diff texto, sólo ejecute un pdf a la utilidad de texto en los dos archivos PDF y luego usar Python biblioteca incorporada de diferencias para obtener la diferencia de los textos convertidos.

Esta pregunta se refiere a la conversión de PDF a texto en python: Python module for converting PDF to text.

La fiabilidad de este método depende de los generadores de PDF que esté utilizando. Si usa, p. Adobe Acrobat y algunos PDF-Creator basados ​​en Ghostscript para crear dos archivos PDF a partir del MISMO documento Word, es posible que aún obtenga una diferencia, aunque el documento original sea idéntico.

Esto se debe a que hay docenas de maneras de codificar la información del documento fuente en un PDF y cada convertidor utiliza un enfoque diferente. A menudo, el convertidor de PDF a texto no puede determinar el flujo de texto correcto, especialmente con diseños o tablas complejas.

+0

Solo el texto servirá. El generador de pdf no debería ser un problema. – Goutham

+0

Si necesita admitir imágenes, puede extraer archivos JPG de un pdf: http://nedbatchelder.com/blog/200712/extracting_jpgs_from_pdfs.html o convertir el pdf a una imagen y comparar eso. –

0

mira esto, puede ser útil: http://pybrary.net/pyPdf/

+0

pyPdf no fue muy robusto en mis pruebas.se colgó en pdfs creados por Illustrator/InDesign y otros programas de dibujo vectorial. Sin embargo, podría estar bien para archivos PDF simples de aplicaciones de Office. Una alternativa mucho más sólida es pftftotext del kit de herramientas xpdf. – fbuchinger

3

no sé su caso de uso, pero para pruebas de regresión de script que genera pdf usando reportlab, debo hacer pdfs diff por

  1. la conversión cada página a una imagen utilizando ghostsript
  2. Diferenciando cada página de imagen de la página PDF estándar frente, usando PIL

por ejemplo

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

imDiff = ImageChops.difference(im1, im2) 

Esto funciona en mi caso para marcar cualquier cambio introducido debido a cambios en el código.

+0

¿Hay alguna referencia para su paso # 1? – yucer

2

Me encontré con la misma pregunta en mi pdftest unit, ni pdfminer ni pyPdf funciona bien para mí.

Aquí hay dos comandos (pdftocairo, pdftotext) que funcionan perfectamente en mi prueba. (Instalación de Ubuntu: apt-get install poppler-utils)

Usted puede obtener el contenido del PDF por:

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 

Parece pdftocairo puede volver a dibujar los archivos pdf, pdftotext puede extraer todo el texto.

Y entonces se puede comparar dos archivos 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 
Cuestiones relacionadas