原稿からスキャンした電子ブックが複数冊あります。単一の形式で構成されます。PDFページ2個入っています実際のページ:左側に一つ、右側に一つ。
プログラム的に各PDFページを2つの部分に分割し、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 - -
2番目の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%
ベストアンサー1
これは機能し、pdftk
ツール(およびghostscript
)が必要です。
簡単なケース:
ステップ1:別のページへ
pdftk clpdf.pdf burst
pg_0001.pdf, pg_0002.pdf, ... pg_NNNN.pdf
これにより、各ページに1つずつファイルが作成されます。また、doc_data.txt
ページサイズを含むコンテンツを生成します。
ステップ2:左右の半ページを作成
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
3番目のステップ: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 ))
上記の例で使用されているよりも優れた式が必要です。
2番目の例は、より一般的なケースを処理する方法を示しています。
ステップ1:pdftk
前と同様に分割
ステップ2:次に、各ページの幅と高さ、および左ページで使用する分割セクションのデフォルト値を含む3つのファイルを作成します。
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
複数のページを分割する場所に関する情報がある場合は、ファイルを手動で編集できます。
3番目のステップ:次に、さまざまなページサイズと分割のためのさまざまな小数点位置(編集した場合)を使用して、左側の分割ページと右側の分割ページを作成します。
#!/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
4番目のステップ:これは、前の簡単な例と同じマージステップです。
ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
pdftk `cat fl` cat output newfile.pdf