sta*_*r95 23 pdf layout pdf-generation split
我有大量的PDF文件,其中有两张幻灯片到页面(用于打印).
格式为A4页面,每个页面都有两个幻灯片设置如下:
-----------
| slide 1 |
-----------
| slide 2 |
-----------
Run Code Online (Sandbox Code Playgroud)
如何生成每页一张幻灯片的新PDF文件?
很高兴使用GUI,CLI,脚本甚至与语言的PDF库接口; 但我确实需要幻灯片上的文字仍然可以选择.
您可以使用名为PyPDF的Python库.无论页面方向如何,此功能都将拆分双页:
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()
Run Code Online (Sandbox Code Playgroud)
mutool
为此而努力工作.下面的示例将每页input.pdf
分成3个水平和8个垂直部分(因此每1个输入创建24页输出):
mutool poster -x 3 -y 8 input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)
要安装mutool
,只需安装mupdf
,这可能与大多数GNU/Linux发行版一起打包.
(对马特来说.)
在像ubuntu这样基于debian的linux系统上,你可以使用它来安装它
sudo apt install mupdf
sudo apt install mupdf-tools
Run Code Online (Sandbox Code Playgroud)
小智 5
感谢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()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26685 次 |
最近记录: |