我有几本从原件扫描而来的电子书。它们经过了格式化,因此一个PDF页面包含两个实际页面:一个在左边,一个在右边。
我想以编程方式将每个PDF页面分为两部分,因此PDF页面1的左侧50%变为页面1,其右侧变为2页面,以此类推。
有谁知道命令行实用程序或脚本可以帮助您解决此问题?
来自的输出pdfimages -list -f 1 -l 1 file.pdf
:
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 1921 1561 rgb 3 8 jpeg no 643 0 200 200 200K 2.3%
1 1 stencil 1 1 - 1 1 image no [inline] 0.692 2 - -
1 2 stencil 1 1 - 1 1 image no [inline] 0.722 0.650 - -
1 3 stencil 1 1 - 1 1 image no [inline] 3 3 - -
第二PDF:
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 456 625 gray 1 8 jpx yes 251 0 72 72 11.7K 4.2%
这应该可以使用它所需的pdftk
工具(和ghostscript
)。
第一步:拆分成单独的页面
pdftk clpdf.pdf burst
这将产生文件pg_0001.pdf, pg_0002.pdf, ... pg_NNNN.pdf
,每页一个。它还产生doc_data.txt
包含页面尺寸的信息。
第二步:创建左右半页
pw=`cat doc_data.txt | grep PageMediaDimensions | head -1 | awk '{print $2}'`
ph=`cat doc_data.txt | grep PageMediaDimensions | head -1 | awk '{print $3}'`
w2=$(( pw / 2 ))
w2px=$(( w2*10 ))
hpx=$(( ph*10 ))
for f in pg_[0-9]*.pdf ; do
lf=left_$f
rf=right_$f
gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${w2} 0]>> setpagedevice" -f ${f}
done
第三步:左右合并以生成newfile.pdf
包含单个页面的.pdf。
ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
pdftk `cat fl` cat output newfile.pdf
上面的示例假定所有页面的大小均相同。该doc_data.txt
文件包含每个拆分页面的大小。如果命令
grep PageMediaDimensions <doc_data.txt | sort | uniq | wc -l
不返回1,则页面具有不同的尺寸,并且在第二步中需要一些额外的逻辑。
如果分割比例不完全是50:50 w2=$(( pw / 2 ))
,则需要比上面示例中使用的公式更好的公式。
第二个示例显示了如何处理这种更一般的情况。
第一步:pdftk
像以前一样拆分
第二步:现在创建三个文件,其中包含每个页面的宽度和高度,以及一个默认值,用于左页面将使用的拆分比例。
grep PageMediaDimensions <doc_data.txt | awk '{print $2}' > pws.txt
grep PageMediaDimensions <doc_data.txt | awk '{print $3}' > phs.txt
grep PageMediaDimensions <doc_data.txt | awk '{print "0.5"}' > lfrac.txt
lfrac.txt
如果有关于在何处分割不同页面的信息,则可以手动编辑该文件。
第三步:现在,使用不同的页面尺寸和(如果已编辑)不同的分割位置来创建左右拆分页面。
#!/bin/bash
exec 3<pws.txt
exec 4<phs.txt
exec 5<lfrac.txt
for f in pg_[0-9]*.pdf ; do
read <&3 pwloc
read <&4 phloc
read <&5 lfr
wl=`echo "($lfr)"'*'"$pwloc" | bc -l`;wl=`printf "%0.f" $wl`
wr=$(( pwloc - wl ))
lf=left_$f
rf=right_$f
hpx=$(( phloc*10 ))
w2px=$(( wl*10 ))
gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
w2px=$(( wr*10 ))
gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${wl} 0]>> setpagedevice" -f ${f}
done
第四步:这与上一个更简单的示例中的合并步骤相同。
ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
pdftk `cat fl` cat output newfile.pdf
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句