为什么我的代码没有正确分割扫描的pdf中的每一页?

Tim*_*Tim 9 python pdf pypdf

更新:感谢stardt的脚本有效!pdf是另一个页面.我在另一个上尝试了脚本,它也正确地吐出每个pdf页面,但页码的顺序有时是正确的,有时是错误的.例如,在pdf文件的第25-28页,打印的页码是14,15,17,是16.我想知道为什么?整个pdf可以从http://download304.mediafire.com/u6ewhjt77lzg/bgf8uzvxatckycn/3.pdf下载.

原文:我有一个扫描的pdf,其中两个纸页并排放在pdf页面中.我想将pdf页面分成两部分,原来的左半部分成为两个新pdf页面中较早的一部分.pdf看起来像在此输入图像描述.

这是我的un2up灵感来自Gilles的 Python脚本:

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight

    p.mediaBox.upperLeft = (0, h/2)
    p.mediaBox.upperRight = (w, h/2)
    p.mediaBox.lowerRight = (w, 0)
    p.mediaBox.lowerLeft = (0, 0)

    q.mediaBox.upperLeft = (0, h)
    q.mediaBox.upperRight = (w, h)
    q.mediaBox.lowerRight = (w, h/2)
    q.mediaBox.lowerLeft = (0, h/2)

    output.addPage(q)
    output.addPage(p)
output.write(sys.stdout)
Run Code Online (Sandbox Code Playgroud)

我在终端的pdf上尝试了脚本命令un2up < page.pdf > out.pdf,但输出out.pdf没有正确分割.

我还检查变量的值wh,输出p.mediaBox.upperRight,他们是5141224它的权利根据自己的实际比例不看.

该文件可以从http://download851.mediafire.com/bdr4sv7v5nzg/raci13ct5w4c86j/page.pdf下载.

sta*_*rdt 7

你的代码假定p.mediaBox.lowerLeft是(0,0)但它实际上是(0,497)

这适用于您提供的文件:

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
for i in range(input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    bl = p.mediaBox.lowerLeft
    ur = p.mediaBox.upperRight

    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(q)
        output.addPage(p)
    else:
        output.addPage(p)
        output.addPage(q)

output.write(sys.stdout)
Run Code Online (Sandbox Code Playgroud)