मैं पीडीएफ फाइलों को कैसे मर्ज कर सकता हूं ताकि प्रत्येक फाइल एक विषम पृष्ठ संख्या पर शुरू हो?


11

मुझे कुछ दर्जन पीडीएफ़्स को मर्ज करने की आवश्यकता है, और मैं चाहता हूं कि सभी इनपुट पीडीएफ़ आउटपुट पीडीएफ में एक अजीब पृष्ठ पर शुरू करें।

उदाहरण: A.pdf3 पृष्ठ हैं, B.pdf4 पृष्ठ हैं। मैं नहीं चाहता कि मेरे आउटपुट में 7 पेज हों। मैं जो चाहता हूं वह एक 8-पृष्ठ का पीडीएफ है जिसमें पेज 1-3 से हैं A.pdf, पेज 4 खाली है, और पेज 5-8 हैं B.pdf। मैं यह कैसे कर सकता हूँ?

मुझे pdftk के बारे में पता है, लेकिन मुझे मैन पेज में ऐसा कोई विकल्प नहीं मिला।

जवाबों:


6

PyPdf पुस्तकालय अगर तुम अजगर का एक सा लिखने के लिए तैयार हैं आसान चीजों की इस तरह बना देता है। नीचे दी गई कोड pdf-cat-even(या जो भी आपको पसंद है) एक स्क्रिप्ट में सहेजें , इसे निष्पादन योग्य ( chmod +x pdf-cat-even) बनाएं , और इसे फ़िल्टर ( ./pdf-cat-even a.pdf b.pdf >concatenated.pdf) के रूप में चलाएं । आपको addBlankPageविधि के लिए pyPdf ≥1.13 की आवश्यकता है ।

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0
alignment = 2           # to align on even pages
for filename in sys.argv[1:]:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename))
    for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
        # This code is executed for every input page in turn
        output.addPage(p)
        output_page_number += 1
    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1
output.write(sys.stdout)

धन्यवाद, यह मेरे लिए काम किया! जैसा कि मैंने एक फ़ाइल से पीडीएफ़ के नाम पढ़ना पसंद किया है, मैंने आपके कोड को थोड़ा संशोधित किया है और इसे एक अलग उत्तर के रूप में पोस्ट किया है ।
जन वॉरचेल

@JanekWarchol अगर आपके फ़ाइल नामों में व्हॉट्सएप जैसे शेल स्पेशल कैरेक्टर नहीं हैं:./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf
गाइल्स का SO- रुकना बुराई है '

दुर्भाग्य से उनमें व्हाट्सएप नहीं है। लेकिन फिर भी धन्यवाद - मुझे नहीं लगा कि यह इस तरह से किया जा सकता है।
Jan Warchoł

@JanekWarchol तब आप उपयोग कर सकते हैं<list-of-file-names.txt tr '\n' '\0' | xargs -0 ./pdf-cat-even >concatenated.pdf
गाइल्स का SO- दुष्ट होना बंद करें '

3

पहला कदम एक खाली पृष्ठ के साथ एक पीडीएफ फाइल तैयार करना है। आप बहुत सारे कार्यक्रमों (लिब्रेऑफिस / ओपनऑफिस, इंकस्केप, (ला) टीएक्स, स्क्राइबस, आदि) के साथ आसानी से कर सकते हैं।

इसके बाद बस इस खाली पृष्ठ को शामिल करें जहाँ आवश्यक हो:

pdftk A.pdf empty_page.pdf B.pdf output result.pdf 

यदि आप इसे स्क्रिप्ट के साथ स्वचालित रूप से करना चाहते हैं, तो आप pdftk file.pdf dump_data | grep NumberOfPages | egrep -o '[0-9]*'पेज गणना निकालने के लिए उदाहरण के लिए उपयोग कर सकते हैं ।


यह एक हैक की तरह महसूस होता है। हालांकि अगर यह काम करता है, यह काम करता है मुझे लगता है।
सैम व्हीट

इस दृष्टिकोण ने मेरे लिए लगभग काम किया: मैंने एक स्क्रिप्ट लिखी जिसमें epmtyPage.pdf के साथ pdfs की एक सूची तैयार की गई जहाँ आवश्यक हो, लेकिन अगर फ़ाइलनाम सम्‍मिलित रिक्त स्थान हैं तो मैं इस सूची को सही ढंग से पार्स करने के लिए pdftk नहीं प्राप्त कर सका। मैंने IFS मान बदलने की कोशिश की है, उद्धरण चिह्नों का उपयोग करते हुए, लेकिन कोई फायदा नहीं हुआ - शायद यह पीडीएफटी की गलती है। वैसे भी, जवाब pypdf का उपयोग मेरे लिए काम किया।
जन वॉरचेल

