Почему мой код неправильно разделяет каждую страницу в отсканированном PDF? - PullRequest
9 голосов
/ 13 августа 2011

Обновление: Спасибо stardt, чей скрипт работает!PDF это страница другого.Я попробовал скрипт на другом, и он также правильно выплевывает каждую страницу PDF, но порядок номеров страниц иногда правильный, а иногда и неправильный.Например, на стр. 25-28 файла pdf напечатаны номера страниц 14, 15, 17, 16. Мне было интересно, почему?Весь PDF-файл можно загрузить с http://download304.mediafire.com/u6ewhjt77lzg/bgf8uzvxatckycn/3.pdf

Оригинал: У меня есть отсканированный PDF-файл, где две страницы бумаги располагаются рядом на одной странице PDF.Я хотел бы разделить страницу pdf на две части, при этом исходная левая половина стала более ранней из двух новых страниц pdf.PDF выглядит как enter image description here.

Вот мой Python-скрипт с именем un2up, вдохновленный Gilles :

#!/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 неправильно разделен.

Я также проверил значения переменных w и h, выходные данные p.mediaBox.upperRight, и они равны 514 и 1224, которые выглядят неправильно, исходя из их фактического соотношения.

Файл можно скачать с http://download851.mediafire.com/bdr4sv7v5nzg/raci13ct5w4c86j/page.pdf.

Ответы [ 3 ]

7 голосов
/ 13 августа 2011

Ваш код предполагает, что 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 голос
/ 01 апреля 2013
Код

@ 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 голосов
/ 14 августа 2013

Я хотел бы добавить, что вы должны обратить внимание, что ваши mediaBox переменные не являются общими для копий p и q. Это может легко произойти, если вы прочитали с p.mediaBox перед тем, как взять копию.

В этом случае пишите, например, p.mediaBox.upperRight может изменить q.mediaBox и наоборот.

@ Морас 'решение заботится об этом, явно копируя mediaBox.

...