पीडीऍफ़ में स्प्लिट पेज


67

मेरे पास एक स्कैन की हुई पीडीएफ फाइल है जिसमें एक वर्चुअल पेज (पीडीएफ फाइल में पेज) पर दो पेज स्कैन किए गए हैं।

संकल्प अच्छी गुणवत्ता के साथ है। समस्या यह है कि मुझे पढ़ना है और बाएं से दाएं खींचें।
क्या कुछ कमांड ( convert,, pdftk...) या स्क्रिप्ट है जो इस पीडीएफ फाइल को सामान्य पृष्ठों (पुस्तक का एक पृष्ठ = पीडीएफ फाइल में एक पृष्ठ) के साथ बदल सकती है?


1
हालांकि यह सबसे उत्कट उत्तर नहीं है, लेकिन इसने मुझे वास्तव में आश्चर्यचकित कर दिया। यह सरल, लघु, तेज और सुरुचिपूर्ण है। मुझे लगा कि यहाँ इसका उल्लेख करना उचित है, क्योंकि कभी-कभी हम अन्य उत्तरों को नीचे स्क्रॉल करने के लिए बहुत आलसी होते हैं ...
Peque

रिकॉर्ड्स के लिए, रिवर्स ऑपरेशन (कई पन्नों को मिलाकर) कमांड लाइन ( सूट pdfnupसे "फाइल में प्रिंट") के बजाय प्राप्त किया जा सकता है pdfjam
स्किप्पी ले ग्रांड गौरौ

जवाबों:


46

यहाँ PyPdf लाइब्रेरी का उपयोग करके एक छोटा पायथन स्क्रिप्ट है जो बड़े करीने से काम करता है। इसे एक स्क्रिप्ट में सहेजें un2up(या जो भी आपको पसंद है), इसे निष्पादन योग्य ( chmod +x un2up) बनाएं , और इसे फ़िल्टर ( un2up <2up.pdf >1up.pdf) के रूप में चलाएं ।

#!/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.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    output.addPage(p)
    output.addPage(q)
output.write(sys.stdout)

किसी भी डिप्रेशन चेतावनी को अनदेखा करें; केवल उन लोगों के साथ संबंध रखने की जरूरत है जो PyPdf के रखवाले हैं।

यदि इनपुट असामान्य तरीके से उन्मुख है, तो आपको पृष्ठों को काटते समय विभिन्न निर्देशांक का उपयोग करने की आवश्यकता हो सकती है। देखें कि मेरा कोड स्कैन किए गए पीडीएफ में हर पृष्ठ को सही ढंग से विभाजित क्यों नहीं करता है?


बस इसके उपयोगी होने पर, यहाँ मेरा पहले वाला उत्तर है जो दो उपकरणों के संयोजन के साथ साथ कुछ मैनुअल हस्तक्षेप का उपयोग करता है:

  • Pdfjam (कम से कम संस्करण 2.0), पृष्ठों को क्रॉप करने के लिए, pdfpages LaTeX पैकेज के आधार पर ;
  • Pdftk , बाएं और दाएं हिस्सों को वापस एक साथ रखने के लिए।

दोनों उपकरणों की आवश्यकता है क्योंकि जहाँ तक मैं बता सकता हूँ कि pdfpages एक ही पृष्ठ में एक ही पृष्ठ पर दो अलग-अलग परिवर्तनों को लागू करने में सक्षम नहीं है। कॉल pdftkमें, इनपुट दस्तावेज़ में पृष्ठों की संख्या से 42 को बदलें ( 2up.pdf)।

pdfjam -o odd.pdf --trim '0cm 0cm 14.85cm 0cm' --scale 1.141 2up.pdf
pdfjam -o even.pdf --trim '14.85cm 0cm 0cm 0cm' --scale 1.141 2up.pdf
pdftk O=odd.pdf E=even.pdf cat $(i=1; while [ $i -le 42 ]; do echo O$i E$i; i=$(($i+1)); done) output all.pdf

यदि आपके पास PDFjam 2.0 नहीं है, तो PDFpaTeX इंस्टॉलेशन के लिए PDFpages पैकेज के साथ (उबंटू पर: आपको टेक्सलाइव-लेटेक्स-अनुशंसित टेक्सलाइव-लेटेक्स-अनुशंसित स्थापित करें और शायद उबंटू: टेक्सलीव-फोंट-अनुशंसित टेक्सलाइव-फोंट-अनुशंसित स्थापित करें ) की आवश्यकता है, और निम्नलिखित ड्राइवर का उपयोग करने के लिए पर्याप्त है। फ़ाइल driver.tex:

