Як я "скасовую" PDF-файл


10

У мене є pdf-файл, який було зроблено у форматі буклета. Він призначений для друку на папері формату А4 у пейзажній орієнтації; ось дві сторінки у форматі pdf, які мають відповідати чотирьом сторінкам фактичної книги.

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

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

Короткі цифри відповідають порядку окремих сторінок.

Я знаю, що на Linux є всілякі команди (pdfbook, pdfnup тощо) (які, ймовірно, використовувались для виготовлення цієї буклети в першу чергу). Як я "скасую" книгу --- тобто, я хотів би зробити з цього документ pdf, коли кожна окрема сторінка кінцевого продукту - це окрема сторінка pdf, упорядкована звичайним чином.

Редагувати

Завдяки Джилсу мені вдалося використати наступний код:

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
Адам Зальцман

@AdamZalcman Чому? Він шукає програму Linux
Майкл Мрозек


Ви впевнені, що не поміняли сторінки 3 та 4? Я працював у поліграфії; що макет не має сенсу ....
Wildcard

Відповіді:


4

Ось невеликий скрипт Python з використанням бібліотеки PyPdf, яка виконує цю роботу. (Похідне від 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, встановив python та py27-pypdf через MacPorts. Я створив файл unbook, скопіював і вставив сценарій. Запуск команди за інструкцією створює новий файл 1up.pdf з 0 байтами. У моєму терміналі не вказано жодної помилки чи нічого, але при виконанні команди нічого не відбувається (я повинен вийти CTRL-C); система не висить і, здається, нічого не робить. Як я можу виявити проблему? @Gilles
TSGM

@TSGM Найбільш вірогідним поясненням є те, що ви забули <раніше вхідний файл. Якщо ви справді абсолютно впевнені, що правильно написали команду, це може бути помилка в бібліотеці PyPdf (вона ще не підвела мене, але це може статися).
Жил 'ТАК - перестань бути злим'

Проблема полягала в тому, що я повинен був викликати python через "python unbook <in.pdf> out.pdf". Дурний мене. Крім того, ваш код був дещо дивним (він наклеював на друге сторінки second_half всі наприкінці. Здається, я виправив його на той формат, який я написав у початковій публікації). Я відредагував свою оригінальну відповідь, щоб містити код, який я врешті-решт використав. Крім того, команди розміру сторінки здаються помилковими. Я це теж виправив. @Gilles
TSGM

@TSGM Код передбачає макет 1 | 4 лицьового боку, 2 | 3 зворотного, що є звичайним макетом книги. Можливо, вам доведеться підправити його, якщо ваші сторінки розміщені по-іншому. Це було випробувано на місцях у цій обстановці. pythonМоя помилка явно подзвонити була моєю помилкою: я мав би поставити рядок shebang, додав.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.