पीडीएफ के चॉप पेजों को कई पन्नों में बंद [बंद]


16

मुझे पीडीएफ फाइलों का एक गुच्छा मिला है जिसमें एक एकल पीडीएफ पृष्ठ पर दो "वास्तविक" पृष्ठ हैं; मैं इन्हें आधे में काटना चाहता हूं और प्रत्येक आधे को एक अलग पृष्ठ पर रखता हूं। अनिवार्य रूप से, मुझे कुछ ऐसा चाहिए जो pdfnup(या psnup) के ठीक विपरीत हो । यह उपलब्धि कैसे हासिल की जा सकती है?

प्लेटफ़ॉर्म लिनक्स है, खुला स्रोत पसंदीदा; जैसा कि मैंने इनमें से कुछ को करने के लिए एक महान ढेर प्राप्त किया है जिसे स्क्रिप्ट किया जा सकता है (जैसा कि एक जीयूआई के विपरीत) अच्छा होगा, इसलिए मैं इसे केवल उनकी सूची दे सकता हूं और इसे चबा सकता हूं।

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


जवाबों:


22

आप इसे घोस्टस्क्रिप्ट की मदद से हल कर सकते हैं। pdftkअकेले ऐसा नहीं कर सकता (मेरे ज्ञान का सबसे अच्छा करने के लिए)। मैं आपको मैन्युअल रूप से ऐसा करने के लिए कमांडलाइन चरण दूंगा। यह एक प्रक्रिया के रूप में स्क्रिप्ट करना आसान होगा, पृष्ठ आकार और पृष्ठ संख्या के लिए अलग-अलग मापदंडों के साथ भी। लेकिन आपने कहा कि आप ऐसा कर सकते हैं ;-)

घोस्टस्क्रिप्ट की मदद से इसे कैसे हल करें ...

... और इसके मज़े के लिए, मैंने हाल ही में "डबल-अप" पृष्ठों वाले इनपुट फ़ाइल के साथ ऐसा नहीं किया है , लेकिन "ट्रेबल-अप्स" के साथ। इस केस का जवाब आप यहां पढ़ सकते हैं ।

आपका मामला और भी सरल है। आपको ऐसा कुछ प्रतीत होता है:

+------------+------------+   ^
|            |            |   |
|      1     |      2     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
             ^
            fold
             v
+------------+------------+   ^
|            |            |   |
|      3     |      4     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
<---------- 842 pt -------->

आप 4 पृष्ठों के साथ 1 पीडीएफ बनाना चाहते हैं, जिनमें से प्रत्येक का आकार 421 पीटी x 595 पीटी है।

पहला कदम

आइए पहले इनपुट पृष्ठों में से प्रत्येक से बाएं खंड निकालें:

gs \
    -o left-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [0 0]>> setpagedevice" \
    -f double-page-input.pdf

इन मापदंडों ने क्या किया?

सबसे पहले, पीडीएफ 1 इंच == 72 अंक में जानें । फिर बाकी है:

  • -o ...............:नाम आउटपुट फ़ाइल। तात्कालिक रूप से भी उपयोग करता है -dBATCH -dNOPAUSE -dSAFER
  • -sDEVICE=pdfwrite : हम पीडीएफ को आउटपुट स्वरूप के रूप में चाहते हैं।
  • -g................:पिक्सेल में आउटपुट मीडिया आकार सेट करता है। pdfwrite का डिफ़ॉल्ट रिज़ॉल्यूशन 720 डीपीआई है। इसलिए पेजऑफसेट के लिए मैच पाने के लिए 10 से गुणा करें।
  • -c "..............:घोस्टस्क्रिप्ट को दिए गए पोस्टस्क्रिप्ट कोड स्निपेट को मुख्य इनपुट फ़ाइल से पहले संसाधित करने के लिए कहता है (जिसके साथ पालन करने की आवश्यकता होती है -f)।
  • <</PageOffset ....:माध्यम पर पृष्ठ छवि का स्थानांतरण। (बेशक, बाएं पन्नों के लिए पारी [0 0]का कोई वास्तविक प्रभाव नहीं है।)
  • -f ...............: इस इनपुट फ़ाइल को प्रोसेस करें।

