如何组合显示在同一页面上的两个PDF页面?

时间:2009-02-11 07:38:38

标签: pdf pdf-generation

我正在寻找一种免费工具,可以重新排列PDF文档的页面,并在每张纸上组合多个页面。第一部分(重新安排)很容易通过许多工具解决(我使用PyPDF)。

问题在于第二个要求:将两个(或更多)页面组合​​成单个页面。例如,取两个页面(A和B),旋转它们,缩放并组合成一个页面,如下

------       ------            ------
|     |      |      |          |     |
|  A  |      |  B   |          | a   |
|     |      |      |          |     |
|     |      |      |  --->    ------
|     |      |      |          |     |        
|     |      |      |          | b   |        
|     |      |      |          |     |        
------       ------            ------

解决方案需要在Linux上运行,最好也在Windows上运行。我正在寻找使用Python或Perl绑定的控制台应用程序或库。

编辑pdfnup库应该执行这种转换,并且是跨平台的,但由于类似于{{3的错误,我无法使用它}}

11 个答案:

答案 0 :(得分:23)

这是我为PDF找到的工具的摘要(我想找到相当于psup和psbook)

  • 创建小册子:pdfbook,pdf-tools(命令:pdfbklt)
  • 合并PDF文件:pdfmerge,pdfjam(命令:pdfjoin)
  • 旋转页面:pdfjam(命令:pdf90)
  • 每张多页:pdfjam(命令:pdfnup)
  • 制作海报(每页多张):pdfposter

来自我的包经理:

制作A6小册子:

pdfbook -2 -p a5 infile.pdf outfile.pdf

pdf-tools包含:

  • pdfbklt:创建小册子
  • pdfrevert:删除对PDF文件的一层更改,尝试最大化输出文件的大小(以考虑线性化PDF)。
  • pdfstamp:将给定字符串添加到给定位置,字体和大小的infile .pdf文件中。

还有多种:http://multivalent.sourceforge.net/Tools/index.html

答案 1 :(得分:9)

在Linux上,您可以将PDF文件转换为Postscript并使用psnup。调用它的确切方法取决于您希望如何将页面放在一起,是否要旋转它们,要使用的纸张尺寸等等,但它会是这样的:

pdf2ps infile.pdf infile.ps
psnup -2 infile.ps outfile.ps
ps2pdf outfile.ps outfile.pdf

根据您可用的工具,您可能有更有效的方法来执行此操作 - psnup当然不是唯一的方法,但它是一个相对知名的程序(无论如何都在Linux上)。

答案 2 :(得分:2)

查看使用this answer强加PDF页面的Multivalent

答案 3 :(得分:2)

如果您使用Linux,则可以使用BookletImposer将多个PDF页面放在一个页面上。

对于Ubuntu用户,此工具可在Ubuntu软件中心获得。

答案 4 :(得分:1)

在回答您的问题时,您需要一个PDF“拼版”工具,这是一种花哨的方式,可以说明将PDF页面图像排列到特定阵列上以创建新的单个PDF页面的工具。想象一下,它就像排版报纸一样。您可以在某个固定尺寸(以cm为单位)的页面上定义一定数量的列宽,一定数量的行深,一定数量的行。然后使用pdf源文件中的页面从上到下,从左到右填充这些空槽。在OP的情况下,他们想要创建一个页面,由两个8.5x11页面组成,这些页面排列成1x2阵列(1列,2行)。它们的页面将按以下顺序放入数组中:1,2。因此,您将第一页(PDF格式的第1页)放入阵列的第一个插槽(第1列,第1行),然后将第二页(第2页)放入第二个插槽(第1列,第2行) )。

如何使用该工具实现此目的: 下载旧版的Multivalent。请注意,作者在没有解释的情况下从最新版本中删除了好的工具类,因此您必须使用较旧的工具类。这是截至02/12的工作链接: http://code.google.com/p/pdfsizeopt/downloads/detail?name=Multivalent20060102.jar 为简单起见,我将jar文件重命名为m.jar。 不言而喻,你需要安装JRE才能工作,但我会把它放在那里。 将m.jar添加到Java类路径环境变量(用于脚本)或使用-cp选项和相对路径运行命令行语法(如下所示)。注意,我在下面的示例中从安装目录的命令行运行它。否则从root提供绝对路径(如c:\ 1 \ bin \ m.jar)。

