将每个PDF页面拆分为两个?

sta*_*r95 23 pdf layout pdf-generation split

我有大量的PDF文件,其中有两张幻灯片到页面(用于打印).

格式为A4页面,每个页面都有两个幻灯片设置如下:

-----------
| slide 1 |
-----------
| slide 2 |
-----------
Run Code Online (Sandbox Code Playgroud)

如何生成每页一张幻灯片的新PDF文件?

很高兴使用GUI,CLI,脚本甚至与语言的PDF库接口; 但我确实需要幻灯片上的文字仍然可以选择.

sta*_*r95 20

PDF Scissors允许我批量拆分(裁剪)PDF中的所有页面.

  • 网站死了:-( (2认同)

Nic*_*tte 10

Briss是一个简单的跨平台(Linux,Windows,Mac OSX)应用程序,用于裁剪PDF文件.简单的用户界面允许您通过在视觉上重叠的页面上安装矩形来精确定义裁剪区域." 它是开源的(GPL).

对我来说效果很好.GUI很小,但功能齐全.它也可以从命令行使用.


mor*_*aes 8

您可以使用名为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)


Ski*_*rou 8

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)

  • @kaslusimoes我猜你的输入文件方向与“mutool”期望不一致,在这种情况下,你可以在输入文件上使用例如“pdf180”(来自“pdfjam”),然后再使用“mutool”。另一方面,如果您的输入文件排序更复杂,您可以使用“mutool clean input.pdf output.pdf 2,1,3,4,6,5”手动重新排列页面,其中“2,1,3,4” ,6,5` 是您想要的新顺序。 (2认同)

小智 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)