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

时间:2012-11-12 14:35:06

标签: pdf layout pdf-generation split

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

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

-----------
| slide 1 |
-----------
| slide 2 |
-----------

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

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

10 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:10)

Briss是“用于裁剪PDF文件的简单跨平台(Linux,Windows,Mac OSX)应用程序。简单的用户界面允许您通过在视觉上覆盖的页面上拟合矩形来精确定义裁剪区域“。它是开源的(GPL)。

适合我。 GUI很小,但功能齐全。它也可以在命令行中使用。

答案 2 :(得分: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()

答案 3 :(得分:8)

mutool为此明智地工作。下面的示例将input.pdf的每一页切成3个水平和8个垂直部分(因此每1个输入创建24页输出):

mutool poster -x 3 -y 8 input.pdf output.pdf

要安装mutool,只需安装mupdf,它可能与大多数GNU / Linux发行版一起打包。

(致marttt的信用。)

在基于debian的Linux系统(如ubuntu)上,您可以使用

进行安装
sudo apt install mupdf
sudo apt install mupdf-tools

答案 4 :(得分: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()

答案 5 :(得分:1)

  

尝试BRISS

     

alt text

     

它允许您将每个页面拆分为任意数量的子页面   使用GUI定义区域。它将所有类似页面分组   对你而言,你可以为该组定义一次区域。

     

它是跨平台,免费和开源的。

(从https://superuser.com/a/235327/35237复制粘贴)

答案 6 :(得分:0)

如果您可以使用Java或.Net库,则可以使用iText / iTextSharp。

平铺现有文档的示例可以在iText in Action,第2版中的免费chapter 6TilingHero.java / TilingHero.cs中找到。

答案 7 :(得分:0)

感谢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()

答案 8 :(得分:0)

使用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

多么棒的工具! Merci infiniment!.. (输出文件~9MB比原始文件大52KB!)

答案 9 :(得分:0)

这是我使用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')