这是一个完全符合OP发布内容的示例: C:\ 1 \ bin> java -cp m.jar tool.pdf.Impose -dim 1x2 -verbose -papersize“21.59x55.88cm”-layout“1,2”yourfilename.pdf

注意,-dim选项在Columns x Rows中创建数组。 -papersize在这里以厘米为单位指定,但如果你需要英寸,只需乘以英寸2.54即可获得厘米。 -layout选项为您提供要填充阵列中空插槽的顺序,从上到下,从左到右填充。在这种情况下,我们希望页面顶部的pdf和底部的第二页,所以我们的参数是“1,2”。最后一个参数是您的实际源文件。完成后,该工具将输出一个名为yourfilename-up.pdf的文件。

希望有所帮助。

-Matt Zweil

答案 5 :(得分:0)

检查PyPDF的源代码,尤其是rotateClockwise()方法。必须有一个写入页面内容的地方。在内容之前插入“q”运算符(保存状态)和“cm”(使用缩放矩阵的正确参数)和之后的“Q”运算符(恢复状态)。

请参阅PDF documentation以获取有关运算符和页面结构的说明(滚动到底部以获取一些有用的链接)。

不要忘记向PyPDF发送补丁:)

[编辑]您可能还想查看包含pdfnup命令的pdfjam sources

答案 6 :(得分:0)

这是一个perl函数,用于从第三方应用程序中获取一个完整的prn文件目录,并创建一个合并的pdf文件。

sub runMerged($)
{
    my($path) = @_;

    print "Generating merged PDFs for $path\n";

    my @files = sort(getFiles($path, ".prn\$"));
    if (scalar(@files))
    {
        open(MERGE, ">$path/merged.prn");
        for (my $i = 0; $i < scalar(@files); $i++)
        {
            print MERGE "^L\n" if ($i > 0);

            open(FN, "$path/" . $files[$i]);
            while (my $line = <FN>)
            {
                print MERGE $line;
            }
            close(FN);
        }

        chdir("$BASE_PATH/txt2pdf");
        print `./txt2pdf.pl $path/merged.prn`;
    }
}

答案 7 :(得分:0)

本周我有类似的需求。 但是我需要在A3表格(肖像)中重复每张A4页面(横向)“两次”,然后将其切成两半。

我发现了一个Acrobat插件,其中包含大量拼版功能,可以满足我的需求,并且具有30天的全功能试用版。

希望这对其他人有帮助 http://www.pdfsnake.com/

答案 8 :(得分:0)

我和你有同样的问题,这就是我所做的:

  1. 将pdf文件中的所有页面作为单独的文件提取
  2. 在irfanView(带插件)中,我创建了一个垂直的“全景”图像
  3. 将pdf文件拖到图像部分
  4. 点击已创建
  5. 创建“图像”,使所有页面彼此跟随,作为一个非常长的垂直图像
  6. 您可以导出为PDF,几乎不会降低质量。
  7. 享受

答案 9 :(得分:0)

这是一个脚本,用于在这个尺寸加倍的纸张上重复两次页面(如A5,风景)(A4,肖像):

#!/bin/bash
INPUTFILE=$*
PAGENUM=`pdftk ${INPUTFILE} dump_data | grep NumberOfPages | cut -d : -f 2  | cut -d " " -f 2`
PAGES=`seq 1 ${PAGENUM}`
DUPAGES=`for i in ${PAGES} ; do echo $i $i | tr "\n" " " ; done`
OUTPUT1=`basename ${INPUTFILE} .pdf`.dup.pdf
OUTPUT2=`basename ${INPUTFILE} .pdf`.double.pdf
pdftk ${INPUTFILE} cat ${DUPAGES} output ${OUTPUT1}
pdfjam --nup 1x2 ${OUTPUT1} --outfile ${OUTPUT2}

它并不优雅;它可以在没有第二次pdftk调用的情况下完成,并且它不适用于包含空格的文件。但它适用于多页pdf。

答案 10 :(得分:0)

使用Adobe Acrobat XI Pro打开第1个文档。 编辑,选择&#34;拍摄快照&#34;,然后单击要复制的内容的顶角并拖动到对角。 在Paint中打开一张干净的纸。 单击绘制中的干净纸张并控制V以将第一个文档粘贴到干净的纸张中。 对要在同一页面上组合的第2个项目重复操作,除了在Paint画面中暂时将第2个项目置于第1个项目之外。 然后拖动第二个项目,将其放置在“Paint Sheet”中所需的位置。 保存油漆工作表文件,你就完成了!