Diviser chaque page PDF en deux?
j'ai un grand nombre de fichiers PDF qui ont deux diapositives vers une page (pour l'impression).
le format est A4 pages chacune avec deux diapositives setup comme ceci:
-----------
| slide 1 |
-----------
| slide 2 |
-----------
Comment puis-je générer un nouveau fichier PDF avec une diapositive par page?
heureux d'utiliser GUI, CLI, scripts ou même interface avec la bibliothèque PDF d'une langue; mais j'ai besoin que le texte sur les diapos soit toujours sélectionnable.
9 réponses
PDF ciseaux m'a permis de diviser en vrac (crop) toutes les pages dans un PDF.
Briss est " une simple application multiplateformes (Linux, Windows, Mac OSX) pour recadrer les fichiers PDF. Une interface utilisateur simple vous permet de définir exactement la région de récolte en ajustant un rectangle sur les pages visuellement superposées."C'est open source (GPL).
Fonctionne bien pour moi. L'interface graphique est minime, mais fonctionnelle. Il peut également être utilisé en ligne de commande.
Vous pouvez utiliser une bibliothèque Python appelée PyPDF. Cette fonction divisera les pages doubles peu importe 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()
mutool
fonctionne brillamment pour cela. L'exemple ci-dessous hachez chaque page input.pdf
en 3 parties horizontales et 8 parties verticales (créant ainsi 24 pages de sortie pour chaque 1 d'entrée):
mutool poster -x 3 -y 8 input.pdf output.pdf
installer mutool
, il suffit de l'installer mupdf
, qui est probablement empaqueté avec la plupart des distributions GNU/Linux.
(crédits à marttt.)
sur les systèmes linux basés sur debian comme ubuntu, vous pouvez l'installer en utilisant
sudo apt install mupdf
sudo apt install mupdf-tools
merci à Matt Gumbley pour son Script Python. J'ai modifié ce script Python de telle sorte qu'il fonctionne maintenant aussi avec des fichiers PDF qui contiennent des pages de portrait et de paysage et des pages recadrées:
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 26 08:49:39 2015
@author: Matt Gumbley (stackoverflow)
changed by Hanspeter Schmid to deal with already cropped pages
"""
import copy
import math
from PyPDF2 import PdfFileReader, PdfFileWriter
def split_pages2(src, dst):
src_f = file(src, 'r+b')
dst_f = file(dst, 'w+b')
input = PdfFileReader(src_f)
output = PdfFileWriter()
for i in range(input.getNumPages()):
# make two copies of the input page
pp = input.getPage(i)
p = copy.copy(pp)
q = copy.copy(pp)
# the new media boxes are the previous crop boxes
p.mediaBox = copy.copy(p.cropBox)
q.mediaBox = copy.copy(p.cropBox)
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 = x1+math.floor((x3-x1)/2), x2+math.floor((x4-x2)/2)
if (x3-x1) > (x4-x2):
# horizontal
q.mediaBox.upperRight = (x5, x4)
q.mediaBox.lowerLeft = (x1, x2)
p.mediaBox.upperRight = (x3, x4)
p.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)
p.artBox = p.mediaBox
p.bleedBox = p.mediaBox
p.cropBox = p.mediaBox
q.artBox = q.mediaBox
q.bleedBox = q.mediaBox
q.cropBox = q.mediaBox
output.addPage(q)
output.addPage(p)
output.write(dst_f)
src_f.close()
dst_f.close()
Il vous permet de diviser chaque page en autant de sous-pages que vous voulez en définition des régions avec une interface graphique. Il regroupe toutes les pages similaires en groupes pour vous, donc vous pouvez définir des régions pour ce groupe une fois.
Il est multi-plateforme, libre et open-source.
(copier-collé à partir de https://superuser.com/a/235327/35237)
si L'utilisation D'une bibliothèque Java ou .Net vous convient, vous pouvez utiliser iText / iTextSharp.
un exemple de mise en page d'un document existant peut être trouvé dans le livre iText in Action, 2e édition, dans le librement disponible chapitre 6: TilingHero.java/ TilingHero.cs.
merci à moraes pour cette réponse. Dans mon cas, le PDF résultant avait l'air bien dans Adobe Reader et Mac preview, mais ne semblait pas avoir été divisé en pages séparées du tout lors de la visualisation sur iOS. J'ai utilisé Python 2.7.8 et PyPDF 2, et j'ai modifié le script comme suit, ce qui a bien fonctionné. (et réorganisé les pages gauche/droite, plutôt que Droite/Gauche).
import copy
import math
from PyPDF2 import PdfFileReader, PdfFileWriter
def split_pages(src, dst):
src_f = file(src, 'r+b')
dst_f = file(dst, 'w+b')
input = PdfFileReader(src_f)
output = 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)
p.artBox = p.mediaBox
p.bleedBox = p.mediaBox
p.cropBox = p.mediaBox
q.artBox = q.mediaBox
q.bleedBox = q.mediaBox
q.cropBox = q.mediaBox
output.addPage(q)
output.addPage(p)
output.write(dst_f)
src_f.close()
dst_f.close()
mupdf-1.8-windows-x64
, dans win10 CMD, vous devez avoir 'affiche ' (suivi de l'espace et sans guillemets) avant le paramètre horizontal (- x ).
Par exemple, pour un scan bi-Pagé en PDF:
mutool poster-x 2-y 1 C:\Users\alfie\Documents\SNM\The_Ultimate_Medicine.
C:\Users\alfie\Documents\ebooks\The_Ultimate_Medicine.pdf
Quel merveilleux outil! Merci infiniment !.. (et le fichier de sortie ~9MB est seulement 52KB plus grand que le original!)