我有大量的 PDF 文件,每页有两张幻灯片(用于打印)。
格式是 A4 页面,每个页面都有两张幻灯片,如下所示:
-----------
| slide 1 |
-----------
| slide 2 |
-----------
如何生成每页一张幻灯片的新 PDF 文件?
乐于使用 GUI、CLI、脚本甚至是与一种语言的 PDF 库的接口;但我确实需要幻灯片上的文本仍然可以选择。
我有大量的 PDF 文件,每页有两张幻灯片(用于打印)。
格式是 A4 页面,每个页面都有两张幻灯片,如下所示:
-----------
| slide 1 |
-----------
| slide 2 |
-----------
如何生成每页一张幻灯片的新 PDF 文件?
乐于使用 GUI、CLI、脚本甚至是与一种语言的 PDF 库的接口;但我确实需要幻灯片上的文本仍然可以选择。
PDF Scissors允许我批量拆分(裁剪)PDF 中的所有页面。
mutool
为此出色地工作。下面的示例将每页切input.pdf
分为 3 个水平部分和 8 个垂直部分(因此为每 1 个输入创建 24 页输出):
mutool poster -x 3 -y 8 input.pdf output.pdf
要安装mutool
,只需 install mupdf
,它可能与大多数 GNU/Linux 发行版一起打包。
(归功于 martt。)
在 ubuntu 等基于 debian 的 linux 系统上,您可以使用
sudo apt install mupdf
sudo apt install mupdf-tools
Briss是“一个用于裁剪 PDF 文件的简单跨平台(Linux、Windows、Mac OSX)应用程序。一个简单的用户界面让您可以通过在视觉重叠的页面上放置一个矩形来准确定义裁剪区域。” 它是开源的(GPL)。
对我来说效果很好。GUI 很小,但很实用。它也可以从命令行使用。
You can use a Python library called PyPDF. This function will split double pages no matter what the page orientation is:
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()
感谢 Matt Gumbley 的 Python 脚本。我已经修改了 Python 脚本,使其现在也适用于包含纵向和横向页面以及裁剪页面的 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()
这是我如何做到的pdfrw
:
import sys, os, pdfrw
writer = pdfrw.PdfWriter()
for page in pdfrw.PdfReader('input.pdf').pages:
for y in [0, 0.5]:
newpage = pdfrw.PageMerge()
newpage.add(page, viewrect=(0, y, 1, 0.5))
writer.addpages([newpage.render()])
writer.write('output.pdf')
短而有效!
如果您希望它旋转(例如:输入 A4 纵向,输出 2 A5 纵向而不是横向):
import sys, os, pdfrw
writer = pdfrw.PdfWriter()
for page in pdfrw.PdfReader('input.pdf').pages:
for y in [0, 0.5]:
newpage = pdfrw.PageMerge()
newpage.add(page, viewrect=(0, y, 1, 0.5))
p = newpage.render()
p.Rotate = 270
writer.addpages([p])
writer.write('output.pdf')
试试BRISS。
它允许您通过使用 GUI 定义区域来将每个页面拆分为任意数量的子页面。它为您将所有相似的页面分组,因此您可以为该组定义一次区域。
它是跨平台的、免费的和开源的。
如果您可以使用 Java 或 .Net 库,则可以使用 iText / iTextSharp。
可以在免费提供的第 6 章:TilingHero.java / TilingHero.cs中的 iText in Action,第 2 版一书中找到平铺现有文档的示例。
感谢 moraes 的回答。就我而言,生成的 PDF 在 Adobe Reader 和 Mac 预览中看起来不错,但在 iOS 上查看时似乎根本没有分成单独的页面。我使用了 Python 2.7.8 和 PyPDF 2,并将脚本修改如下,效果很好。(并重新排列页面左/右,而不是右/左)。
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 海报 -x 2 -y 1 C:\Users\alfie\Documents\SNM\The_Ultimate_Medicine.pdf C:\Users\alfie\Documents\ebooks\The_Ultimate_Medicine.pdf
多么美妙的工具啊!谢谢无限!..(输出文件 ~9MB 仅比原始文件大 52KB!)