अंतिम आदेश किस परिणाम को प्राप्त हुआ?

यह वाला:

Output file: left-sections.pdf, page 1
+------------+  ^
|            |  |
|     1      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: left-sections.pdf, page 2
+------------+  ^
|            |  |
|     3      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

दूसरा कदम

अगला, सही खंड:

gs \
    -o right-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [-421 0]>> setpagedevice" \
    -f double-page-input.pdf

निगेटिव ऑफसेट पर ध्यान दें क्योंकि जब तक हम व्यू एरिया को स्थिर रखते हुए पेज को बाईं ओर शिफ्ट कर रहे हैं।

नतीजा:

Output file: right-sections.pdf, page 1
+------------+  ^
|            |  |
|     2      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: right-sections.pdf, page 2
+------------+  ^
|            |  |
|     4      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

अंतिम चरण

अब हम पृष्ठों को एक फाइल में जोड़ते हैं। हम भूत-प्रेत के साथ भी ऐसा कर सकते थे, लेकिन हम pdftkइसके बजाय इसका उपयोग करेंगे , क्योंकि यह इस काम के लिए तेज़ है:

pdftk \
  A=right-sections.pdf \
  B=left-sections.pdf \
  shuffle \
  output single-pages-output.pdf
  verbose

किया हुआ। यहाँ वांछित परिणाम है। 4 अलग-अलग पृष्ठ, आकार 421x595 पीटी।

नतीजा:

+------------+ +------------+ +------------+ +------------+   ^
|            | |            | |            | |            |   |
|     1      | |     2      | |     3      | |     4      |   |
|            | |            | |            | |            |5595 pt
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
+------------+ +------------+ +------------+ +------------+   v
<-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt -->

@ परिचित: डाउनवोटिंग के लिए धन्यवाद! क्या आप इसके लिए कोई कारण बताने वाली टिप्पणी लिखने की कृपा करेंगे?
कर्ट पफीफेल

ASCII कला के भयानक उपयोग के लिए +1, और बहुत स्पष्ट निर्देश। बस मैं एक सीएलआई n00b का कारण बन रहा हूं, \ n लाइनों को बचाना आसान है, इसलिए इसे पढ़ना सही है?
जर्नीमैन गीक

@mullhausen: टाइपो को ठीक करने के लिए धन्यवाद ( 421-> -421)। ;-)
कर्ट फ़िफ़ेल

6

एक टूल पीडीएफपोस्टर है जिसका उपयोग एक इनपुट पेज के लिए कई पेजों के साथ पीडीएफ बनाने के लिए किया जा सकता है (पेजों को खंगालना या काटना)। यह टूल के समान है poster, जो पोस्टस्क्रिप्ट फ़ाइलों के लिए समान है।


पीडीएफपोस्टर आसान पोस्टर असेंबली के लिए किनारों पर मुद्रण अतिव्यापी सामग्री को संभाल नहीं करता है। हालांकि, यह एक पर्ल स्क्रिप्ट है, इसलिए इसे जोड़ना काफी आसान है।
मथायस उरलिचस

3

इसलिए, बहुत अधिक खोज के बाद (ऐसा लगता है कि "पीडीएफ कट पेज" एक बेहतर खोज है), मुझे एक छोटी स्क्रिप्ट मिली , unpnupजिसका उपयोग करता है poster, पीडीएफ / पीएस रूपांतरण, और pdftkवास्तव में मुझे जो चाहिए वह करने के लिए। यह थोड़ा लंबा रास्ता है, लेकिन यह मेरे द्वारा पाए गए अन्य तरीकों से बहुत बेहतर है (जैसे कि इमेजमैगिक का उपयोग करना) क्योंकि यह पृष्ठों को थूकने से पहले उन्हें नष्ट नहीं करता है।

