Her dosyanın tek bir sayfa numarasında başlaması için pdf dosyalarını nasıl birleştirebilirim?


11

Birkaç doz pdfs birleştirmek gerekiyor ve tüm giriş pdfs çıktı pdf tek bir sayfada başlatmak istiyorum.

Örnek: A.pdf3 sayfa, B.pdf4 sayfa var. Ben istemiyorum benim çıkış 7 sayfalarına sahip. İstediğim sayfa 1-3'ten A.pdf, sayfa 4'ten boş ve sayfa 5-8'den 8 sayfalık bir pdf B.pdf. Bunu nasıl yapabilirim?

Pdftk'i biliyorum, ama man sayfasında böyle bir seçenek bulamadım.

Yanıtlar:


6

PyPdf kütüphanesi Python biraz yazmak çekinmiyorsanız kolay bu tür şeyler yapar. Aşağıdaki kodu adlı bir komut dosyasına pdf-cat-even(veya istediğiniz gibi) kaydedin, yürütülebilir ( chmod +x pdf-cat-even) yapın ve bir filtre ( ./pdf-cat-even a.pdf b.pdf >concatenated.pdf) olarak çalıştırın . Yöntem için pyPdf ≥1.13'e ihtiyacınız var addBlankPage.

#!/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)

Teşekkürler, bu benim için çalıştı! Bir dosyadan pdfs isimlerini okumayı tercih ettiğim için, kodunuzu biraz değiştirdim ve ayrı bir cevap olarak gönderdim .
Jan Warchoł

@JanekWarchol Dosya adlarınız boşluk gibi özel kabuk karakterleri içermiyorsa:./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf
Gilles 'SO- kötü olmayı durdurun'

Ne yazık ki beyaz boşluklar içeriyorlar. Ama yine de teşekkürler - bunun bu şekilde yapılabileceğinin farkında değildim.
Jan Warchoł

@JanekWarchol Sonra kullanabilirsiniz<list-of-file-names.txt tr '\n' '\0' | xargs -0 ./pdf-cat-even >concatenated.pdf
Gilles 'SO- kötü olmayı bırak'

3

İlk adım, boş bir sayfa içeren bir pdf dosyası oluşturmaktır. Bunu birçok programla kolayca yapabilirsiniz (LibreOffice / OpenOffice, inkscape, (La) TeX, scribus vb.)

Ardından, gerektiğinde bu boş sayfayı ekleyin:

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

Bunu otomatik olarak bir komut dosyasıyla yapmak istiyorsanız, örneğin pdftk file.pdf dump_data | grep NumberOfPages | egrep -o '[0-9]*'sayfa sayısını ayıklamak için kullanabilirsiniz .


Bu biraz hack gibi geliyor. Eğer işe yarıyorsa, sanırım işe yarıyor.
Sam

Bu yaklaşım benim için neredeyse işe yaradı: epmtyPage.pdf eklenmiş bir pdfs listesi üreten bir komut dosyası yazdım, ancak dosya adları boşluklar içeriyorsa bu listeyi doğru ayrıştırmak için pdftk alamadım. Tırnak işaretleri kullanarak IFS değerini değiştirmeyi denedim ama boşuna - belki de pdftk hatası. Her neyse, pypdf kullanarak cevap benim için çalıştı.
Jan Warchoł

@JanekWarchol Hangi pdftk sürümünü kullandınız? En azından pdftk 1.44 ve daha yenisi dosya adlarındaki boşlukları destekliyor gibi görünüyor.
jofel

@jofel pdftk --versionpdftk 1.44 değerini döndürür. Daha fazla meraklı arkadaşlarımın bu işi almak için farklı şeyler denemek ve vazgeçmek için en az 15 dakika harcadığını hatırlıyorum.
Jan Warchoł

1

Gilles'in cevabı benim için çalıştı, ancak birçok dosyayı birleştirmem gerektiğinden, adlarını bir metin dosyasından okuyabilirsem daha uygun. Gilles'in kodunu sadece bunu yapmak için biraz değiştirdim, belki başka birine yardımcı olur:

#!/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

Bunu yapmak için LaTeX'i de kullanabilirsiniz (bunun muhtemelen istediğiniz şey olmadığını biliyorum). Aşağıdaki gibi bir şey işe yaramalıdır:

\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}

\cleardoublepageYalnızca iki taraflı yazdırma için yapılmış sınıfları olan boş bir sayfa eklediğini unutmayın (örn. Kitap)

CTAN'da daha fazla seçenek ve bilgi pdfpagesbulunabilir .


2
Tüm sayfaları otomatik olarak dahil etmek için kullanabilirsiniz \includepdf[pages=-]{...}.
jofel

@jofel Teşekkürler, soru düzeltildi. Bence tüm sayfalar için de varsayılan, sadece belirli sayfaları seçmek mümkün olduğunu göstermek için oraya koydu.
Sam

@jofel Ayrıca, \cleardoublepageyalnızca iki taraflı yazdırma için yapılmış bir sınıf kullanıyorsanız boş bir sayfa ekler. Çalışmayan bir makale kullanıyordum; Çözdüm ve bunu yansıtmak için soruyu güncelledim.
Sam

\includepdfvarsayılan olarak yalnızca ilk sayfayı içerir (tüm sayfaları içermez). \documentclass[twoside]{article}çalışır.
jofel

Ne görmek ben açıkça dahil edilmesi gereken tüm dosyaları yazmak zorunda kalacak, bu yüzden bu benim için yeterince iyi değil. Yinede teşekkürler.
Jan Warchoł

0

İşte PyPDF2 ve python3 ile kod

#!/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"))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.