Pdf

如何使用命令行將每個 PDF 頁面分成兩頁?

  • October 26, 2020

我有一些從原件掃描的電子書。它們經過格式化,使得單個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 

更一般的情況:

  1. 上面的範例假定所有頁面的大小相同。該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 

引用自:https://unix.stackexchange.com/questions/405610