बस अगर किसी कारणवश मोबिलर किसी कारण से चला जाता है, तो स्क्रिप्ट का मूल (GPLv2 के तहत लाइसेंस या बाद में हैराल्ड हैकबर्ग द्वारा <hackenberggmx.at>) इस प्रकार है:

pdftk "$1" burst
for file in pg*.pdf;
do
    pdftops -eps $file
    poster -v -pA4 -mA5 -c0% `basename $file .pdf`.eps > `basename $file .pdf`.tps
    epstopdf `basename $file .pdf`.tps
done
pdftk pg*.pdf cat output ../`basename $1 .pdf`_unpnuped.pdf

1
लोगों को अपने सवालों के जवाब देने पर यह पसंद आएगा। हालाँकि, अगर आपको इसे GUI के साथ करने की आवश्यकता है, खासकर अगर पृष्ठों का आकार भी नहीं था या आप प्रत्येक पक्ष को आगे फसल करना चाहते थे, तो Briss.sourceforge.net
briss.sourceforge.net

आपको सभी रूपांतरणों के बिना, पीडीएफटी के साथ जो आप चाहते हैं, वह करने में सक्षम होना चाहिए।
CarlF

@ कार्ल: मुझे लगा कि यह संभव होगा, लेकिन मैं पीडीएफटीके मैन पेज में पेजों की सामग्री में हेरफेर करने के लिए कुछ भी नहीं देख सकता। मेरे लिए कोई संकेत मिला?
Womble

@ फ़्रीबूस: अपने स्वयं के सवालों के जवाब देने में क्या गलत है?
कर्ट फ़ेफ़ेले

1
@womble: आपके रूपांतरण PS / EPS के माध्यम से जाते हैं। यह गुणवत्ता (एम्बेडेड फोंट, पारदर्शिता, आदि) में नुकसान के लिए बाध्य है। मेरा सुझाव जोखिम भरे PDF => EPS => PDFमार्ग से बचता है और सुरक्षित PDF => PDF => PDFरास्ता जाता है ।
कर्ट फ़िफ़ले

2

मुझे अपनी समान स्थिति के लिए कर्ट फ़िफेले का उत्तर बहुत मददगार लगा। मुझे लगा कि मैं समाधान के अपने संशोधन को दूसरों के साथ साझा कर सकता हूं ...

मेरे पास भी एक स्कैन की हुई पीडीएफ थी जिसमें प्रत्येक शीट पर 2 पृष्ठ थे। यह 11 x 8.5 (इंच) की एक काठी-सिले हुए बुकलेट का स्कैन था जिसे मूल रूप से स्कैन करने पर स्टेपल कर दिया गया था, इसलिए: पीडीएफ पेज 1 = बैक और फ्रंट कवर; पीडीएफ पेज 2 = पेज 2 और 3, आदि यह ठीक ऑनस्क्रीन पढ़ता है, लेकिन आप इसे प्रिंट नहीं कर सकते हैं और फिर पुस्तिका की अधिक प्रतियां बनाने के लिए इसे प्रधान कर सकते हैं।

मुझे एक डुप्लेक्स कॉपियर पर इसे प्रिंट करने में सक्षम होने की आवश्यकता थी; यानी इसे एक "लगाए गए" पीडीएफ में वापस लाएं, मुद्रण के लिए तैयार। इसलिए कर्ट के समाधान का उपयोग करते हुए, मैंने इसे (अहम) "वन-लाइनर" बनाया, इसे फिर से सही पृष्ठ क्रम में, आधे पृष्ठ में बदलने के लिए। यह किसी भी HEIGHT और WIDTH के लिए काम करेगा, और किसी भी पेज के लिए भी। मेरे मामले में, मेरे पास 40-पृष्ठ पुस्तिका (पीडीएफ में 20 स्कैन किए गए पृष्ठ) थे।

