Pages divisées en pdf

67

J'ai un fichier pdf numérisé qui a numérisé 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.
Y at - il une commande ( convert, pdftk, ...) ou d'un script qui peut convertir ce fichier pdf avec des pages normales (une page de livre = une page dans le fichier pdf)?

Xralf
la source
1
Bien que ce ne soit pas la réponse la plus votée, celle-ci m’a vraiment surpris. C'est simple, court, rapide et élégant. Je pensais que cela valait la peine de le mentionner ici, car nous sommes parfois trop paresseux pour faire défiler d'autres réponses ...
Peque
Pour les enregistrements, l’opération inverse (jonction de plusieurs pages) peut être obtenue à partir de la ligne de commande (plutôt que "print to file") avec pdfnup, à partir de la pdfjamsuite.
Skippy le Grand Gourou

Réponses:

46

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 exécutez-le en tant que filter ( 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)

Ignorer les avertissements de dépréciation; Seuls les responsables de PyPdf doivent s’en préoccuper.

Si l'entrée est orientée de manière inhabituelle, vous devrez peut-être utiliser des coordonnées différentes pour tronquer les pages. Voir Pourquoi mon code ne scinde-t-il pas correctement chaque page d'un fichier PDF numérisé?


Au cas où cela serait utile, voici ma réponse précédente, qui associe deux outils et une intervention manuelle:

  • Pdfjam (au moins la version 2.0), basé sur le package pdfpages LaTeX, pour rogner les pages;
  • Pdftk , pour réunir les moitiés gauche et droite.

