2011-08-13 23 views
8

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

原始码:我有一个扫描的pdf,其中两个纸张并排放在一个PDF页面。我想将pdf页面分成两部分,最初的左半部分成为两个新的pdf页面中较早的部分。 pdf看起来像enter image description here

这是我的一个名为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) 

我尝试了剧本中的PDF与命令是un2up <page.pdf> out.pdf终端,但输出out.pdf没有正确分割。

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

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

回答

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) 
+0

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

+0

下载@Tim我更新了代码,以便它颠倒每隔一页的拆分顺序。这会正确地分割您的文件。 – stardt

+0

谢谢! (1)你知道为什么我们每隔两页需要切换'p'和'q'页吗?这是其他pdf文件的共同点,或只是特定于此? (2)我还想知道如何理解pdf页面上的坐标系,即p.mediaBox.lowerLeft是我们在查看pdf文件时看到的实际左下角或右上角?是我们看到的沿水平或垂直方向的第一个坐标吗? – Tim

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

我似乎无法得到这个工作。与@stardt不同,这个产生一个空文件。任何想法@moraes? –

0

我想补充一点,你必须付出你的mediaBox变量不能跨越副本pq共同关注。 如果您在复制之前从p.mediaBox中读取数据,很容易发生这种情况。

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

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

相关问题