Como desmarcar um pdf

10

Eu tenho um arquivo pdf que foi criado em um formato de livreto. Destina-se a imprimir em papel A4 na orientação paisagem; Aqui estão duas páginas em pdf, que devem corresponder a quatro páginas no livro atual.

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (1)       |      (3)       |
|              |                |
|              |                |
|              |                |
 ------------------------------- 

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------

Os números entre colchetes correspondem à ordem das páginas individuais.

Eu sei que existem todos os tipos de comandos (pdfbook, pdfnup etc.) no linux (que provavelmente foi usado para criar este livreto em primeiro lugar). Como 'desmarco' - ou seja, eu gostaria de fazer um documento em PDF a partir deste, onde cada página individual do produto final é uma página individual do pdf, ordenada da maneira usual.

Editar

Graças a Gilles, consegui usar o seguinte código:

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    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(p)
        qold = q
    else:
        output.addPage(q)
        output.addPage(qold)
        output.addPage(p)
output.write(sys.stdout)
TSGM
fonte
1
Eu acho que isso deve ir para superuser.com
Adam Zalcman
@AdamZalcman Why? Ele está procurando um programa Linux
Michael Mrozek
2
Você pode adaptar a resposta desta pergunta (de Gilles) ao seu problema , ou seja, criar um script PyPdf.
sr_
Tem certeza de que não trocou as páginas 3 e 4? Eu trabalhei em impressão; que o layout não faz qualquer sentido ....
Wildcard

Respostas:

4

Aqui está um pequeno script Python usando a biblioteca PyPdf que faz o trabalho. (Derivado de un2up.) Salve-o em um script chamado unbook, torne-o executável ( chmod +x unbook) e execute-o como um filtro ( unbook <book.pdf >1up.pdf).

Eu testei esse script na saída de pdfbook --signature=N. Para outro método, pode não ser necessário reverter todas as outras páginas de entrada e a ordem das páginas pode ser diferente (depende da orientação das páginas em paisagem). A disposição da página não corresponde à sua pergunta. o 13,42 não faz sentido para mim (em um livro de 4 páginas, 3 deve estar próximo a 2, não próximo a 1).

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    if i % 2 == 0:
        p.rotateClockwise(180)
        q.rotateClockwise(180)
        output.addPage(p)
        second_half.append(q)
    else:
        output.addPage(p)
        second_half.append(q)
second_half.reverse()
for q in second_half: output.addPage(q)
output.write(sys.stdout)

Ignore qualquer aviso de descontinuação; somente os mantenedores do PyPdf precisam se preocupar com isso.

Gilles 'SO- parar de ser mau'
fonte
Isso foi solicitado há algum tempo, mas estou tendo problemas para implementar sua solução. Estou executando o OSX, instalei python e py27-pypdf via MacPorts. Criei um arquivo de cancelamento de reserva e copiei e colei o script. A execução do comando conforme as instruções cria um novo arquivo 1up.pdf com 0 bytes. Nenhum erro ou qualquer coisa está listado no meu terminal, mas após a execução do comando, nada acontece (eu tenho que sair com CTRL-C); o sistema não trava e parece não estar fazendo nada. Como posso rastrear o problema? @Gilles
TSGM 6/06/12
@TSGM A explicação mais provável é que você esqueceu o <antes do arquivo de entrada. Se você realmente tem certeza absoluta de que escreveu o comando corretamente, pode ser um bug na biblioteca PyPdf (ainda não falhou comigo, mas pode acontecer).
Gilles 'SO- stop be evil'
O problema era que eu deveria chamar python via "python unbook <in.pdf> out.pdf". Eu tolo. Além disso, seu código era um pouco estranho (ele estava colando as páginas second_half no final. Parece que o corrigi para o formato que escrevi na postagem original). Editei minha resposta original para conter o código que acabei usando. Além disso, os comandos de tamanho da página parecem estar incorretos. Eu corrigi isso também. @Gilles
TSGM
@TSGM O código assume um layout de 1 | 4 anverso, 2 | 3 reverso, que é o layout de livro usual. Você pode precisar ajustá-lo se suas páginas estiverem dispostas de maneira diferente. Foi testado em campo nesse cenário. O fato de ter que ligar explicitamente pythonfoi meu erro: eu deveria ter colocado uma linha shebang, acrescentou.
Gilles 'SO- stop be evil'