Ответ 1
Я не очень хорошо знаком с PyPDF, но знаю, что Ghostscript сможет сделать это за вас. Вот ссылки на некоторые другие ответы на похожие вопросы:
- Конвертировать PDF 2 стороны на страницу до 1 стороны на страницу (SuperUser.com)
- Freeware, чтобы разделить PDF-страницы посередине? (SuperUser.com)
- Обрезка PDF с помощью Ghostscript 9.01 (StackOverflow.com)
Третий ответ, вероятно, заставил вас сказать: "Я понимаю, что он не будет работать с каждым PDF файлом". Он использует команду pdfmark, чтобы попытаться установить /CropBox
в объекты страницы PDF.
Метод первых двух ответов, скорее всего, будет успешным, если третий не удастся. Этот метод использует фрагмент команды PostScript <</PageOffset [NNN MMM]>> setpagedevice
для перемещения и размещения страниц PDF на (меньшем) размере носителя, определяемом параметром -gNNNNxMMMM
(который определяет ширину и высоту устройства в пикселях).
Если вы понимаете концепцию первых двух ответов, вы легко сможете адаптировать метод, используемый там для обрезки полей на всех четырех краях страницы PDF:
Пример команды для обрезания PDF с размером буквы (8.5x11in == 612x792pt) на полдюйма (== 36pt) на каждом из четырех ребер (команда для Windows):
gswin32c.exe ^
-o cropped.pdf ^
-sDEVICE=pdfwrite ^
-g5400x7200 ^
-c "<</PageOffset [-36 -36]>> setpagedevice" ^
-f input.pdf
Результирующий размер страницы будет 7.5x10in (== 540x720pt). Чтобы сделать то же самое на Linux или Mac, используйте:
gs \
-o cropped.pdf \
-sDEVICE=pdfwrite \
-g5400x7200 \
-c "<</PageOffset [-36 -36]>> setpagedevice" \
-f input.pdf
Обновление: как определить "поля" с помощью Ghostscript
В комментарии задано "автоматическое" определение белых полей. Вы можете использовать Ghostscript для этого. Его устройство bbox
может определять область, покрываемую (виртуальными) чернилами на каждой странице (и, следовательно, косвенно - пробел для каждого края холста).
Вот команда:
gs \
-q -dBATCH -dNOPAUSE \
-sDEVICE=bbox \
input.pdf
Выход (пример):
%%BoundingBox: 57 29 562 764
%%HiResBoundingBox: 57.265030 29.347046 560.245045 763.649977
%%BoundingBox: 57 28 562 667
%%HiResBoundingBox: 57.265030 28.347046 560.245045 666.295011
Устройство bbox
отображает каждую PDF-страницу в памяти (без записи вывода на диск), а затем печатает информацию BoundingBox и HiResBoundingBox до stderr
. Вы можете изменить эту команду так, чтобы облегчить анализ результатов:
gs \
-q -dBATCH -dNOPAUSE \
-sDEVICE=bbox \
input.pdf \
2>&1 \
| grep -v HiResBoundingBox
Выход (пример):
%%BoundingBox: 57 29 562 764
%%BoundingBox: 57 28 561 667
Это скажет вам...
- ... что нижний левый угол прямоугольника содержимого Page 1 находится в координате
[57 29]
, а верхний правый угол -[562 741]
- ... что нижний левый угол прямоугольника содержимого Page 2 находится в координате
[57 28]
, а верхний правый угол -[561 667]
Это означает:
- Page 1 использует пробел 57pt на левом краю (
72pt == 1in == 25,4mm
). - Page 1 использует пробел в 29pt на нижнем краю.
- Page 2 использует пробел 57pt на левом краю.
- Page 2 использует пробел 28pt на нижнем краю.
Как видно из этого простого примера, пробелы не одинаковы для каждой страницы. В зависимости от ваших потребностей (вы, вероятно, хотите иметь одинаковый размер для каждой страницы многостраничного PDF файла, нет?), Вам нужно выяснить, каковы минимальные поля для каждого края на всех страницах документа.
Теперь как насчет пробелов в правом и верхнем краях? Чтобы вычислить это, вам нужно знать исходный размер страницы для каждой страницы. Самый простой способ определить это: утилита pdfinfo
. Пример команды для 5-страничного PDF:
pdfinfo \
-f 1 \
-l 5 \
input.pdf \
| grep "Page "
Выход (пример):
Page 1 size: 612 x 792 pts (letter)
Page 2 size: 612 x 792 pts (letter)
Page 3 size: 595 x 842 pts (A4)
Page 4 size: 842 x 1191 pts (A3)
Page 5 size: 612 x 792 pts (letter)
Это поможет вам определить требуемый размер холста и требуемые (максимальные) белые края верхнего и правого краев каждой из ваших новых страниц PDF.
Конечно, эти вычисления также могут быть написаны сценарием.
Но если ваши PDF файлы - это все размер страницы uniq, или если они являются 1-страничными документами, все это намного проще сделать...