我如何“取消预订”pdf

TSG*_*SGM 10 command-line pdf pdftk

我有一个被做成小册子格式的 pdf 文件。它旨在横向打印在 A4 纸上;这是pdf中的两页,应该对应于实际书中的四页。

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (1)       |      (3)       |
|              |                |
|              |                |
|              |                |
 ------------------------------- 

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------
Run Code Online (Sandbox Code Playgroud)

括号内的数字对应于各个页面的顺序。

我知道在 linux 上有各种各样的命令(pdfbook、pdfnup 等)(这可能是用来制作这本小册子的)。我如何“取消预订”——也就是说,我想从中制作一个 pdf 文档,其中最终产品的每个单独页面都是 pdf 的单独页面,以通常的方式排序。

编辑

感谢 Gilles,我设法使用了以下代码:

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    print >> sys.stderr, 'splitting page',i
    print >> sys.stderr, '\tlowerLeft:',p.mediaBox.lowerLeft
    print >> sys.stderr, '\tupperRight:',p.mediaBox.upperRight

    p.mediaBox.upperRight = (ur[0], (bl[1]+ur[1])/2)
    p.mediaBox.lowerLeft = bl

    q.mediaBox.upperRight = ur
    q.mediaBox.lowerLeft = (bl[0], (bl[1]+ur[1])/2)

    if i % 2 == 0:
        output.addPage(p)
        qold = q
    else:
        output.addPage(q)
        output.addPage(qold)
        output.addPage(p)
output.write(sys.stdout)
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 4

下面是一个使用PyPdf 库完成这项工作的小型 Python 脚本。(源自un2up。)将其保存在名为 的脚本中unbook,使其可执行 ( chmod +x unbook),并将其作为过滤器运行 ( unbook <book.pdf >1up.pdf)。

我在 的输出上测试了这个脚本pdfbook --signature=N。对于另一种方法,您可能不需要反转每个其他输入页面,并且页面顺序可能不同(这取决于横向页面的方向)。页面布局与您的问题不符;13,42 对我来说没有意义(在 4 页的书中,3 应该紧挨着 2,而不是紧挨着 1)。

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    if i % 2 == 0:
        p.rotateClockwise(180)
        q.rotateClockwise(180)
        output.addPage(p)
        second_half.append(q)
    else:
        output.addPage(p)
        second_half.append(q)
second_half.reverse()
for q in second_half: output.addPage(q)
output.write(sys.stdout)
Run Code Online (Sandbox Code Playgroud)

忽略任何弃用警告;只有 PyPdf 维护者需要关心这些。