2

私は3000かそこらのファイルのチャンクで多くのPDFファイルをマージしようとしています。何度も試した後、このスクリプトでうまくいくようでした。(もちろん私は間違っていました)

#!/bin/bash

basepath='/home/lemonidas/pdfstuff';
datename=`date "+%Y%m%d%H%M.%S"`;
start=`date "+%s"`;
echo "parsing pdf list to file..."
find $basepath/input/ -name "*.pdf" | xargs -I {} ls {} >> $basepath/tmp/biglist$datename.txt

split -l 3000 $basepath/tmp/biglist$datename.txt $basepath/tmp/splitfile
rm $basepath/tmp/biglist$datename.txt
echo "deleting big file..."
echo "done splitting!"

declare -i x 
x=1

for f in $basepath/tmp/splitfile*
do
linenum=`cat $f | wc -l`;
echo "Processing $f ($linenum lines)..."

# merge to one big PDF
cat $f | xargs  gs -q -sstdout=$basepath/error.log -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$basepath/output/$x.big.pdf  2>$basepath/error.log
echo "Completed PDF $x"
 (( x++ ))

# delete the list file
rm $f
echo "Deleted processed file $f"
done
end=`date "+%s"`;
echo "Started: $start"
echo "Finished: $end"

問題は、22000の2ページのPDFがあり、各出力ファイル(最後のファイルを除く)は6000ページである必要があります(解析前に「wc-l」で確認されるように、各マージリストに3000のPDFがあるため)。約658ページしかありません。

gsによるこれ以外のエラーは報告されません。

警告:埋め込まれたシンボリックTTフォントには、Platform = 1 Encoding=0のcmapが含まれている必要があります。
警告:埋め込まれたシンボリックTTフォントには、Platform = 1 Encoding=0のcmapが含まれている必要があります。
警告:埋め込まれたシンボリックTTフォントには、Platform = 1 Encoding=0のcmapが含まれている必要があります。
警告:埋め込まれたシンボリックTTフォントには、Platform = 1 Encoding=0のcmapが含まれている必要があります。
警告:埋め込まれたシンボリックTTフォントには、Platform = 1 Encoding=0のcmapが含まれている必要があります。
警告:埋め込まれたシンボリックTTフォントには、Platform = 1 Encoding=0のcmapが含まれている必要があります。
警告:埋め込まれたシンボリックTTフォントには、Platform = 1 Encoding=0のcmapが含まれている必要があります。
警告:埋め込まれたシンボリックTTフォントには、Platform = 1 Encoding=0のcmapが含まれている必要があります。
このファイルには、修復または無視されたエラーがありました。
ファイルの作成者:>>>> Powered By Crystal このファイルを作成したソフトウェアの作成者に、アドビが公開しているPDF仕様に準拠していないことを通知してください。

何度も何度も(ただし22000回ではありません)

300〜400のファイルで試してみるとスムーズに実行されますが、フルランで試してみると、2.5時間後には、マージされたファイルの半分よりはるかに少なくなります。

私の次の考えは、各2ページのPDFを.pgmファイルに変換することですが、PDFとして再作成する方法がわかりません(フォントの埋め込みの問題が発生しないようにするため)。私は何かが足りないのですか?(おそらく)

4

1 に答える 1

2

タスクにより適したツールを使用する方がよいでしょう。pdfwrite (PDF ファイルを発行するための Ghostscript デバイス) は、私の意見では、これに適したツールではありません。

PDF ファイルを「マージ」するために、Ghostscript は入力をマーキング操作に完全に解釈し、マーキング操作を PDF ファイルとして書き直します。操作のリストを作成している間、大量の情報 (フォント、画像、その他のもの) を保持し、新しい入力と比較して、既にコピーがあるかどうかを確認する必要があります。入力が大きくなるにつれて、そのリストをスキャンするのに時間がかかり、もちろんメモリ消費量が増加します。Ghostscript が既にメモリをスワップしていることに気付くかもしれません。

これが実際の問題なのか、ファイルを「マージ」した後にページが欠落していると言っているのかどうかはわかりません。そんなことはあってはなりません。また、使用している Ghostscript のバージョンについても言及していません。

それでも、pdftk のようなツールは、この種のマージを行うのに高速であると思いますが、最終的な PDF ファイルは pdfwrite よりも大きく/効率が悪い可能性があります。

于 2012-12-05T13:56:06.063 に答える