Les deux outils sont nécessaires car, autant que je sache, pdfpages n’est pas en mesure d’appliquer deux transformations différentes à la même page dans un flux. Dans l'appel à pdftk, remplacez 42 par le nombre de pages du 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'installer PDFLaTeX avec le paquet pdfpages (sous Ubuntu: vous avez besoin de texlive-latex-recommandé Installez texlive-latex-recommandé et peut-être (sous Ubuntu: texlive-fonts-recommandé Installez texlive-fonts-Recommended ), et d'utiliser le pilote suivant. fichier 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}

Puis exécutez 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
Gilles, arrête de faire le mal
la source
La bibliothèque PyPdf fonctionne parfaitement. Je l'ai seulement un peu modifié et exécuté avec python conv_pdf.py res.pdf . Comment feriez-vous votre script shebang à partir de la ligne de commande?
xralf
J'aimerais aussi essayer la version avec pdfjam (en raison d'une légère mise à l'échelle), mais après l'installation du paquet pdfjam, mon shell ne reconnaîtra pas la pdfjamcommande.
xralf
@xralf: Mon script python lit simplement à partir d'une entrée standard et écrit sur une sortie standard. La version pdfjam nécessite pdfjam 2.0; ce n'est qu'une petite enveloppe autour de pdfpages, et j'ai ajouté le peu de LaTeX qu'il génère pour que vous puissiez l'utiliser directement. Le problème de redimensionnement est probablement résolu avec pypdf, il pourrait s'agir d'un problème de taille de page (je ne serai peut-être pas en mesure de vous aider si vous donnez plus de détails sur ce qui se passe et en particulier sur les tailles de page impliquées).
Gilles 'SO- arrête d'être méchant'
Merci, la différence est dans une résolution très légèrement pire, mais cela n'a pas d'importance. J'y reviendrai quand j'en saurai plus sur Latex (c'est trop complexe pour moi maintenant et la solution est vraiment bonne avec PyPdf).
xralf
1
@Gilles Versy script utile. Je m'attendais à voir quelque chose comme ça dans pdfjam, pdftk. Quoi qu'il en soit, certaines personnes peuvent souhaiter certaines modifications pour fractionner des pages par rapport à un autre axe et utiliser un ordre différent. Ceci est possible de changer avec quelques lignes et en utilisantq.mediaBox.lowerRight = (w, h/2)
ony
52

Juste un ajout depuis que j'ai eu des problèmes avec le script Python (et plusieurs autres solutions): pour moi mutoola très bien fonctionné. C'est un ajout simple et petit livré avec l'élégant mupdflecteur. Donc vous pouvez essayer:

mutool poster -y 2 input.pdf output.pdf

Pour les fractionnements horizontaux, remplacez ypar 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 :)

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


Installation mupdfet à mutoolpartir 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 rendez-vous sur la page des téléchargements pour trouver une version plus récente.

Martz
la source
3
J'avais un djvu ... Je l'ai transformé en post-scriptum (assez rapidement), puis en pdf (tortue lente) - et finalement, mutool l'a coupé si vite que je pensais que cela n'avait pas fonctionné - c'était le cas!
Julien Puydt
2
oui, j'étais aussi très satisfait de la vitesse.
Martz
3
Celui-ci est le plus facile et meilleur. mutoolétait fait pour ça. Aussi, méfiez-vous de -y, je pense que dans la plupart des cas, ce que vous voulez, c'est -x.
fiatjaf
2
Cet utilitaire est très rapide, mais j'ai un problème avec l'ordre des pages. La commande alloue la page de droite à la première position et la page de gauche à la seconde. Quelqu'un peut-il m'aider avec ce problème?
garciparedes
16

Imagemagick peut le faire en une seule étape:

$ convert in.pdf -crop 50%x0 +repage out.pdf
tomas
la source
1
Merci. Si j'ajoute le -density 400paramètre`, sa qualité est encore meilleure.
xralf
11
Il semble que convert utilise le raster comme format intermédiaire. Cela provoque une apparence floue même lorsque le PDF d'origine contient des objets vectoriels.
ony
Est-ce que quelqu'un connaît un moyen de le faire sans rasteriser le contenu des pages en cours de route ... ou au moins pour régler une résolution plus élevée?
Tomislav Nakic-Alfirevic Le
cela a rendu les textes en images et créé le pdf à partir des images. Peut-être bien pour les photos mais inutile pour l'extraction de texte.
andrej
6

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 celui-ci:

  1. Divisez votre fichier avec pdfsam : 1 page = 1 fichier sur disque (Le format importe peu. Choisissez-en un que ImageMagick connaît. Je prendrais tout simplement les formats PS ou PDF.
  2. Pour chaque page, recadrer la première moitié et le mettre dans un fichier nommé $ {PageNumber} A

  3. Rognez 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 le faire.
TIC Tac
la source
1
Est-ce que l'utilisation d'ImageMagick ne pixellise pas les fichiers? Et vous devriez expliquer cette dernière partie en ligne, particulièrement au profit des non-francophones de l'auditoire.
Gilles, arrête de faire le mal,
Parce que vous n'avez pas besoin de comprendre le français. Il montre simplement comment vous pouvez utiliser uniquement les fonctions convert, pdftk ou ghostscript (gs) d'ImageMagick pour atteindre cet objectif. J'aime utiliser pdftk. Le "raster" n'a pas d'importance puisqu'il s'agit d'un document numérisé.
Tiktak
6

D'après la réponse de Gilles et comment trouver le nombre de pages PDF que 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

Donc je peux courir

./split.sh my.pdf 50 1.2

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

Anton Bessonov
la source
4

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()
moraes
la source
2

La meilleure solution a été mutool, voir ci-dessus:

sudo apt install mupdf-tools pdftk

la scission:

mutool poster -y 2 input.pdf output.pdf

mais alors vous devez faire pivoter les pages à gauche:

pdftk output.pdf cat 1-endleft output rotated.pdf
Eduard Florinescu
la source
Toujours pas de chevauchement ...
MUY Belgique
1

Basé sur la réponse de Benjamin sur AskUbuntu, je recommanderais d'utiliser l'outil graphique appelé gscan2pdf .

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

    entrez la description de l'image ici

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

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

    entrez la description de l'image ici

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

    entrez la description de l'image ici

  5. Appuyez sur OK et attendez jusqu'à ce que le travail est terminé.

    entrez la description de l'image ici

  6. Enregistrez le fichier PDF. Terminé.

Nanashi No Gombe
la source
Testé, échoué avec des documents pdf complexes avec une énorme quantité d'images.
MUY Belgique
0

La solution de moraes 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])
vbar
la source