Como converter um PDF com 2 lados por página em 1 lado por página?
Como converter um PDF com 2 lados por página em 1 lado por página?
Respostas:
OK, o problema já foi resolvido com a ajuda do Acrobat (versão completa, não Reader). Mas o que fazer se você não tiver acesso ao Acrobat? Isso também poderia ser feito com o Ghostscript e o pdftk?
... e, por diversão, não vamos usar um arquivo de entrada com páginas "dobradas", mas um com "agudos". Na verdade, recebi um desses PDF hoje por email. Era um folheto dobrado no esquema de Leporello . O tamanho da folha era A4 (842pt x 595pt), e era dobrado e colocado da seguinte maneira:
Front side to be printed, page 1 of PDF
+--------+--------+--------+ ^
| | | | |
| 5 | 6 | 1 | |
| | | | 595 pt
| | | | |
| | | | |
| | | | |
+--------+--------+--------+ v
^ ^
fold fold
v v
+--------+--------+--------+ ^
| | | | |
| 2 | 3 | 4 | |
| | | | 595 pt
| | | | |
| | | | |
| | | | |
+--------+--------+--------+ v
Back side to be printed, page 2 of PDF
<---------- 842 pt -------->
Quero criar 1 PDF com 6 páginas, cada uma com o tamanho incomum de 280,67pt x 595 pt.
Vamos primeiro extrair as seções esquerdas de cada uma das páginas de entrada:
gswin32c.exe ^
-o left-sections.pdf ^
-sDEVICE=pdfwrite ^
-g2807x5950 ^
-c "<</PageOffset [0 0]>> setpagedevice" ^
-f myflyer.pdf
O que esses parâmetros fizeram?
-o ...............:
Nomeia o arquivo de saída. Implicitamente também usa -dBATCH -dNOPAUSE -dSAFER
.-sDEVICE=pdfwrite :
queremos PDF como formato de saída.-g................:
define o tamanho da mídia de saída em pixels. A resolução padrão do pdfwrite é 720 dpi. Portanto, multiplique por 10 para obter uma correspondência para o PageOffset.-c "..............:
solicita ao Ghostscript que processe o snippet de código PostScript fornecido logo antes do arquivo de entrada principal (que precisa ser seguido -f
).<</PageOffset ....:
define o deslocamento da imagem da página no meio. (É claro que, para as páginas da esquerda, a troca por [0 0]
não tem efeito real.)-f ...............:
processe esse arquivo de entrada.Qual resultado o último comando alcançou?
Este:
Output file: left-sections.pdf, page 1
+--------+ ^
| | |
| 5 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
Output file: left-sections.pdf, page 2
+--------+ ^
| | |
| 2 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
< 280 pt >
Agora vamos fazer a coisa análoga para as seções centrais:
gswin32c.exe ^
-o center-sections.pdf ^
-sDEVICE=pdfwrite ^
-g2807x5950 ^
-c "<</PageOffset [280.67 0]>> setpagedevice" ^
-f myflyer.pdf
Resultado:
Output file: center-sections.pdf, page 1
+--------+ ^
| | |
| 6 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
Output file: center-sections.pdf, page 2
+--------+ ^
| | |
| 3 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
< 280 pt >
Por fim, as seções corretas:
gswin32c.exe ^
-o right-sections.pdf ^
-sDEVICE=pdfwrite ^
-g2807x5950 ^
-c "<</PageOffset [561.34 0]>> setpagedevice" ^
-f myflyer.pdf
Resultado:
Output file: right-sections.pdf, page 1
+--------+ ^
| | |
| 1 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
Output file: right-sections.pdf, page 2
+--------+ ^
| | |
| 4 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
< 280 pt >
Agora combinamos as páginas em um arquivo:
pdftk.exe ^
A=right-sections.pdf ^
B=center-sections.pdf ^
C=left-sections.pdf ^
cat A1 B2 C2 A2 B1 C1 ^
output single-files-input.pdf
verbose
Feito. Aqui está o resultado desejado. 6 páginas diferentes, tamanho 280,67x595.
Resultado:
+--------+ +--------+ +--------+ +--------+ +--------+ +--------+ ^
| | | | | | | | | | | | |
| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | |
| | | | | | | | | | | | 595 pt
| | | | | | | | | | | | |
| | | | | | | | | | | | |
| | | | | | | | | | | | |
+--------+ +--------+ +--------+ +--------+ +--------+ +--------+ v
< 280 pt > < 280 pt > < 280 pt > < 280 pt > < 280 pt > < 280 pt >
f = open("order.dat","w")
for i in [a+1 for a in xrange(63)]: f.write("A{0} B{0} ".format(i))
f.close()
Isso criará um arquivo order.dat com "A1 B1 A2 B2 ... A63 B63". Você pode copiar e colar para pdftk
.
@peims, obrigado. Aqui está a versão passo a passo do seu método. Eu tentei em um arquivo que queria converter para o meu Kindle DX e funciona perfeitamente:
Em seguida, use o pdftk.exe (em http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ ) para intercalar os resultados em um único arquivo. Copie "pdftk.exe", "left.pdf" e "right.pdf" para "D: \" e execute:
Nota: se você copiar os arquivos para "C: \", ele não funcionará no Windows 7 devido a permissões de segurança. Se você não possui um D: \, crie um diretório "C: \ x" para concluir a operação.
Esses resultados normalmente seriam bons o suficiente. No entanto, existem mais duas etapas opcionais para melhorar a saída.
Só tive o mesmo problema. Eu me deparei com o briss, uma ferramenta GUI java de código aberto para separar e cortar páginas em pdf:
http://sourceforge.net/projects/briss/
Funcionou muito bem para mim, no Linux, mesmo que a interface do usuário não seja completamente trivial. Ele até trabalhou com um pdf com algumas páginas de tamanhos diferentes!
Você pode duplicar o documento e cortar as páginas para que apenas os números pares de páginas sejam exibidos em um arquivo e apenas os números ímpares das páginas no outro. Em seguida, divida os arquivos em páginas únicas e recombine para criar um documento com lados únicos em uma página ...
Você pode fazer isso usando vários métodos, por exemplo:
Eu uso o seguinte script para processar livros digitalizados no Mac e Linux. Isso pode consumir bastante memória.
#!/bin/bash
#
# This script processes scanned books. After scanning the books have been cropped with
# Preview. This does kind of a "soft crop" that we need to make a bit "harder".
#
# The second step is to take each page of the PDF and split this into two two pages,
# because each page of the scanned document actually contains two pages of the book.
#
#
FILE=`mktemp`.pdf
FILE2=`mktemp`.pdf
FILE3=`mktemp`.pdf
echo "Making a temporary copy of the input file."
cp $1 $FILE
#
# Start cropping
#
echo "Cropping the PDF"
# The first regex removes all boxes but CropBox. The second regex renames the CropBox as MediaBox
perl -pi.bak -e 's/\/(Media|Bleed|Art|Trim)Box[\n\l\f\s]*\[(.+?)\]//msg;' $FILE
perl -pi.bak -e 's/CropBox/MediaBox/g;' $FILE
echo "Validating the PDF"
#Run PDFTK to ensure that the file is OK
cat $FILE | pdftk - output $FILE2
#
# Done cropping, start splitting the pages
#
echo "Splitting the pages in two and changing to 200 dpi with imagemagick. Output goes to $FILE3"
convert -density 200 $FILE2 -crop 50%x0 +repage $FILE3
#
# Done spliting, copy the result in a new file
#
mv $FILE3 $1.pages.pdf
Obrigado por uma ótima referência. Eu estava em um problema semelhante, mas queria compartilhar o que funcionou para mim.
Eu tinha um tablóide orientado para paisagem em formato pdf, com texto orientado para retrato apenas no lado esquerdo. Tabloide basicamente em 2 partes, sem conteúdo no lado direito da página. Ponto de partida semelhante, mas o tablóide é 792 × 1224 (retrato), 1124 x 792 (paisagem) e a definição de ponto para o tablóide de 1/2 que eu precisava era de 612 x 792 pontos.
"C:\Program Files\gs\gs9.10\bin\gswin64c.exe" -o left2.pdf -sDEVICE=pdfwrite -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f "RFP.pdf"
Obtive o conteúdo necessário para o retrato de 8,5 x 11, muito mais legível.
O que eu entendo é que um arquivo PDF mostrando duas páginas (lado a lado em uma folha) precisa ser convertido em uma página por folha, resultando em duas folhas de arquivo PDF. Em outras palavras, se houver um total de trinta páginas em 15 folhas, precisamos converter o arquivo PDF em um arquivo PDF de trinta folhas, cada uma mostrando uma página. Se esse for o problema, usei o Adobe acrobat XI PRO "ferramenta de extração de página" especificando os números de página de 1 a 30
Krop (Python) e PDFscissors (Java) ainda não foram mencionados, verifique-os se você tiver algumas notas de aula em pdfnup-ped que deseja reverter para um PDF de apresentação adequado.