\batchmode
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge[trim=0cm 0cm 14.85cm 0cm,scale=1.141]{2up.pdf,-}
\includepdfmerge[trim=14.85cm 0cm 0cm 0cm,scale=1.141]{2up.pdf,-}
\end{document}

फिर इनपुट फ़ाइल में पृष्ठों की संख्या से 42 को प्रतिस्थापित करते हुए निम्नलिखित कमांड चलाएं (जिसे कॉल किया जाना चाहिए 2up.pdf):

pdflatex driver
pdftk driver.pdf cat $(i=1; pages=42; while [ $i -le $pages ]; do echo $i $(($pages+$i)); i=$(($i+1)); done) output 1up.pdf

PyPdf लाइब्रेरी एकदम सही काम करती है। मैंने केवल इसे थोड़ा बदल दिया और इसे python conv_pdf.py res.pdf के साथ चलाया । आप कमांडलाइन से अपनी स्क्रिप्ट को कैसे चलाएंगे?
xralf

मैं (थोड़ी स्केलिंग के कारण) pdfjam के साथ संस्करण की कोशिश करना चाहूंगा, लेकिन pdfjam पैकेज की स्थापना के बाद मेरा शेल pdfjamकमांड को पहचान लेगा ।
xralf

@xralf: मेरी अजगर स्क्रिप्ट सिर्फ मानक इनपुट से पढ़ती है और मानक आउटपुट पर लिखती है। Pdfjam संस्करण को pdfjam 2.0 की आवश्यकता है; यह pdfpages के चारों ओर केवल एक छोटा आवरण है, और मैंने इसे थोड़ा लाटेक्स में जोड़ा है ताकि आप इसे सीधे उपयोग कर सकें। स्केलिंग मुद्दा संभवतः pypdf के साथ हल करने योग्य है, यह एक पृष्ठ आकार का मुद्दा हो सकता है (यदि आप क्या हो रहा है और विशेष रूप से पृष्ठ आकार शामिल है) पर अधिक विवरण देने में मेरी मदद कर सकते हैं या नहीं कर सकते हैं।
गिल्स

धन्यवाद, अंतर बहुत ही कम संकल्प में है, लेकिन इससे कोई फर्क नहीं पड़ता। जब मैं लेटेक्स के बारे में अधिक जानता हूं तो यह वापस कर दूंगा (यह अब मेरे लिए बहुत जटिल है और समाधान वास्तव में PyPdf के साथ अच्छा है)।
xralf

1
@ गिल्स वर्सी उपयोगी स्क्रिप्ट। मुझे उम्मीद है कि pdfjam, pdftk में ऐसा ही कुछ देखने को मिलेगा। वैसे भी, कुछ लोग कुछ संशोधनों को अन्य अक्ष पर पृष्ठों को विभाजित करने और अलग-अलग ऑर्डरिंग का उपयोग करना चाह सकते हैं। यह कुछ लाइनों को बदलने और उपयोग करने के साथ संभव हैq.mediaBox.lowerRight = (w, h/2)
ony

52

बस एक अतिरिक्त के बाद से मेरे पास अजगर स्क्रिप्ट (और कई अन्य समाधान) के साथ मुद्दे थे: मेरे लिए mutoolमहान काम किया। यह सुरुचिपूर्ण mupdfपाठक के साथ एक सरल और छोटा जोड़ है । तो आप कोशिश कर सकते हैं:

mutool poster -y 2 input.pdf output.pdf

क्षैतिज विभाजन के लिए, के yसाथ बदलें x। और आप निश्चित रूप से अधिक जटिल समाधानों के लिए दोनों को जोड़ सकते हैं।

वास्तव में यह पाकर खुश हैं (दैनिक mupdf उपयोग के वर्षों के बाद :)

mutoolसंस्करण 1.4 से शुरू होने वाले mupdf के साथ भेज दिया जाता है: http://www.mupdf.com/news


स्थापना mupdfऔर mutoolस्रोत से:

wget http://www.mupdf.com/downloads/mupdf-1.8-source.tar.gz
tar -xvf mupdf-1.8-source.tar.gz
cd mupdf-1.8-source
sudo make prefix=/usr/local install

या एक नया संस्करण खोजने के लिए डाउनलोड पृष्ठ पर जाएं।