HEIGHT=8.5 WIDTH=11 ORIG_FILE_PATH="original.pdf" \
count=$(set -xe; \
gs -o left.pdf -sDEVICE=pdfwrite \
-g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \
-c "<</PageOffset [0  0]>> setpagedevice" \
-f "$ORIG_FILE_PATH" >/dev/null; \
gs -o right.pdf -sDEVICE=pdfwrite \
-g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \
-c "<</PageOffset [-$(perl -e "print(($WIDTH / 2) * 72)")  0]>> setpagedevice" \
-f "$ORIG_FILE_PATH" | grep Page | wc -l ); \
echo '>>>>>' Re-ordering $count pages...; \
(set -xe; pdftk A=right.pdf B=left.pdf cat \
A1 `set +xe; for x in $(seq 2 $count); do echo B$x A$x; done` B1 \
output ordered.pdf); \
echo "Done. See ordered.pdf"

आपको केवल इस आदेश में पहले कुछ मापदंडों को बदलने की आवश्यकता है ताकि HEIGHT और WIDTH और ORIG_FILE_PATH निर्दिष्ट किए जा सकें। कमांड का शेष भाग विभिन्न आकारों की गणना करता है और जीएस को दो बार कॉल करता है, फिर पीडीएफटीके। यह आपके स्कैन में पृष्ठों की गिनती भी करेगा और फिर सही सॉर्ट विनिर्देशन (मेरे द्वारा दिए गए परिदृश्य के लिए) का उत्पादन करेगा।

यह कुछ प्रगति कर रहा है कि यह क्या कर रहा है, जो इस तरह दिखाई देगा:

+++ perl -e 'print((11 / 2) * 720)'
+++ perl -e 'print(8.5 * 720)'
++ gs -o left.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [0  0]>> setpagedevice' -f original.pdf
++ wc -l
++ grep Page
+++ perl -e 'print((11 / 2) * 720)'
+++ perl -e 'print(8.5 * 720)'
+++ perl -e 'print((11 / 2) * 72)'
++ gs -o right.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [-396  0]>> setpagedevice' -f original.pdf
>>>>> Re-ordering 20 pages...
++ set +xe
+ pdftk A=right.pdf B=left.pdf cat A1 B2 A2 B3 A3 B4 A4 B5 A5 B6 A6 B7 A7 B8 A8 B9 A9 B10 A10 B11 A11 B12 A12 B13 A13 B14 A14 B15 A15 B16 A16 B17 A17 B18 A18 B19 A19 B20 A20 B1 output ordered.pdf
Done. See ordered.pdf

अगला, आपको एक मुद्रित पुस्तिका के लिए आवश्यक पृष्ठ लगाने के लिए, आपको बस "प्रिंट" ऑर्डर करना होगा। ठीक उसी पृष्ठ के कस्टम पृष्ठ आकार पर जिसे आपको चाहिए (मेरे उदाहरण में, 5.5 x 8.5), इसे "बुकलेट बनाने" के लिए भेजना "उपकरण (मेरे मामले में, मैंने http://download.cnet.com/Create-Booklet/3000-2088_4-86349.html से मैक के लिए क्रिस्टोफ वोगेलबसच की बुक बुकलेट का उपयोग किया )।

परिणामी पीडीएफ अब मूल पृष्ठ आकार 11 x 8.5 के साथ 2 शीट प्रति शीट पर वापस आ जाएगा, लेकिन ऑर्डर ऐसा होगा कि आप इसे डबल-साइडेड, शॉर्ट-एज बाइंडिंग, और वॉइलिया प्रिंट कर सकते हैं! आपके पास एक प्रिंटआउट होगा जिसमें आप फोटोकॉपी और फोल्ड और काठी-सिलाई कर सकते हैं, मूल पुस्तिका को बिना डिसएम्बलिंग (या यहां तक ​​कि आवश्यक रूप से देखकर) मूल को पुन: पेश कर सकते हैं।

आशा है कि यह किसी की मदद करता है!

-सी


1

ऊपर दिए गए piptas के उत्तर के आधार पर :

