web-dev-qa-db-fra.com

Split chaque PDF page en deux?

J'ai un grand nombre de fichiers PDF comportant deux diapositives par page (pour l'impression).

Le format est A4 pages chacune avec deux diapositives configuration comme suit:

-----------
| slide 1 |
-----------
| slide 2 |
-----------

Comment puis-je générer un nouveau fichier PDF avec une diapositive par page?

Heureux d'utiliser l'interface graphique, l'interface de ligne de commande, les scripts ou même l'interface avec la bibliothèque PDF d'un langage; mais j'ai besoin que le texte sur les diapositives soit toujours sélectionnable.

22

PDF Les ciseaux m'ont permis de fractionner toutes les pages d'un PDF.

20

Briss est "une application multiplate-forme simple (Linux, Windows, Mac OSX) permettant de rogner des fichiers PDF. Une interface utilisateur simple vous permet de définir exactement la région de recadrage en ajustant un rectangle sur le calque superposé visuellement. pages. " C'est open source (GPL).

Fonctionne bien pour moi. L'interface graphique est minimale, mais fonctionnelle. Il peut également être utilisé à partir de la ligne de commande.

10
Nicolas Payette

mutool travaille brillamment pour cela. L'exemple ci-dessous coupera chaque page de input.pdf en 3 parties horizontales et 8 parties verticales (créant ainsi 24 pages de sortie pour chaque 1 entrée):

mutool poster -x 3 -y 8 input.pdf output.pdf

Pour installer mutool, installez simplement mupdf , qui est probablement fourni 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 à l’aide de

Sudo apt install mupdf
Sudo apt install mupdf-tools
8

Vous pouvez utiliser une bibliothèque Python appelée PyPDF. Cette fonction divise les doubles pages, 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()
8
moraes

Merci à Matt Gumbley pour son script Python. J'ai modifié ce script Python pour qu'il fonctionne désormais également avec les PDF contenant des pages portrait et 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
Hanspeter Schmid

Essayez BRISS .

alt text

Il vous permet de diviser chaque page en autant de sous-pages que vous le souhaitez en définir des régions avec une interface graphique. Il regroupe toutes les pages similaires en groupes pour vous, afin que vous puissiez définir des régions pour ce groupe une fois.

Il est multi-plateforme, gratuit et open-source.

(copier-coller depuis https://superuser.com/a/235327/35237 )

1
Tobias Kienzler

Merci à moraes pour cette réponse. Dans mon cas, le résultat PDF obtenu dans les aperçus d'Adobe Reader et Mac, ne semblait pas avoir été divisé en pages distinctes du tout lors de l'affichage sur iOS. J'ai utilisé Python 2.7.8 et PyPDF 2 et 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
Matt Gumbley

Si vous utilisez une bibliothèque Java ou .Net, vous pouvez utiliser iText/iTextSharp.

Vous trouverez un exemple de mosaïque d'un document existant dans l'ouvrage iText in Action, 2e édition, dans la section disponible gratuitement chapitre 6 : TilingHero.Java / TilingHero.cs .

0
mkl

Avec mupdf-1.8-windows-x64, dans win10 CMD, vous devez avoir ' poster ' (suivi de l'espace et sans guillemets) avant le paramètre horizontal (-x) . Par exemple, pour une numérisation au format PDF à double page:

affiche mutool -x 2 -y 1 C:\Utilisateurs\alfie\Documents\SNM\The_Ultimate_Medicine.pdf C:\Utilisateurs\alfie\Documents\ebooks\The_Ultimate_Medicine.pdf

Quel outil formidable! Merci infiniment! .. (Et le fichier de sortie ~ 9 Mo ne fait que 52 Ko de plus que l'original!)

0
Gepi