मैं एक पीडीएफ कैसे 'अनबुक' कर सकता हूं


10

मेरे पास एक पीडीएफ फाइल है जिसे एक पुस्तिका प्रारूप में बनाया गया था। यह परिदृश्य अभिविन्यास में ए 4 पेपर पर मुद्रित करने के लिए है; यहां पीडीएफ में दो पृष्ठ हैं, जो वास्तविक पुस्तक में चार पृष्ठों के अनुरूप होना चाहिए।

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

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

ब्रैकेटेड संख्याएँ अलग-अलग पृष्ठों के क्रम के अनुरूप हैं।

मुझे पता है कि linux पर सभी प्रकार की कमांड्स (pdfbook, pdfnup, आदि) हैं (जो शायद पहले इस बुकलेट को बनाने के लिए उपयोग की जाती थीं)। मैं इसे 'अनबुक' कैसे कर सकता हूं --- अर्थात, मैं इसमें से एक पीडीएफ डॉक्यूमेंट बनाना चाहता हूं, जहां अंतिम उत्पाद का प्रत्येक अलग-अलग पेज पीडीएफ का एक अलग-अलग पेज है, जो सामान्य तरीके से ऑर्डर किया गया है।

संपादित करें

गिलेस के लिए धन्यवाद, मैं निम्नलिखित कोड का उपयोग करने में कामयाब रहा:

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
एडम Zalcman

@ अदमज़ल्कमान क्यों? उन्होंने कहा कि एक लिनक्स कार्यक्रम की तलाश में
माइकल Mrozek

2
आप अपनी समस्या के लिए इस प्रश्न के उत्तर (गिल्स द्वारा) को अनुकूलित कर सकते हैं , अर्थात PyPdf स्क्रिप्ट बना सकते हैं।
sr_

क्या आप वाकई पेज 3 और 4 को स्वैप नहीं कर रहे हैं? मैंने छपाई में काम किया है; उस लेआउट का कोई मतलब नहीं है ....
वाइल्डकार्ड

जवाबों:


4

यहां 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 चला रहा हूं, MacPorts के माध्यम से अजगर और py27-pypdf स्थापित किया है। मैंने एक अनबुक बुक बनाई और स्क्रिप्ट को कॉपी और पेस्ट किया। निर्देशानुसार चल रहा है 0 बाइट के साथ एक नई 1up.pdf फ़ाइल बनाता है। मेरे टर्मिनल में कोई त्रुटि या कुछ भी सूचीबद्ध नहीं है, लेकिन कमांड निष्पादित करने पर, कुछ भी नहीं होता है (मुझे CTRL-C आउट करना होगा); सिस्टम लटका नहीं है और कुछ भी करता दिखाई नहीं देता है। मैं समस्या को कैसे ट्रैक कर सकता हूं? @ गिल्स
टीएसजीएम

@TSGM सबसे संभावित व्याख्या यह है कि आप <इनपुट फ़ाइल से पहले भूल गए । यदि आप वास्तव में पूरी तरह से सुनिश्चित हैं कि आपने कमांड को सही ढंग से लिखा है, तो यह PyPdf लाइब्रेरी में बग हो सकता है (यह मुझे अभी तक विफल नहीं हुआ है, लेकिन ऐसा हो सकता है)।
गिल्स एसओ- बुराई को रोकना '

समस्या यह थी कि मुझे "अजगर unbook <in.pdf> out.pdf" के माध्यम से अजगर को बुलाना चाहिए था। मुझे मूर्ख। इसके अलावा, आपका कोड थोड़ा अजीब था (यह अंत में दूसरे_फॉल पेजों को चिपका रहा था। मुझे लगता है कि मैंने इसे मूल पोस्ट में लिखे प्रारूप के लिए ठीक कर लिया है)। मैंने अपनी मूल प्रतिक्रिया को उस कोड को संपादित करने के लिए संपादित किया है जिसका मैंने अंततः उपयोग किया था। साथ ही, पृष्ठ आकार आदेश गलत प्रतीत होते हैं। मैंने उसे भी ठीक कर दिया। @ गिल्स
टीएसजीएम

@TSGM कोड 1 | 4 के एक लेआउट को मानता है, 2 | 3 का उल्टा, जो सामान्य पुस्तक का लेआउट है। यदि आपके पृष्ठों को अलग तरीके से रखा गया है, तो आपको इसे ट्विक करने की आवश्यकता हो सकती है। यह उस सेटिंग में फ़ील्ड-परीक्षण किया गया था। आपका स्पष्ट रूप से फोन pythonकरना मेरी गलती थी: मुझे एक शबंग लाइन डालनी चाहिए थी, गयी।
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.