3
मेरे पास एक djvu था ... मैंने इसे एक पोस्टस्क्रिप्ट (काफी तेज) में बदल दिया, फिर एक पीडीएफ (कछुआ धीमी गति से) में - और आखिरकार इसे इतनी तेजी से काट दिया कि मुझे लगा कि यह काम नहीं किया - यह था!
जुलिएन प्येड्ट

2
हाँ, मैं भी वास्तव में गति से प्रसन्न था।
मार्ज

3
यह सबसे आसान और बेहतर है। mutoolइसके लिए बनाया गया था। इसके अलावा, सावधान रहना -y, मुझे लगता है कि ज्यादातर मामलों में आप क्या चाहते हैं -x
फिएटजैफ

2
यह उपयोगिता बहुत तेज़ है, हालाँकि मुझे पृष्ठ क्रम की समस्या है। आदेश पहले स्थान पर दाहिने पृष्ठ और दूसरे में बाएं पृष्ठ को आवंटित करता है। क्या कोई इस मुद्दे पर मेरी मदद कर सकता है?
11


16

Imagemagick इसे एक चरण में कर सकता है:

$ convert in.pdf -crop 50%x0 +repage out.pdf

1
धन्यवाद। यदि मैं -density 400पैरामीटर जोड़ता हूं तो इसमें और भी बेहतर गुणवत्ता है।
xralf

11
यह एक मध्यवर्ती प्रारूप के रूप में कन्वर्ट उपयोग रेखापुंज की तरह दिखता है। मूल PDF में वेक्टर ऑब्जेक्ट होने पर भी धुंधली दिखाई देती है।
ony

क्या किसी को इस तरह से पेज कंटेंट को रैस्टोर किए बिना ऐसा करने का तरीका पता है ... या कम से कम एक उच्च रिज़ॉल्यूशन सेट करने के लिए?
टोमिस्लाव नैक-अल्फेयरविक

इसने ग्रंथों को चित्रों में प्रस्तुत किया और छवियों से पीडीएफ बनाया। शायद pics के लिए अच्छा है, लेकिन पाठ निष्कर्षण के लिए बेकार है।
andrej

6

ImageMagick की Convert कमांड आपकी फाइल को 2 भागों में क्रॉप करने में मदद कर सकती है। Http://www.imagemagick.org/Usage/crop/ देखें

