使用Ghostscript脚本或其他工具,将两个多页PDF文件的奇数和偶数页交错排列。

3
我的扫描仪可以自动进纸,但不支持双面扫描。因此,如果我要扫描一份双面打印的多页文档,就会得到两个 PDF 文件,一个包含所有奇数页(奇数页 PDF 文件),另一个包含所有偶数页(偶数页 PDF 文件)。
我认为应该有一种 Ghostscript 脚本可以将这两个文件合并,使偶数页 PDF 文件中的每一页都作为奇数页 PDF 文件中每两页的后一页添加。
请问是否有人知道如何实现?
最好是能够带参数运行脚本,第一个参数指定输出文件,第二个参数指定奇数页 PDF 文件,第三个参数指定偶数页 PDF 文件。

2
请直接在SuperUser上查看更好的答案:http://superuser.com/questions/516612/merge-two-pdf-files-containing-even-and-odd-pages-of-a-book - Clément
同样的问题在Unix&Linux上。 - undefined
6个回答

6

更简单的方法:(来自超级用户

pdftk A=even.pdf B=odd.pdf shuffle A B output merged.pdf

或者如果B的页面按相反顺序排列:
pdftk A=even.pdf B=odd.pdf shuffle A Bend-1 output merged.pdf

2
我尝试了Dingo上面的脚本,它似乎很好用。 然而,在我的情况下,“even”文件中的页面是反转的。我只是把整个页面堆翻过来,放回扫描仪中。所以如果我扫描了5页双面页面,我将得到: 奇数页:1、3、5、7、9 偶数页:10、8、6、4、2 我需要的最终输出是:A1 B5 A2 B4 A3 B3 A4 B2 A5 B1。
#!/bin/bash
#script able to interleave the pages of two pdf files, saving the result in a new pdf file. 
#Useful for any use, specially to mount parallel text books

# This version assumes that filename2 is in the reverse order
# This is normally what happens if you just flip the pages over
# and scan the second side.

args=$#

if [[ $args -ge 2 ]]
then
  filename1=$1
  filename2=$2
  if [[ $args -ge 3 ]]
  then
    outputfile=$3
  else
    outputfile="interleaved.pdf"
    echo "output file will be: $outputfile"
  fi
else
  echo "enter the name (with extension) of first PDF"
  read filename1
  echo "enter the name (with extension) of second PDF"
  read filename2
  echo "enter the name (with extension) of the output PDF"
  read outputfile
fi

pages1="`pdftk "$filename1" dump_data output |grep Pages|cut -f2 -d :`"
pages2="`pdftk "$filename2" dump_data output |grep Pages|cut -f2 -d :`"


if [ $pages1 -gt $pages2 ] 
then
      pagesincr="$(echo "scale=0; $pages2+1" |bc -l)"
      echo "$filename1 has $pages1 pages"
      echo "$filename2 has $pages2 pages"

      rule="$(for ((a=1, b=$pages2 ; a <= $pages1, b >= 1 ; a++, b--)); do echo -n "A$a B$b "; done; for x in $(seq $pagesincr 1 $pages1); do echo -n "A$x ";done)"

      echo $rule

elif [ $pages2 -gt $pages1 ] 
then

      echo "$filename1 has $pages1 pages"
      echo "$filename2 has $pages2 pages"

      pagesincr=$(($pages2 - $pages1))
      echo $pagesincr
      rule="$(for ((a=1, b=$pages2 ; a <= $pages1, b >= (($pages2 - $pages1 + 1)) ; a++, b--)); do echo -n "A$a B$b "; done;  for x in $(seq $pagesincr -1 1); do echo -n "B$x ";done)"

      echo $rule
else
  echo "$filename1 has $pages1 pages"
  echo "$filename2 has $pages2 pages"

  rule="$(for ((a=1, b=$pages2 ; a <= $pages1, b >= 1 ; a++, b--)); do echo -n "A$a B$b "; done)"

  echo $rule
fi

pdftk A="$filename1" B="$filename2" cat $rule output "$outputfile"
echo "file created!"
exit 0

NB. 您可以在命令行上提供文件名,也可以让脚本要求您提供文件名。

希望这能帮助其他人。


嗯,你为什么不直接使用“shuffle”呢?http://superuser.com/questions/516612/merge-two-pdf-files-containing-even-and-odd-pages-of-a-book - Clément

2
因此,如果我正确理解,您有两个PDF文件:
  • odd.pdf
  • even.pdf
您需要从这两个多页PDF文件中交错这些页面:(奇数、偶数、奇数...等等...)
我之前为了同样的需求编写了一个脚本,并在此附上,它是交互式的,意味着它会询问参数,如果您更喜欢非交互式脚本,我可以进行修改。
它只需要PDFTK
#!/bin/bash
#script able to interleave the pages of two pdf files, saving the result in a new pdf file. Useful for any use, specially to mount parallel text books
echo "enter the name (with extension) of first PDF"
read filename1
echo "enter the name (with extension) of second PDF"
read filename2
pages1="`pdftk $filename1 dump_data output |grep Pages|cut -f2 -d :`"
pages2="`pdftk $filename2 dump_data output |grep Pages|cut -f2 -d :`"

if [ $pages1 -gt $pages2 ]
    then
    pagesincr="$(echo "scale=0; $pages2+1" |bc -l)"
echo "$filename1 has $pages1 pages"
echo "$filename2 has $pages2 pages"

rule="$(for x in $(seq 1 $pages2); do echo -n "A$x B$x ";  done; for x in $(seq $pagesincr $pages1); do echo -n "A$x ";done)"


    echo $rule

        elif
        [ $pages2 -gt $pages1 ]
            then
    pagesincr="$(echo "scale=0; $pages1+1" |bc -l)"

echo "$filename1 has $pages1 pages"
echo "$filename2 has $pages2 pages"

rule="$(for x in $(seq 1 $pages1); do echo -n "A$x B$x ";  done; for x in $(seq $pagesincr $pages2); do echo -n "B$x ";done)"


    echo $rule
                else
echo "$filename1 has $pages1 pages"
echo "$filename2 has $pages2 pages"

rule="$(for ((a=1, b=1; a <= $pages1, b <= $pages2 ; a++, b++)); do echo -n "A$a B$b "; done)"

echo $rule
fi

pdftk A=$filename1 B=$filename2 cat $rule output interleaved.pdf
echo "file created!"
exit 0

理论上,这正是我想要的。然而,当我进行测试时,以下是输出结果:“输入第一个PDF文件的名称(包括扩展名)odd.pdf输入第二个PDF文件的名称(包括扩展名)even.pdfodd.pdf有5页even.pdf有5页A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 A5错误:页面编号:6在文件odd.pdf中不存在遇到错误。未创建任何输出。完成。输入错误,因此未创建任何输出。文件已创建!” - jjbornheim
我仔细查看了脚本,虽然不是专家,但我想知道if测试是否应该使用-gt而不是-ge,否则前两种情况并不是互斥的。 - jjbornheim
在我的系统上,该脚本运行得非常顺利(可能与shell版本有关)。我创建了一个包含10页的PDF文档 http://ge.tt/33EtMuM/v/0 ,然后将其分成了两个文件,其中一个只包含奇数页面,另一个只包含偶数页面 http://ge.tt/33EtMuM 。结果是: '输入第一个PDF文档的名称(带扩展名)' 'odd.pdf' 输入第二个PDF文档的名称(带扩展名) even.pdf odd.pdf 共有 5 页 even.pdf 共有 5 页 A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 文件已创建! - Dingo
在我将-ge更改为-gt之后,它在所有情况下都完美地运行;这可能与shell版本有关,Mac OS X shell有一些怪癖。因此,既然我还没有这样做,让我说声谢谢! - jjbornheim
感谢您的故障排除,由于我已经验证了**-gt条件在旧版本的shell中也能正常工作,就像之前的-ge**语句一样,我将修改脚本 - 我编写的其他pdf脚本在这里:http://pastebin.com/u/dingodog - Dingo

1
问题在于您需要同时打开2个PDF文件才能有效地完成此操作,我认为目前还不可能。
我能够快速想到的唯一方法是使用“%d”格式OutputFile选项将每个PDF的每个页面输出到单独的文件中。然后,您可以将各个文件馈送回Ghostscript以将它们全部合并成一个最终的PDF文件。
您可能可以通过编写一些PostScript来执行基本相同的任务,但使用shell脚本可能更容易。

1

如果您想要合并PDF文件并交错页面,请使用jPDF Tweak。如果要倒序所有页面,请使用PDFTools。


0

我编写了一个Java应用程序(Windows / Linux),可以完美实现这一点!您需要扫描一个PDF中的所有偶数页,然后使用进纸器扫描PDF中的所有奇数页,之后您可以使用此工具将它们合并:

http://sourceforge.net/projects/duplexmerger/

你只需要输入两个PDF文件的路径,其余部分将自动处理。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接