Jak mogę „odpisać” plik pdf


10

Mam plik pdf w formacie broszury. Jest przeznaczony do drukowania na papierze A4 w orientacji poziomej; oto dwie strony w pdf, które powinny odpowiadać czterem stronom w książce.

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

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

Liczby w nawiasach odpowiadają kolejności poszczególnych stron.

Wiem, że na Linuksie są różnego rodzaju polecenia (pdfbook, pdfnup itp.) (Które prawdopodobnie zostały użyte do stworzenia tej broszury). Jak to „cofnąć rezerwację” --- to znaczy, chcę z tego zrobić dokument pdf, w którym każda strona końcowego produktu jest indywidualną stroną pdf, uporządkowaną w zwykły sposób.

Edytować

Dzięki Gillesowi udało mi się użyć następującego kodu:

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
Myślę, że to powinno przejść do superuser.com
Adam Zalcman,

@AdamZalcman Dlaczego? On szuka programu dla systemu Linux
Michael Mrozek


Czy na pewno nie zamieniłeś stron 3 i 4? Pracowałem w druku; ten układ nie ma żadnego sensu ...
Wildcard

Odpowiedzi:


4

Oto mały skrypt Pythona korzystający z biblioteki PyPdf, która wykonuje tę pracę. (Pochodzi z un2up.) Zapisz go w skrypcie o nazwie unbook, wykonaj go ( chmod +x unbook) i uruchom jako filter ( unbook <book.pdf >1up.pdf).

Testowałem ten skrypt na wyjściu pdfbook --signature=N. W przypadku innej metody może nie być konieczne odwracanie każdej innej strony wejściowej, a kolejność stron może być inna (zależy to od orientacji stron poziomych). Rozmieszczenie stron nie pasuje do twojego pytania; 13,42 nie ma dla mnie sensu (w 4-stronicowej książce 3 powinno znajdować się obok 2, a nie 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)

Zignoruj ​​wszelkie ostrzeżenia o wycofaniu; tylko opiekunowie PyPdf muszą się tym zajmować.


Pytanie to zostało zadane jakiś czas temu, ale mam problem z wdrożeniem twojego rozwiązania. Używam OSX, mam zainstalowany Python i py27-pypdf przez MacPorts. Utworzyłem plik unbook, skopiowałem i wkleiłem skrypt. Uruchomienie polecenia zgodnie z instrukcją powoduje utworzenie nowego pliku 1up.pdf z 0 bajtami. W moim terminalu nie ma żadnego błędu ani niczego, ale po wykonaniu polecenia nic się nie dzieje (muszę wyjść z CTRL-C); system nie zawiesza się i wydaje się, że nic nie robi. Jak mogę zlokalizować problem? @Gilles
TSGM

@TSGM Najbardziej prawdopodobnym wyjaśnieniem jest to, że zapomniałeś <przed plikiem wejściowym. Jeśli naprawdę jesteś absolutnie pewien, że poprawnie napisałeś polecenie, może to być błąd w bibliotece PyPdf (jeszcze mnie to nie zawiodło, ale może się zdarzyć).
Gilles 'SO - przestań być zły'

Problem polegał na tym, że miałem wywoływać Pythona przez „python unbook <in.pdf> out.pdf”. Głupi ja. Poza tym twój kod był trochę dziwny (przyklejał na końcu strony second_half. Wygląda na to, że poprawiłem go pod kątem formatu, który napisałem w oryginalnym poście). Zredagowałem moją pierwotną odpowiedź, aby zawierała kod, którego ostatecznie użyłem. Ponadto polecenia rozmiaru strony wydają się nieprawidłowe. Ja również to poprawiłem. @Gilles
TSGM

@TSGM Kod zakłada układ 1 | 4 awersu, 2 | 3 rewersu, co jest zwykłym układem książki. Może być konieczne dostosowanie go, jeśli strony są ułożone inaczej. W tym ustawieniu został przetestowany w terenie. Twoje wyraźne wezwanie pythonbyło moim błędem: powinienem dodać linię shebang, dodał.
Gilles „SO- przestań być zły”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.