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.

21
demandé sur stackoverflowuser95 2012-11-12 18:35:05

9 réponses

PDF ciseaux m'a permis de diviser en vrac (crop) toutes les pages dans un PDF.

20
répondu stackoverflowuser95 2015-01-16 07:40:32

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.

9
répondu Nicolas Payette 2013-09-05 03:55:00

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()
8
répondu moraes 2013-04-01 12:23:41

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
8
répondu Skippy le Grand Gourou 2018-01-31 09:54:08

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()
5
répondu Hanspeter Schmid 2015-02-26 08:29:54

BRISS.

alt text

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)

1
répondu Tobias Kienzler 2017-03-20 10:04:20

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.

0
répondu mkl 2012-11-12 14:54:55

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()
0
répondu Matt Gumbley 2014-11-14 08:54:17

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

0
répondu Gepi 2016-04-07 04:49:13