Bash PDF合并未命中文件



我正在尝试将许多PDF文件合并为3000个左右的文件块。经过多次尝试,这个脚本似乎成功了。(当然我错了)

#!/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个两页PDF,每个输出文件(除了最后一个)都应该是6000页(因为我们在每个合并列表中有3000个PDF,在解析之前通过"wc-l"进行验证),而我只得到大约658页左右

除此之外,没有任何错误报告:

警告:嵌入式符号TT字体必须包含Platform=1 Encoding=0的cmap。
警告:嵌入符号TT字体必包含Platform=1 Encoding=0的cmapPlatform=1 Encoding=0的cmap。
警告:嵌入符号TT字体必须包含Platform=1 Encoding=1的cmap;
警报:嵌入符号TT-字体必须包含Platform=1 Encoding=0的cmap
该文件由以下人员制作:>>由Crystal提供技术支持请通知生成此文件的软件的作者,它不符合Adobe发布的PDF规范

一遍又一遍(但不是22000次)

当我尝试300-400个文件时,它运行得很顺利,但当我尝试完全运行时,2.5小时后,我得到的文件合并不到一半。

我的下一个想法是将每个两页的PDF转换为.pgm文件,但我不知道如何将它们重制为PDF(这样就不会出现字体嵌入问题)。我是不是错过了什么?(可能)

您可能会更好地使用更适合任务的工具。pdfwrite(用于发送PDF文件的Ghostscript设备)在我看来不是合适的工具。

为了"合并"PDF文件,Ghostscript将输入完全解释为标记操作,然后将标记操作重写为PDF文件。在创建操作列表时,需要保存大量信息(字体、图像等),并与新输入进行比较,看看我们是否已经有了副本。随着输入越来越大,扫描该列表需要更长的时间,当然内存消耗也会增加。您可能会发现Ghostscript已经在交换内存。

现在我不确定这是你的实际问题,或者你是说在你"合并"文件后,缺少了页面。这种情况不应该发生。您也没有说明您正在使用的Ghostscript的版本。

尽管如此,我认为像pdftk这样的工具在进行这种合并方面会更快,尽管最终的PDF文件可能比pdfwrite更大/效率更低。

相关内容

  • 没有找到相关文章

最新更新