Подтвердить что ты не робот

Разделить каждую страницу PDF на две части?

У меня есть большое количество PDF файлов, которые имеют две слайды на странице (для печати).

Формат - это страницы формата A4 с двумя настройками слайдов:

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

Как создать новый PDF файл с одним слайдом на странице?

Счастлив использовать графический интерфейс, CLI, скрипты или даже интерфейс с языковой библиотекой PDF; но мне нужно, чтобы текст на слайдах по-прежнему можно было выбрать.

4b9b3361

Ответ 1

PDF Scissors позволили мне разделить (обрезать) все страницы в формате PDF.

Ответ 2

Briss - это простое кросс-платформенное приложение (Linux, Windows, Mac OSX) для обрезки PDF файлов. Простой пользовательский интерфейс позволяет точно определить области обрезки путем установки прямоугольника на визуально наложенных страницах ". Это открытый источник (GPL).

Хорошо работает для меня. Графический интерфейс минимален, но функциональен. Его также можно использовать из командной строки.

Ответ 3

Вы можете использовать библиотеку Python под названием PyPDF. Эта функция разделяет две страницы независимо от ориентации страницы:

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

Ответ 4

Спасибо Мэтту Гэмбли за его Python Script. Я изменил этот Python script таким образом, что теперь он также работает с PDF файлами, которые содержат портретные и альбомные страницы и обрезанные страницы:

# -*- 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

mutool работает блестяще для этого. Пример ниже будет разбивать каждую страницу input.pdf на 3 горизонтальные и 8 вертикальных частей (таким образом создавая 24 страницы вывода для каждого 1 входа):

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

Чтобы установить mutool, просто установите mupdf, который, вероятно, упакован с большинством дистрибутивов GNU/Linux.

(Кредиты marttt.)

Ответ 6

Попробуйте BRISS.

alt text

Это позволяет вам разбивать каждую страницу на столько подстраниц, сколько хотите определяя регионы с графическим интерфейсом. Он группирует все похожие страницы в группы для вас, так что вы можете определить области для этой группы один раз.

Это кросс-платформенный, бесплатный и открытый источник.

(скопировано из https://superuser.com/a/235327/35237)

Ответ 7

Если использование библиотеки Java или .Net подходит для вас, вы можете использовать iText/iTextSharp.

Пример для разбивки существующего документа можно найти в книге iText in Action, 2nd edition, в свободно доступной главе 6: TilingHero.java/TilingHero.cs.

Ответ 8

Благодаря морали для этого ответа. В моем случае полученный PDF файл выглядел отлично в превью Adobe Reader и Mac, но, похоже, он не был разбит на отдельные страницы вообще при просмотре на iOS. Я использовал Python 2.7.8 и PyPDF 2 и модифицировал script следующим образом, который работал нормально. (и переупорядочивает страницы влево/вправо, а не вправо/влево).

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

Ответ 9

С mupdf-1.8-windows-x64, в win10 CMD, перед горизонтальным параметром (-x) вам нужно иметь < плакат '(за которым следует пробел и без кавычек). Например, для двухстраничного сканирования в PDF:

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

Какой замечательный инструмент! Мерси инфинити!.. (и выходной файл ~ 9 МБ только на 52 КБ больше оригинала!)