@JanekWarchol pdftk के किस संस्करण का आपने उपयोग किया? कम से कम pdftk 1.44 और नया फ़ाइल नाम में व्हॉट्सएप का समर्थन करता है।
जोफेल

@ जोफेल pdftk --versionने pdftk 1.44 लौटाया। मुझे याद है कि मेरे अधिक बाश-प्रेमी दोस्तों ने कम से कम 15 मिनट बिताए और इस काम को पाने के लिए अलग-अलग चीजों की कोशिश की।
Jan Warchoł

1

गिल्स के उत्तर ने मेरे लिए काम किया, लेकिन चूंकि मुझे कई फ़ाइलों को मर्ज करना है, इसलिए यदि मैं किसी पाठ फ़ाइल से उनके नाम पढ़ सकता हूं तो यह अधिक सुविधाजनक है। मैंने गिल्स कोड को थोड़ा संशोधित किया है, ताकि वह किसी और की मदद कर सके:

#!/usr/bin/env python

# requires PyPdf library, version 1.13 or above -
# its homepage is http://pybrary.net/pyPdf/
# running: ./this-script-name file-with-pdf-list > output.pdf

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0

# every new file should start on (n*alignment + 1)th page
# (with value 2 this means starting always on an odd page)
alignment = 2

listoffiles = open(sys.argv[1]).read().splitlines()
for filename in listoffiles:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename))
    for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
        # This code is executed for every input page in turn
        output.addPage(p)
        output_page_number += 1
    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1
output.write(sys.stdout)

1

आप ऐसा करने के लिए भी LaTeX का उपयोग कर सकते हैं (हालांकि मुझे पता है कि यह संभवतः वह नहीं है जो आप चाहते हैं)। निम्नलिखित की तरह कुछ काम करना चाहिए:

\documentclass{book}

\usepackage{pdfpages}

\begin{document}

\includepdf[pages=-]{A}
\cleardoublepage % Make sure we clear to an odd page
\includepdf[pages=-]{B} % This inserts all pages. Or you can specify specific pages, a range, or `{}` for a blank page

\end{document}

ध्यान दें कि \cleardoublepageकेवल उन वर्गों के साथ एक रिक्त पृष्ठ सम्मिलित करता है जो दो तरफा मुद्रण के लिए बनाए गए हैं (जैसे। पुस्तक)।

अधिक विकल्प और जानकारी CTANpdfpages पर पाई जा सकती है ।


2
सभी पृष्ठों को स्वचालित रूप से शामिल करने के लिए, आप उपयोग कर सकते हैं \includepdf[pages=-]{...}
जोफेल

@ जोफेल थैंक्स, सवाल तय किया। मुझे लगता है कि यह सभी पृष्ठों के लिए भी चूक है, मैंने इसे केवल यह दिखाने के लिए रखा कि कुछ पृष्ठों का चयन करना संभव था।
सैम व्हीट

@ Jofel इसके अलावा, \cleardoublepageकेवल एक खाली पृष्ठ सम्मिलित करता है यदि आप दो तरफा छपाई के लिए बने वर्ग का उपयोग कर रहे हैं। मैं लेख का उपयोग कर रहा था जो काम नहीं करता है; मैंने इसे ठीक कर दिया और प्रश्न को प्रतिबिंबित करने के लिए अद्यतन किया।
सैम व्हीटेड

\includepdfडिफ़ॉल्ट रूप से केवल पहला पृष्ठ शामिल है (सभी पृष्ठ नहीं)। \documentclass[twoside]{article}काम भी करता है।
जोफेल

जो कुछ भी मैं देख रहा हूँ उससे मुझे उन सभी फ़ाइलों को स्पष्ट रूप से लिखना होगा जिन्हें शामिल किया जाना है, इसलिए यह मेरे लिए पर्याप्त नहीं है। लेकिन फिर भी धन्यवाद।
जन वॉरचेल

0

यहाँ PyPDF2 और python3 के साथ कोड है

#!/usr/bin/env python


# requires PyPdf2 library, version 1.26 or above -
# its homepage is https://pythonhosted.org/PyPDF2/index.html
# running: ./this-script-name output.pdf file-with-pdf-list

import copy, sys
from PyPDF2 import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0

# every new file should start on (n*alignment + 1)th page
# (with value 2 this means starting always on an odd page)
alignment = 2

for filename in sys.argv[2:]:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename, "rb"))
    output.appendPagesFromReader(input)
    output_page_number += input.getNumPages()

    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1

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