我正在UNIX系统上工作,我想将数以千计的PDF文件合并到一个文件中以便打印。 我不知道他们提前几页。
我想双面打印,这样两个文件不会在同一个页面上。
因此,我想将合并文件alignment,使得每个文件将以奇数页面开始,如果下一个要写入的页面是偶数页面,则会添加空白页面。
这里是我使用的解决方案(它基于@ Dingo的基本原则,但使用PDF操作更简单的方法):
首先,我创建一个PDF文件,在某个地方有一个空白页面,例如在“/path/to/blank.pdf”中。
然后,从包含我所有的pdf文件的目录中,我运行一个脚本,将blank.pdf文件附加到每个具有奇数页码的pdf文件中:
#!/bin/bash for f in *.pdf; do let npages=$(pdfinfo "$f"|grep 'Pages:'|awk '{print $2}') let modulo="($npages %2)" if [ $modulo -eq 1 ]; then pdftk "$f" "/path/to/blank.pdf" output "aligned_$f" else cp "$f" "aligned_$f" fi done
现在,所有“aligned_”文件都有页码,我可以使用它们加入
pdftk aligned_*.pdf output result.pdf
如果从另一个角度来看这个问题,你的问题可以更容易解决
为了得到在打印的时候, 第 2号 pdf文件的第1页不附在同一张纸上的第1号 pdf文件的最后页 ,更一般地,后面的pdf文件的第1页不打印在背面与前面的pdf文件的最后一页相同的工作表
你只需要选择性地添加一个空白页面到PDF文件,页面数量为奇数
我写了一个名为abbblankifneeded的简单脚本,您可以放在一个文件中,然后复制到/ usr / bin或/ usr / local / bin
然后在你使用这个语法的pdf文件夹中调用
for f in *.pdf; do addblankifneeded $f; done
这个脚本在最后添加一个空白页面到页面数为奇数的pdf文件,跳过已经有偶数页面的pdf文件,然后把所有pdf文件合并成一个
要求: pdftk , pdfinfo
注意:根据你的bash环境,你可能需要在第一行脚本中用bash解释器替换sh解释器
#!/bin/sh #script to add automatically blank page at the end of a pdf documents, if count of their pages is a not a module of 2 and then to join all pdfs into one # # made by Dingo # # dokupuppylinux.co.cc # #http://pastebin.com/u/dingodog (my pastebin toolbox for pdf scripts) # filename=$1 altxlarg="`pdfinfo -box $filename| grep MediaBox | cut -d : -f2 | awk '{print $3 FS $4}'`" echo "%PDF-1.4 %µí®û 3 0 obj << /Length 0 >> stream endstream endobj 4 0 obj << /ProcSet [/PDF ] /ExtGState << /GS1 1 0 R >> >> endobj 5 0 obj << /Type /Halftone /HalftoneType 1 /HalftoneName (Default) /Frequency 60 /Angle 45 /SpotFunction /Round >> endobj 1 0 obj << /Type /ExtGState /SA false /OP false /HT /Default >> endobj 2 0 obj << /Type /Page /Parent 7 0 R /Resources 4 0 R /Contents 3 0 R >> endobj 7 0 obj << /Type /Pages /Kids [2 0 R ] /Count 1 /MediaBox [0 0 595 841] >> endobj 6 0 obj << /Type /Catalog /Pages 7 0 R >> endobj 8 0 obj << /CreationDate (D:20110915222508) /Producer (libgnomeprint Ver: 2.12.1) >> endobj xref 0 9 0000000000 65535 f 0000000278 00000 n 0000000357 00000 n 0000000017 00000 n 0000000072 00000 n 0000000146 00000 n 0000000535 00000 n 0000000445 00000 n 0000000590 00000 n trailer << /Size 9 /Root 6 0 R /Info 8 0 R >> startxref 688 %%EOF" | sed -e "s/595 841/$altxlarg/g">blank.pdf pdftk blank.pdf output fixed.pdf mv fixed.pdf blank.pdf pages="`pdftk $filename dump_data | grep NumberOfPages | cut -d : -f2`" if [ $(( $pages % 2 )) -eq 0 ] then echo "$filename has already a multiple of 2 pages ($pages ). Script will be skipped for this file" >>report.txt else pdftk A=$filename B=blank.pdf cat AB output blankadded.pdf mv blankadded.pdf $filename pdffiles=`ls *.pdf | grep -v -e blank.pdf -e joinedtogether.pdf| xargs -n 1`; pdftk $pdffiles cat output joinedtogether.pdf fi exit 0
免责声明:我是我在这里提到的工具的作者。
这是一个免费的开源命令行界面,用于执行合并或拆分等PDF操作。 merge
命令有一个选项说明:
[–addBlanks]:如果页数为奇数,则在每个合并文档之后添加一个空白页(可选)
既然你只需要打印PDF,我假设你不关心你的文件合并的顺序。 这是你可以使用的命令:
sejda-console merge -d /path/to/pdfs_to_merge -o /outputpath/merged_file.pdf --addBlanks
它可以从官方网站sejda.org下载。
这是一个由Sejda支持的Web应用程序,具有上述相同功能,但通过Web界面。 你需要上传你的文件,这取决于你的输入集的大小,它可能不是你正确的解决方案。
如果您选择merge
命令并上传您的PDF文档,您将不得不标记复选框Add blank page if odd page number
以获得所需的行为。
您可以使用PDFsam :
pyPDF
包。 /path/to/blank.pdf
创建一个空白的PDF文件(我在这里创建了空白的PDF页面 )。 pdfmerge.py
,放在$PATH
任何目录中。 (我不是Windows用户,在Linux下这是直接的,请告诉我,如果你得到错误/如果它的工作。) pdfmerge.py
可执行文件 运行uniprint.py
一个仅包含要合并的PDF文件的目录。
#!/usr/bin/env python # -*- coding: utf-8 -*- from argparse import ArgumentParser from glob import glob from pyPdf import PdfFileReader, PdfFileWriter def merge(path, blank_filename, output_filename): blank = PdfFileReader(file(blank_filename, "rb")) output = PdfFileWriter() for pdffile in glob('*.pdf'): if pdffile == output_filename: continue print("Parse '%s'" % pdffile) document = PdfFileReader(open(pdffile, 'rb')) for i in range(document.getNumPages()): output.addPage(document.getPage(i)) if document.getNumPages() % 2 == 1: output.addPage(blank.getPage(0)) print("Add blank page to '%s' (had %i pages)" % (pdffile, document.getNumPages())) print("Start writing '%s'" % output_filename) output_stream = file(output_filename, "wb") output.write(output_stream) output_stream.close() if __name__ == "__main__": parser = ArgumentParser() # Add more options if you like parser.add_argument("-o", "--output", dest="output_filename", default="merged.pdf", help="write merged PDF to FILE", metavar="FILE") parser.add_argument("-b", "--blank", dest="blank_filename", default="blank.pdf", help="path to blank PDF file", metavar="FILE") parser.add_argument("-p", "--path", dest="path", default=".", help="path of source PDF files") args = parser.parse_args() merge(args.path, args.blank_filename, args.output_filename)
如果在Windows和Mac上可用,请发表评论。
如果不行,请留下评论/可以改进。
它适用于Linux。 将3个PDF文件加入到一个200页的PDF文件中不到一秒钟的时间。