Dividir páginas em pdf

62

Eu tenho um arquivo pdf digitalizado que digitalizou duas páginas em uma página virtual (página em arquivo pdf).

A resolução é de boa qualidade. O problema é que tenho que aplicar zoom ao ler e arrastar da esquerda para a direita.
Existe algum comando ( convert , pdftk , ...) ou script que possa converter este arquivo pdf com páginas normais (uma página do livro = uma página no arquivo pdf)?

    
por xralf 02.05.2011 / 21:57

8 respostas

43

Aqui está um pequeno script Python usando a biblioteca PyPdf que faz o trabalho perfeitamente. Salve-o em um script chamado un2up (ou o que você quiser), torne-o executável ( chmod +x un2up ) e execute-o como um filtro ( un2up <2up.pdf >1up.pdf ).

#!/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.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    output.addPage(p)
    output.addPage(q)
output.write(sys.stdout)

Ignore quaisquer avisos de descontinuação; somente os mantenedores do PyPdf precisam se preocupar com eles.

Se a entrada estiver orientada de maneira incomum, talvez seja necessário usar coordenadas diferentes ao truncar as páginas. Veja Por que meu código não é dividido corretamente página em um pdf digitalizado?

Caso seja útil, aqui está minha resposta anterior, que usa uma combinação de duas ferramentas e alguma intervenção manual:

  • Pdfjam (pelo menos, versão 2.0), com base no pdfpages pacote LaTeX, para cortar as páginas;
  • Pdftk , para juntar as metades esquerda e direita.

As duas ferramentas são necessárias porque, até onde posso dizer, as páginas do pdf não podem aplicar duas transformações diferentes à mesma página em um fluxo. Na chamada para pdftk , substitua 42 pelo número de páginas no documento de entrada ( 2up.pdf ).

pdfjam -o odd.pdf --trim '0cm 0cm 14.85cm 0cm' --scale 1.141 2up.pdf
pdfjam -o even.pdf --trim '14.85cm 0cm 0cm 0cm' --scale 1.141 2up.pdf
pdftk O=odd.pdf E=even.pdf cat $(i=1; while [ $i -le 42 ]; do echo O$i E$i; i=$(($i+1)); done) output all.pdf

Caso você não tenha o pdfjam 2.0, basta ter uma instalação do PDFLaTeX com o pacote pdfpages (no Ubuntu: você precisa de texlive-latex-recommended e talvez (no Ubuntu: texlive-fonts-recommended ) e use o seguinte arquivo de driver driver.tex :

\batchmode
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge[trim=0cm 0cm 14.85cm 0cm,scale=1.141]{2up.pdf,-}
\includepdfmerge[trim=14.85cm 0cm 0cm 0cm,scale=1.141]{2up.pdf,-}
\end{document}

Em seguida, execute os seguintes comandos, substituindo 42 pelo número de páginas no arquivo de entrada (que deve ser chamado de 2up.pdf ):

pdflatex driver
pdftk driver.pdf cat $(i=1; pages=42; while [ $i -le $pages ]; do echo $i $(($pages+$i)); i=$(($i+1)); done) output 1up.pdf
    
por 02.05.2011 / 22:51
45

Apenas uma adição desde que eu tive problemas com o script python (e várias outras soluções): para mim, mutool funcionou muito bem. É uma adição simples e pequena, fornecida com o elegante leitor mupdf . Então você pode tentar:

mutool poster -y 2 input.pdf output.pdf

Para divisões horizontais, substitua y por x . E você pode, é claro, combinar os dois para soluções mais complexas.

Realmente feliz por ter encontrado isso (após anos de uso diário de mupdf:)

mutool vem com o mupdf a partir da versão 1.4: link

Instalando mupdf e mutool da fonte:

wget http://www.mupdf.com/downloads/mupdf-1.8-source.tar.gz
tar -xvf mupdf-1.8-source.tar.gz
cd mupdf-1.8-source
sudo make prefix=/usr/local install

Ou acesse a página de downloads para encontrar uma versão mais recente.

    
por 16.01.2015 / 06:34
15

O Imagemagick pode fazer isso em uma etapa:

$ convert in.pdf -crop 50%x0 +repage out.pdf
    
por 20.05.2011 / 09:28
6

O comando Converter do ImageMagick pode ajudá-lo a recortar seu arquivo em duas partes. Consulte o link

Se eu fosse você, escreveria um script (shell) assim:

  1. Divida seu arquivo com o arquivo pdfsam : 1 página = 1 no disco (o formato não importa. Escolha um que o ImageMagick saiba. Eu acabei de pegar PS ou PDF.
  2. Para cada página, corte a primeira metade e coloque-a em um arquivo chamado $ {PageNumber} Um

  3. Corte a segunda metade e coloque-a em um arquivo chamado $ {PageNumber} B.

    Você obtém 1A.pdf, 1B.pdf, 2A.pdf, 2B.pdf, etc.

  4. Agora, reúna isso novamente em um novo PDF. Existem muitos métodos para fazer isso.
por 02.05.2011 / 23:07
6

Baseado na resposta de Gilles e como encontrar a contagem de páginas em PDF eu escrevi

#!/bin/bash

pdforiginal=$1
pdfood=$pdforiginal.odd.pdf
pdfeven=$pdforiginal.even.pdf
pdfout=output_$1
margin=${2:-0}
scale=${3:-1}

pages=$(pdftk $pdforiginal dump_data | grep NumberOfPages | awk '{print $2}')

pagesize=$(pdfinfo $pdforiginal | grep "Page size" | awk '{print $5}')
margin=$(echo $pagesize/2-$margin | bc -l)

pdfjam -o $pdfood --trim "0cm 0cm ${margin}pt 0cm" --scale $scale $pdforiginal
pdfjam -o $pdfeven --trim "${margin}pt 0cm 0cm 0cm" --scale $scale  $pdforiginal

pdftk O=$pdfood E=$pdfeven cat $(i=1; while [ $i -le $pages ]; do echo O$i E$i; i=$(($i+1)); done) output $pdfout

rm $pdfood $pdfeven

para que eu possa correr

./split.sh my.pdf 50 1.2

onde 50 para ajustar a margem e 1,2 para a escala.

    
por 19.10.2012 / 21:48
4

Aqui está uma variação do código PyPDF postado por Gilles. Esta função funcionará independentemente da orientação da página:

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()
    
por 01.04.2013 / 14:20
2

A melhor solução foi o mutool veja acima:

sudo apt install mupdf-tools pdftk

a divisão:

mutool poster -y 2 input.pdf output.pdf

mas você precisa girar as páginas restantes:

pdftk output.pdf cat 1-endleft output rotated.pdf
    
por 09.04.2018 / 00:56
1

Com base na resposta de Benjamin no AskUbuntu, eu recomendaria usar a ferramenta GUI chamada gscan2pdf .

  1. Importe o arquivo de digitalização em PDF para gscan2pdf. Observe que arquivos PDF sem imagem podem não funcionar. As verificações estão bem, então você não precisa se preocupar.

  2. Podedemorarumpouco,dependendodotamanhododocumento.Espereatécarregar.

  3. PressioneCtrl+Aparaselecionartodasaspáginase,emseguida,gire(Ctrl+Shift+C),senecessário.

  4. VáparaFerramentas>>Limpar.SelecioneLayoutcomodoublee#outputpages=2.

  5. CliqueemOKeaguardeatéqueotrabalhosejaconcluído.

  6. Salve o arquivo PDF. Feito.

por 03.07.2017 / 10:20