विंडोज़ पर, शुरुआत में सिंगल कवर इमेज वाले लेटर-साइज़ PDF को विभाजित करने के लिए, निम्नलिखित ने मेरे लिए बहुत अच्छा काम किया (दूसरे चरण में [-612 0] के उपयोग पर ध्यान दें), एक सकारात्मक मान ने खाली पृष्ठ बनाए क्योंकि यह गलत तरीके से धकेलता है ।)

gswin32c -o left-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

उस उपयोग पर ध्यान दें, -dFirstPage=2जो जीएस को पेज 2 पर प्रोसेसिंग शुरू करने का निर्देश देता है।

gswin32c -o right-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [-612 0]>> setpagedevice" -f input.pdf

यह उसी तरह से राइट-सेक्शन बनाता है। पीडीएफ। और अब कवर छवि:

gswin32c -o cover.pdf -sDEVICE=pdfwrite -dLastPage=1 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

अगला, चूंकि मैं मैनुअल पेज इनपुट का उपयोग करके pdftk के साथ विलय नहीं करना चाहता था, इसलिए मैंने एक नई निर्देशिका में बाएं और दाएं खंडों को अलग-अलग पीडीएफ में विभाजित किया है।

mkdir input_file
copy cover.pdf input_file\0000.pdf
pdftk left-sections.pdf burst output input_file\%04d_A.pdf
pdftk right-sections.pdf burst output input_file\%04d_B.pdf

फिर मैं उस निर्देशिका में PDF को शामिल करता हूं, वर्णानुक्रम में (और सौभाग्य से इसका मतलब है कि वे सही क्रम में क्रमबद्ध हैं!)! और मैं "भूत:" को ठीक करने के लिए फिर से घोस्टस्क्रिप्ट के माध्यम से परिणाम चलाता हूं। मान लेते हैं। 0. " pdftk द्वारा उत्पन्न की गई त्रुटियां जिसे भूत-प्रेत "itext-paulo-155 (itextpdf.sf.net-lawagie.com)" कहा जाता है - यह भी मेरे उपयोग में फ़ाइल का आकार आधा करने के लिए हुआ। 4.5MB मूल के साथ, pdftk का परिणाम 6.7MB था और gswin32c का पुनर्संसाधन कम होकर 3.2 एमबी हो गया।

pdftk input_file\*.pdf cat output input_temp.pdf
gswin32c -o final_output.pdf -sDEVICE=pdfwrite -f input_temp.pdf

और हम कर रहे हैं! Input_file फ़ोल्डर, cover.pdf, input_temp.pdf, right_sections.pdf और left_sections.pdf को हटाने के लिए स्वतंत्र महसूस करें। ;-)


1

यदि आपको केवल एक दस्तावेज़ में बाएं-हाथ-साइड pdfs सभी को आउटपुट करने की आवश्यकता है, और दाएँ-हाथ-साइड pdfs सभी एक दस्तावेज़ में हैं, तो कर्ट फ़िफ़ल के उत्तर के आधार पर निम्न स्क्रिप्ट चाल करेगा (किसी भी ऊंचाई पर काम करता है) चौड़ाई):

$ cat split.sh
#!/bin/bash                                                                     

dims=$(pdfinfo "$1" | grep -i "page size:" | cut -d ":" -f2)                    
width=$(echo "$dims" | cut -d " " -f7)                                          
height=$(echo "$dims" | cut -d " " -f9)                                         
half_width=$(echo "$width * 0.5" | bc -l | cut -d "." -f1)                      
half_widthtt=$(echo "$width * 5" | bc -l | cut -d "." -f1)                      
heighttt=$(echo "$height * 10" | bc -l | cut -d "." -f1)                        

echo "pdf $1 has height $height and width $width"                               

gs -o "left-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [0 0]>> setpagedevice" -f "$1"
gs -o "right-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [-$half_width 0]>> setpagedevice" -f "$1"

फिर इसे ऐसे चलाएं:

$ ./split.sh thepdftosplit.pdf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.