【问题标题】:Bash PDF-merging misses filesBash PDF 合并遗漏文件
【发布时间】:2012-11-23 03:59:30
【问题描述】:

我正在尝试将许多 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 个 2 页 PDF,每个输出文件(除了最后一个)应该是 6000 页(因为我们在每个合并列表中有 3000 个 PDF,在解析之前由“wc -l”验证),而我只得到大约 658 页左右。

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

警告:对于 Platform=1 Encoding=0,嵌入式符号 TT 字体必须包含 cmap。
警告:对于 Platform=1 Encoding=0,嵌入式符号 TT 字体必须包含 cmap。
警告:对于 Platform=1 Encoding=0,嵌入式符号 TT 字体必须包含Platform=1 Encoding=0 的 cmap。
警告:嵌入式符号 TT 字体必须包含 Platform=1 Encoding=0 的 cmap。
警告:嵌入式符号 TT 字体必须包含 Platform=1 Encoding= 的 cmap 0.
警告:对于 Platform=1 Encoding=0,嵌入式符号 TT 字体必须包含 cmap。
警告:对于 Platform=1 Encoding=0,嵌入式符号 TT 字体必须包含 cmap。
警告:嵌入式符号 TT 字体必须包含用于 Platform=1 Encoding=0 的 cmap。
此文件包含已修复或忽略的错误。
文件制作者:>>>> Powered By Crystal 请通知生成此文件的软件的作者它不符合 Adob​​e 发布的 PDF 规范。

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

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

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

【问题讨论】:

    标签: bash pdf ghostscript


    【解决方案1】:

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

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

    现在我不确定这是您的实际问题,或者您是否说“合并”文件后缺少页面。那不应该发生。你也没有说你使用的是什么版本的 Ghostscript。

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

    【讨论】:

    • 我正在使用 GS 8.61 我希望如果进程阻塞,它至少会报告一个错误。我会尝试使用 pdftk 并报告回来。谢谢!
    • 8.61已经很老了(现在快5岁了),目前的版本是9.06
    • 可能是因为我运行的 ubuntu 版本是 8.04。无论如何,您的解决方案要好得多(当然就时间而言),因为它在 20 分钟内完成,而不是 2.5 小时!
    • @lemonidas:我经常发现使用pdftk 可以非常快地合并大量 PDF。之后,通过 Ghostscript 运行 pdftk 的结果(使用-sDEVICE=pdfwrite 直接输出 PDF)可能能够显着缩小文件大小。 (但请仔细检查,如果所有字形仍在所有页面上!)
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2013-05-15
    • 2020-07-04
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多