Pdf
如何使用命令行將每個 PDF 頁面分成兩頁?
我有一些從原件掃描的電子書。它們經過格式化,使得單個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 則頁面具有不同的尺寸,並且在第二步中需要一些額外的邏輯。 2. 如果拆分不完全是 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