Ghostscript脚本或其他,用于交错来自两个多页pdf文件的奇数页和偶数页

时间:2012-08-30 15:32:01

标签: pdf ghostscript pdftk

我的扫描仪有纸张进纸但没有双面扫描。因此,如果我扫描打印在纸张两面的多页文档,我将最终得到两个pdf文件,一个包含所有奇数页(奇数页pdf文件),另一个包含所有偶数页(偶数页pdf文件)。

我觉得应该可以使用Ghostscript脚本合并这两个文件,使得偶数页面pdf文件中的每个页面都会作为每个其他页面添加到奇数页面pdf文件中。

有人知道怎么做吗?

最好,脚本将接受参数,以便第一个参数指定输出文件,第二个参数指定奇数页面pdf文件,第三个参数指定偶数页面pdf文件。

6 个答案:

答案 0 :(得分:2)

所以,如果我理解,你有两个pdf文件

  • odd.pdf
  • even.pdf

你需要从这两个多页pdf文件中删除这些页面:(奇数,偶数,奇数......等等......)

我前段时间写过,为了同样的需要,我附上了一个脚本,它是INTERACTIVE,意思是它要求参数,如果你喜欢非交互式脚本,我可以修改它

只需要 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

答案 1 :(得分:2)

我上面尝试过Dingo的剧本,似乎运作良好。

但是,就我而言,“偶数”文件中的页面是相反的。我只是把整堆纸翻过来放回扫​​描仪。所以,如果我有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。您可以在命令行上提供文件名,否则脚本会询问您的文件名。

希望能帮助别人。

答案 2 :(得分:2)

更简单:(来自superuser

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

答案 3 :(得分:1)

问题是您需要一次打开2个PDF文件才能有效地执行此操作,而目前我无法想到这一点。

我能想到的唯一方法就是使用'%d'格式的OutputFile选项将每个PDF的每个页面输出到一个单独的文件中。然后,您可以将单个文件反馈给Ghostscript,将它们全部合并为一个最终的PDF文件。

您可能可以通过编写一些PostScript来完成相同的任务,但使用shell脚本可能更容易。

答案 4 :(得分:1)

如果要合并PDF交错页面,请使用jPDF Tweak。要反转所有页面的顺序,请使用PDFTools

答案 5 :(得分:0)

我编写了一个java应用程序(Windows / Linux)就是这样做的!您必须扫描一个PDF中的所有偶数页,然后扫描PDF中的所有奇数页(使用进纸器),然后您可以使用此工具将它们组合起来:

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

您只需要输入2个PDF文件的路径,其余的将自动处理。 :)