如何合并pdf文件,以便每个文件都以奇数页码开头?


11

我需要合并几个打z的pdf,我希望所有输入的pdf都以输出pdf的奇数页开始。

示例:A.pdf有3页,B.pdf有4页。我不希望我的输出有7页。我想要的是8页pdf,其中1-3 A.pdf页来自,第4页为空,而5-8页来自B.pdf。我怎样才能做到这一点?

我了解pdftk,但是我在手册页中找不到这样的选项。

Answers:


6

如果您愿意编写一些Python ,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)

谢谢,这对我有用!由于我更喜欢​​从文件中读取pdf的名称,因此我对您的代码进行了一些修改,并将其作为单独的答案发布
JanWarchoł13年

@JanekWarchol如果您的文件名不包含shell特殊字符(例如空格):./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf
邪恶

不幸的是,它们确实包含空格。但是,尽管如此,谢谢-我没有意识到可以用这种方式完成。
JanWarchoł13年

@JanekWarchol然后,您可以使用<list-of-file-names.txt tr '\n' '\0' | xargs -0 ./pdf-cat-even >concatenated.pdf
别再作恶了'

3

第一步是产生一个空白页的pdf文件。您可以使用许多程序(LibreOffice / OpenOffice,inkscape,(La)TeX,scribus等)轻松完成此操作

然后仅在需要的地方包括这个空白页:

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

如果要使用脚本自动执行此操作,则可以使用例如pdftk file.pdf dump_data | grep NumberOfPages | egrep -o '[0-9]*'提取页数。


感觉有点像黑客。虽然可以,但我想可以。
山姆·怀特

这种方法几乎对我有用:我编写了一个脚本,该脚本生成了一个pdf文件列表,并在必要时添加了epmtyPage.pdf,但是如果文件名包含空格,我将无法pdftk正确解析此列表。我尝试使用引号更改IFS值,但无济于事-也许是pdftk的错。无论如何,使用pypdf的答案对我有用
JanWarchoł13年

@JanekWarchol您使用了哪个版本的pdftk?至少pdftk 1.44及更高版本似乎支持文件名中的空格。
2013年

@jofel pdftk --version返回pdftk 1.44。我记得我那些比较精打细算的朋友花了至少15分钟的时间尝试各种事情来完成这项工作,然后放弃了。
JanWarchoł13年

1

Gilles的回答对我有用,但是由于我必须合并许多文件,因此如果我可以从文本文件中读取它们的名称,则更加方便。我稍微修改了Gilles的代码来做到这一点,也许会对其他人有所帮助:

#!/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仅插入带有双面打印类的空白页(例如书本)

pdfpages可以在CTAN上找到更多选项和信息。


2
要自动包含所有页面,可以使用\includepdf[pages=-]{...}
jofel

@jofel谢谢,解决了这个问题。我认为它也是所有页面的默认值,我只是将其放在其中以表明可以选择某些页面。
Sam Whited

@jofel另外,\cleardoublepage如果您使用的是用于双面打印的类,则仅插入空白页。我正在使用无效的文章;我已修复它并更新了问题以反映这一点。
Sam Whited

\includepdf默认情况下仅包括第一页(并非所有页面)。\documentclass[twoside]{article}也可以。
jofel

从我看来,我必须明确地写出所有必须包含的文件,所以这对我来说还不够好。但是还是谢谢你。
JanWarchoł13年

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"))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.