अगर मैं तुम होते, तो मैं इस तरह से एक (शेल) स्क्रिप्ट लिखता:

  1. अपनी फ़ाइल को pdfsam के साथ विभाजित करें : डिस्क पर 1 पृष्ठ = 1 फ़ाइल (प्रारूप कोई फर्क नहीं पड़ता। वह चुनें जो ImageMagick जानता है। मैं सिर्फ PS या PDF ले लूंगा।
  2. प्रत्येक पृष्ठ के लिए, पहली छमाही को काटें और $ {PageNumber} A नामक फ़ाइल में डालें

  3. दूसरी छमाही को काटें और $ {PageNumber} B नामक फ़ाइल में डालें।

    आपको 1A.pdf, 1B.pdf, 2A.pdf, 2B.pdf आदि मिलते हैं।

  4. अब, इसे फिर से एक नए पीडीएफ में इकट्ठा करें। ऐसा करने के कई तरीके हैं।

1
ImageMagick का उपयोग फ़ाइलों को rasterize नहीं करेगा? और आपको यह समझाना चाहिए कि आखिरी भाग इनलाइन, विशेष रूप से दर्शकों में गैर-फ्रैन्कोफोंस के लाभ के लिए।
गाइल्स

क्योंकि आपको फ्रेंच समझने की जरूरत नहीं है। यह सिर्फ यह बताता है कि आप इस लक्ष्य को प्राप्त करने के लिए कैसे केवल ImageMagick के कन्वर्ट, pdftk, या घोस्टस्क्रिप्ट (gs) का उपयोग कर सकते हैं। मुझे pdftk का उपयोग करना पसंद है। "दस्तकारी" कोई फर्क नहीं पड़ता क्योंकि यह एक स्कैन किया हुआ दस्तावेज़ है।
Tiktak

6

गिल्स के उत्तर के आधार पर और पीडीएफ पेज की गणना कैसे करें मैंने लिखा है

#!/bin/bash

pdforiginal=$1
pdfood=$pdforiginal.odd.pdf
pdfeven=$pdforiginal.even.pdf
pdfout=output_$1
margin=${2:-0}
scale=${3:-1}

pages=$(pdftk $pdforiginal dump_data | grep NumberOfPages | awk '{print $2}')

pagesize=$(pdfinfo $pdforiginal | grep "Page size" | awk '{print $5}')
margin=$(echo $pagesize/2-$margin | bc -l)

pdfjam -o $pdfood --trim "0cm 0cm ${margin}pt 0cm" --scale $scale $pdforiginal
pdfjam -o $pdfeven --trim "${margin}pt 0cm 0cm 0cm" --scale $scale  $pdforiginal

pdftk O=$pdfood E=$pdfeven cat $(i=1; while [ $i -le $pages ]; do echo O$i E$i; i=$(($i+1)); done) output $pdfout

rm $pdfood $pdfeven

तो मैं दौड़ सकता हूं

./split.sh my.pdf 50 1.2

जहां एडजस्ट मार्जिन के लिए 50 और स्केल के लिए 1.2 है।


4

यहां गिल्स द्वारा पोस्ट किए गए PyPDF कोड की भिन्नता है। यह कार्य किसी भी तरह से काम नहीं करेगा, पेज ओरिएंटेशन:

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

2

सबसे अच्छा समाधान उत्परिवर्ती ऊपर देखें:

sudo apt install mupdf-tools pdftk

विभाजन:

mutool poster -y 2 input.pdf output.pdf

लेकिन फिर आपको बचे हुए पन्नों को घुमाना होगा:

pdftk output.pdf cat 1-endleft output rotated.pdf

फिर भी ओवरलैप नहीं ...
MUY बेल्जियम

1

AskUbuntu में बेंजामिन के जवाब के आधार पर , मैं gscan2pdf नामक GUI टूल का उपयोग करने की सलाह दूंगा

  1. PDF स्कैन फ़ाइल को gscan2pdf पर आयात करें। ध्यान दें कि गैर-छवि पीडीएफ फाइलें काम नहीं कर सकती हैं। स्कैन ठीक हैं, इसलिए आपको चिंता करने की जरूरत नहीं है।

    यहाँ छवि विवरण दर्ज करें

  2. दस्तावेज़ के आकार के आधार पर इसमें कुछ समय लग सकता है। इंतजार करें जब तक यह लोड नहीं हो जाता।

  3. प्रेस Ctrl + A सभी पृष्ठों चयन करें और फिर करने के लिए बारी बारी से (Ctrl + Shift + सी) उन्हें यदि आवश्यक हो तो।

    यहाँ छवि विवरण दर्ज करें

  4. टूल्स पर जाएं >> क्लीन अप करेंडबल और # आउटपुट पेज = 2 के रूप में लेआउट का चयन करें ।

    यहाँ छवि विवरण दर्ज करें

  5. ठीक पर हिट करें और तब तक प्रतीक्षा करें जब तक नौकरी समाप्त न हो जाए।

    यहाँ छवि विवरण दर्ज करें

  6. पीडीएफ फाइल को सेव करें । किया हुआ।


परीक्षण, छवियों के एक विशाल nulber के साथ जटिल पीडीएफ दस्तावेजों के साथ विफल।
MUY बेल्जियम

0

मोरेस का घोल मेरे काम नहीं आया। मुख्य समस्या x5 और x6 गणना थी। यहाँ एक ऑफसेट पर विचार किया जाना है, अर्थात यदि लोअरफ़्ट में नहीं है (0,0)

तो यहाँ एक और भिन्नता है, PyPDF2 और अजगर 3 का उपयोग करने के लिए अतिरिक्त अनुकूलन के साथ:

import copy
import math
import PyPDF2
import sys
import io 

def split_pages(src, dst):
    src_f = io.open(src, 'r+b')
    dst_f = io.open(dst, 'w+b')

    input = PyPDF2.PdfFileReader(src_f)
    output = PyPDF2.PdfFileWriter()

    for i in range(input.getNumPages()):
        p = input.getPage(i) 
        q = copy.copy(p)
        q.mediaBox = copy.copy(p.mediaBox)

        x1, x2 = p.cropBox.lowerLeft
        x3, x4 = p.cropBox.upperRight        

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)

        x5 = math.floor((x3-x1) / 2 + x1)
        x6 = math.floor((x4-x2) / 2 + x2)

        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.lowerLeft = (x1, x6)
            p.mediaBox.upperRight = (x3, x4)

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

if __name__ == "__main__":
    if ( len(sys.argv) != 3 ):
        print ('Usage: python3 double2single.py input.pdf output.pdf')
        sys.exit(1)

    split_pages(sys.argv[1], sys.argv[2])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.