web-dev-qa-db-fra.com

Séparer les pages en pdf

J'ai un fichier pdf scanné qui a scanné deux pages sur une page virtuelle (page en fichier pdf).

La résolution est de bonne qualité. Le problème est que je dois zoomer lors de la lecture et faire glisser de gauche à droite.
Existe-t-il une commande (convert, pdftk, ...) ou un script qui peut convertir ce fichier pdf en pages normales (une page du livre = une page dans le fichier pdf )?

72
xralf

Voici un petit script Python utilisant la bibliothèque PyPdf qui fait le travail proprement. Enregistrez-le dans un script appelé un2up (ou ce que vous voulez), rendez-le exécutable (chmod +x un2up) et l'exécuter en tant que filtre (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)

Ignorez les avertissements de dépréciation; seuls les responsables PyPdf doivent s'en préoccuper.

Si l'entrée est orientée d'une manière inhabituelle, vous devrez peut-être utiliser des coordonnées différentes lors de la troncature des pages. Voir Pourquoi mon code ne divise-t-il pas correctement chaque page dans un pdf numérisé?


Juste au cas où cela serait utile, voici ma réponse précédente qui utilise une combinaison de deux outils plus une intervention manuelle:

  • Pdfjam (au moins la version 2.0), basé sur le paquet pdfpages LaTeX, pour recadrer les pages;
  • Pdftk , pour rassembler les moitiés gauche et droite.

Les deux outils sont nécessaires car, pour autant que je sache, pdfpages n'est pas en mesure d'appliquer deux transformations différentes à la même page en un seul flux. Dans l'appel à pdftk, remplacez 42 par le nombre de pages dans le document d'entrée (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

Si vous n'avez pas pdfjam 2.0, il suffit d'avoir une installation PDFLaTeX avec le paquet pdfpages (sur Ubuntu: vous avez besoin de texlive-latex-recommendedInstall texlive-latex-recommended et peut-être (sur Ubuntu: texlive-fonts-recommendedInstall texlive-fonts-recommended ), et utilisez le fichier de pilote suivant 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}

Exécutez ensuite les commandes suivantes, en remplaçant 42 par le nombre de pages du fichier d'entrée (qui doit être appelé 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

Juste un ajout car j'ai eu des problèmes avec le script python (et plusieurs autres solutions): pour moi, mutool a très bien fonctionné. C'est un ajout simple et petit livré avec l'élégant mupdf reader. Vous pouvez donc essayer:

mutool poster -y 2 input.pdf output.pdf

Pour les divisions horizontales, remplacez y par x. Et vous pouvez bien sûr combiner les deux pour des solutions plus complexes.

Vraiment heureux d'avoir trouvé cela (après des années d'utilisation quotidienne de mupdf :)

mutool est livré avec mupdf à partir de la version 1.4: http://www.mupdf.com/news


Installation de mupdf et mutool à partir de la source:

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 allez à la page de téléchargements pour trouver une version plus récente.

60
martz

Imagemagick peut le faire en une seule étape:

$ convert in.pdf -crop 50%x0 +repage out.pdf
18
tomas

Basé sur la réponse de Gilles et comment trouver PDF nombre de pages j'ai écrit

#!/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

Je peux donc courir

./split.sh my.pdf 50 1.2

où 50 pour ajuster la marge et 1,2 pour l'échelle.

6
Anton Bessonov

La commande Convertir d'ImageMagick peut vous aider à rogner votre fichier en 2 parties. Voir http://www.imagemagick.org/Usage/crop/

Si j'étais vous, j'écrirais un script (Shell) comme ceci:

  1. Fractionnez votre fichier avec pdfsam : 1 page = 1 fichier sur le disque (le format n'a pas d'importance. Choisissez celui que connaît ImageMagick. Je prendrais simplement PS ou PDF.
  2. Pour chaque page, recadrez la première moitié et placez-le dans un fichier nommé $ {PageNumber} A

  3. Recadrez la seconde moitié et placez-la dans un fichier nommé $ {PageNumber} B.

    Vous obtenez 1A.pdf, 1B.pdf, 2A.pdf, 2B.pdf, etc.

  4. Maintenant, assemblez-le à nouveau dans un nouveau PDF. Il existe de nombreuses méthodes pour ce faire.
6
tiktak

Voici une variante du code PyPDF posté par Gilles. Cette fonction fonctionnera quelle que soit l'orientation de la page:

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()
4
moraes

La meilleure solution était mutool voir ci-dessus:

Sudo apt install mupdf-tools pdftk

la scission:

mutool poster -y 2 input.pdf output.pdf

mais vous devez ensuite faire pivoter les pages vers la gauche:

pdftk output.pdf cat 1-endleft output rotated.pdf
3

moraes solution n'a pas fonctionné pour moi. Le problème principal était le calcul x5 et x6. Ici, un décalage doit être pris en compte, c'est-à-dire si lowerLeft n'est pas à (0,0)

Voici donc une autre variante, avec des adaptations supplémentaires pour utiliser PyPDF2 et python 3:

import copy
import math
import PyPDF2
import sys
import io 

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

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

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

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

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)

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

        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.lowerLeft = (x1, x6)
            p.mediaBox.upperRight = (x3, x4)

            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()

if __name__ == "__main__":
    if ( len(sys.argv) != 3 ):
        print ('Usage: python3 double2single.py input.pdf output.pdf')
        sys.exit(1)

    split_pages(sys.argv[1], sys.argv[2])
1
vbar

Sur la base de réponse de Benjamin chez AskUbuntu, je recommanderais d'utiliser l'outil GUI appelé gscan2pdf .

  1. Importez le fichier de numérisation PDF vers gscan2pdf. Notez que la non-image PDF les fichiers peuvent ne pas fonctionner. Les analyses sont correctes, vous n'avez donc pas à vous inquiéter.

    enter image description here

  2. Cela peut prendre un certain temps selon la taille du document. Attendez qu'il se charge.

  3. Appuyez sur Ctrl + A pour sélectionner toutes les pages, puis tournez (Ctrl + Maj + C) les si nécessaire.

    enter image description here

  4. Allez dans Outils >> Nettoyer . Sélectionnez Disposition comme double et # pages de sortie = 2 .

    enter image description here

  5. Appuyez sur [~ # ~] ok [~ # ~] et attendez que le travail soit terminé.

    enter image description here

  6. Enregistrez le fichier PDF. Terminé.

1
Nanashi No Gombe