我如何“取消预订” PDF


10

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

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

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------

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

我知道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)

1
我认为这应该去superuser.com
Adam Zalcman 2012年

@AdamZalcman为什么?他正在寻找Linux程序
Michael Mrozek

2
sr_

您确定没有交换第3页和第4页吗?我从事印刷工作;该布局没有任何意义
。...–通配符

Answers:


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)

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


之前有人问过这个问题,但是我在实施您的解决方案时遇到了麻烦。我正在运行OSX,并通过MacPorts安装了python和py27-pypdf。我创建了一个取消预订文件,然后复制并粘贴了脚本。按照说明运行命令将创建一个新的1up.pdf文件,其中包含0个字节。我的终端没有列出任何错误或任何内容,但是执行命令后,什么也没发生(我必须CTRL-C退出);系统不会挂起,并且似乎没有执行任何操作。我如何找到问题所在?@Gilles
TSGM 2012年

@TSGM最可能的解释是您忘记<了输入文件之前的。如果您确实完全确定正确编写了该命令,则可能是PyPdf库中的一个错误(它并没有使我失望,但是有可能发生)。
吉尔(Gilles)'所以

问题是我应该通过“ python unbook <in.pdf> out.pdf”调用python。傻我 另外,您的代码有点奇怪(它的结尾都贴了second_half页面。我似乎已经按照我在原始帖子中所写的格式对其进行了更正)。我已经编辑了原始回复,以包含最终使用的代码。另外,页面大小命令似乎是错误的。我也纠正了。@Gilles
TSGM 2012年

@TSGM代码假定正面布局为1 | 4,背面布局为2 | 3,这是通常的书本布局。如果页面的布局不同,则可能需要进行调整。在该环境中进行了现场测试。您必须明确打电话python是我的错:我应该加上一个shebang线。
吉尔斯(Gillles)“所以-别再作恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.