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

时间:2011-08-13 00:20:46

标签: 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看起来像enter image description here

这是我的un2up名为#!/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) 的Python脚本,受Gilles启发:

un2up < page.pdf > out.pdf

我在终端的pdf上尝试了脚本,命令为out.pdf,但输出w未正确分割。

我还检查了变量hp.mediaBox.upperRight的值,514的输出,它们是1224和{{1}},它们看起来不像根据实际比例确定。

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

3 个答案:

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

答案 1 :(得分:1)

@ stardt的代码非常有用,但我在分割一批具有不同方向的pdf文件时遇到了问题。这是一个更通用的功能,无论页面方向如何都可以使用:

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

答案 2 :(得分:0)

我想补充一点,您必须注意不要在副本mediaBoxp之间共享q个变量。 如果您在复制前从p.mediaBox读取,则很容易发生这种情况。

在这种情况下,写入例如p.mediaBox.upperRight可以修改q.mediaBox,反之亦然。

@moraes'解决方案通过显式复制mediaBox来解决这个问题。