2011-08-13 14 views
8

Actualización: Gracias a stardt cuyo script funciona! El pdf es una página de otro. Probé el script en el otro y también escupió correctamente cada página en pdf, pero el orden de los números de página a veces es correcto y algunas veces incorrecto. Por ejemplo, en la página 25-28 del archivo pdf, los números de página impresos son 14, 15, 17, son 16. Me preguntaba por qué? Todo el pdf se puede descargar desde http://download304.mediafire.com/u6ewhjt77lzg/bgf8uzvxatckycn/3.pdf¿Por qué mi código no divide correctamente cada página en un PDF escaneado?

original: Tengo un pdf escaneado, donde dos páginas de papel se sientan de lado a lado en una página PDF. Me gustaría dividir la página pdf en dos, con la mitad izquierda original convirtiéndose en la primera de las dos nuevas páginas PDF. El pdf se ve como enter image description here.

Aquí está mi script en Python llamado un2up inspirado por Gilles:

#!/usr/bin/env python 
import copy, sys 
from pyPdf import PdfFileWriter, PdfFileReader 
input = PdfFileReader(sys.stdin) 
output = PdfFileWriter() 
for p in [input.getPage(i) for i in range(0,input.getNumPages())]: 
    q = copy.copy(p) 
    (w, h) = p.mediaBox.upperRight 

    p.mediaBox.upperLeft = (0, h/2) 
    p.mediaBox.upperRight = (w, h/2) 
    p.mediaBox.lowerRight = (w, 0) 
    p.mediaBox.lowerLeft = (0, 0) 

    q.mediaBox.upperLeft = (0, h) 
    q.mediaBox.upperRight = (w, h) 
    q.mediaBox.lowerRight = (w, h/2) 
    q.mediaBox.lowerLeft = (0, h/2) 

    output.addPage(q) 
    output.addPage(p) 
output.write(sys.stdout) 

Probé la secuencia de comandos en un pdf en el terminal de comandos con ser un2up <page.pdf> out.pdf, pero la salida out.pdf no se divide correctamente.

También comprobé los valores de las variables w y h, la salida de p.mediaBox.upperRight, y son 514 y 1224 que no pongan cara derecha basa en su relación real.

El archivo se puede descargar desde http://download851.mediafire.com/bdr4sv7v5nzg/raci13ct5w4c86j/page.pdf.

Respuesta

7

Su código se supone que es p.mediaBox.lowerLeft (0,0) pero en realidad es (0, 497)

Esto funciona para el archivo que ha facilitado:

#!/usr/bin/env python 
import copy, sys 
from pyPdf import PdfFileWriter, PdfFileReader 
input = PdfFileReader(sys.stdin) 
output = PdfFileWriter() 
for i in range(input.getNumPages()): 
    p = input.getPage(i) 
    q = copy.copy(p) 

    bl = p.mediaBox.lowerLeft 
    ur = p.mediaBox.upperRight 

    print >> sys.stderr, 'splitting page',i 
    print >> sys.stderr, '\tlowerLeft:',p.mediaBox.lowerLeft 
    print >> sys.stderr, '\tupperRight:',p.mediaBox.upperRight 

    p.mediaBox.upperRight = (ur[0], (bl[1]+ur[1])/2) 
    p.mediaBox.lowerLeft = bl 

    q.mediaBox.upperRight = ur 
    q.mediaBox.lowerLeft = (bl[0], (bl[1]+ur[1])/2) 
    if i%2==0: 
     output.addPage(q) 
     output.addPage(p) 
    else: 
     output.addPage(p) 
     output.addPage(q) 

output.write(sys.stdout) 
+0

Gracias! ¡Funciona! El pdf es una página de otro. Probé el script en el otro y también escupió correctamente cada página en pdf, pero el orden de los números de página a veces es correcto y algunas veces incorrecto. Por ejemplo, en la página 25-28 del archivo pdf, los números de página impresos son 14, 15, 17, son 16. Me preguntaba por qué? El pdf completo se puede descargar de http://download304.mediafire.com/u6ewhjt77lzg/bgf8uzvxatckycn/3.pdf – Tim

+0

@Tim He actualizado el código para que invierta el orden de la división para cada otra página. Esto divide su archivo correctamente. – stardt

+0

Gracias! (1) ¿Sabes por qué tenemos que cambiar la página 'p' y' q' cada dos páginas? ¿Es esto común a otros archivos pdf, o solo específico a este? (2) También me preguntaba cómo entender el sistema de coordenadas en una página en PDF, es decir, ¿es p.mediaBox.lowerLeft el punto inferior derecho o el extremo derecho que vemos al ver el archivo pdf?¿Es la primera coordenada a lo largo de la dirección horizontal o vertical que vemos? – Tim

1

@ código de stardt era bastante útil, pero tuve problemas para dividir un lote de archivos PDF con diferentes orientaciones. He aquí una función más general que funcionará sin importar la orientación de la página es:

import copy 
import math 
import pyPdf 

def split_pages(src, dst): 
    src_f = file(src, 'r+b') 
    dst_f = file(dst, 'w+b') 

    input = pyPdf.PdfFileReader(src_f) 
    output = pyPdf.PdfFileWriter() 

    for i in range(input.getNumPages()): 
     p = input.getPage(i) 
     q = copy.copy(p) 
     q.mediaBox = copy.copy(p.mediaBox) 

     x1, x2 = p.mediaBox.lowerLeft 
     x3, x4 = p.mediaBox.upperRight 

     x1, x2 = math.floor(x1), math.floor(x2) 
     x3, x4 = math.floor(x3), math.floor(x4) 
     x5, x6 = math.floor(x3/2), math.floor(x4/2) 

     if x3 > x4: 
      # horizontal 
      p.mediaBox.upperRight = (x5, x4) 
      p.mediaBox.lowerLeft = (x1, x2) 

      q.mediaBox.upperRight = (x3, x4) 
      q.mediaBox.lowerLeft = (x5, x2) 
     else: 
      # vertical 
      p.mediaBox.upperRight = (x3, x4) 
      p.mediaBox.lowerLeft = (x1, x6) 

      q.mediaBox.upperRight = (x3, x6) 
      q.mediaBox.lowerLeft = (x1, x2) 

     output.addPage(p) 
     output.addPage(q) 

    output.write(dst_f) 
    src_f.close() 
    dst_f.close() 
+0

Parece que no puedo hacer que funcione. A diferencia del de @stardt, este produce un archivo vacío. ¿Alguna idea @moraes? –

0

me gustaría añadir que hay que prestar atención a que sus mediaBox variables no se comparten entre las copias p y q. Esto puede suceder fácilmente si lee desde p.mediaBox antes de tomar la copia.

En ese caso, escribir a, p. p.mediaBox.upperRight puede modificar q.mediaBox y viceversa.

La solución de @moraes se encarga de esto copiando explícitamente el mediaBox.

Cuestiones relacionadas