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 )?
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:
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-recommended et peut-être (sur Ubuntu: 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
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.
Imagemagick peut le faire en une seule étape:
$ convert in.pdf -crop 50%x0 +repage out.pdf
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.
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:
Pour chaque page, recadrez la première moitié et placez-le dans un fichier nommé $ {PageNumber} A
Recadrez la seconde moitié et placez-la dans un fichier nommé $ {PageNumber} B.
Vous obtenez 1A.pdf, 1B.pdf, 2A.pdf, 2B.pdf, etc.
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()
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
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])
Sur la base de réponse de Benjamin chez AskUbuntu, je recommanderais d'utiliser l'outil GUI appelé gscan2pdf .
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.
Cela peut prendre un certain temps selon la taille du document. Attendez qu'il se charge.
Appuyez sur Ctrl + A pour sélectionner toutes les pages, puis tournez (Ctrl + Maj + C) les si nécessaire.
Allez dans Outils >> Nettoyer . Sélectionnez Disposition comme double et # pages de sortie = 2 .
Appuyez sur [~ # ~] ok [~ # ~] et attendez que le travail soit terminé.
Enregistrez le fichier PDF. Terminé.