Ответ 1
PDF Scissors позволили мне разделить (обрезать) все страницы в формате PDF.
У меня есть большое количество PDF файлов, которые имеют две слайды на странице (для печати).
Формат - это страницы формата A4 с двумя настройками слайдов:
-----------
| slide 1 |
-----------
| slide 2 |
-----------
Как создать новый PDF файл с одним слайдом на странице?
Счастлив использовать графический интерфейс, CLI, скрипты или даже интерфейс с языковой библиотекой PDF; но мне нужно, чтобы текст на слайдах по-прежнему можно было выбрать.
PDF Scissors позволили мне разделить (обрезать) все страницы в формате PDF.
Briss - это простое кросс-платформенное приложение (Linux, Windows, Mac OSX) для обрезки PDF файлов. Простой пользовательский интерфейс позволяет точно определить области обрезки путем установки прямоугольника на визуально наложенных страницах ". Это открытый источник (GPL).
Хорошо работает для меня. Графический интерфейс минимален, но функциональен. Его также можно использовать из командной строки.
Вы можете использовать библиотеку 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()
Спасибо Мэтту Гэмбли за его 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()
mutool
работает блестяще для этого. Пример ниже будет разбивать каждую страницу input.pdf
на 3 горизонтальные и 8 вертикальных частей (таким образом создавая 24 страницы вывода для каждого 1 входа):
mutool poster -x 3 -y 8 input.pdf output.pdf
Чтобы установить mutool
, просто установите mupdf
, который, вероятно, упакован с большинством дистрибутивов GNU/Linux.
(Кредиты marttt.)
Попробуйте BRISS.
Это позволяет вам разбивать каждую страницу на столько подстраниц, сколько хотите определяя регионы с графическим интерфейсом. Он группирует все похожие страницы в группы для вас, так что вы можете определить области для этой группы один раз.
Это кросс-платформенный, бесплатный и открытый источник.
(скопировано из https://superuser.com/a/235327/35237)
Если использование библиотеки Java или .Net подходит для вас, вы можете использовать iText/iTextSharp.
Пример для разбивки существующего документа можно найти в книге iText in Action, 2nd edition, в свободно доступной главе 6: TilingHero.java/TilingHero.cs.
Благодаря морали для этого ответа. В моем случае полученный 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()
С 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 КБ больше оригинала!)