使用 ImageMagick 创建 PDF 时获得超过 2 GB 的限制

使用 ImageMagick 创建 PDF 时获得超过 2 GB 的限制

我正在使用convert大约 2,000 张图像创建 PDF 文件:

convert 0001.miff 0002.miff ... 2000.miff -compress jpeg -quality 80 out.pdf

当输出文件达到 2^31-1 字节 (2 GB −1) 并显示消息时,该过程可重复终止

convert: unknown `out.pdf'.

PDF 文件规范允许约 10 GB。我尝试从 中获取更多信息-debug all,但在日志输出中没有看到任何有用的信息。文件系统是外部3哪个允许文件大小至少达到 16 GiB(可能更多)。至于ulimitfile sizeunlimited/etc/security/limits.conf仅包含注释掉的行。还有什么可能导致这种情况以及我怎样才能增加限额?

ImageMagick 版本:6.4.3 2016-08-05 Q16 OpenMP
发行版:SLES 11.4 (i586)

答案1

您的限制实际上并非源于文件系统;而是来自文件系统。或来自包版本我认为

您的 2GB 限制来自于您使用 32 位版本的操作系统。

增加文件的选项是安装 64 位版本如果硬件支持的话

大文件支持

传统上,许多操作系统及其底层文件系统实现使用 32 位整数来表示文件大小和位置。因此,任何文件都不能大于 2 32 − 1 字节 (4 GB − 1)。在许多实现中,将大小视为有符号数字会加剧问题,这进一步将限制降低到 2 31 − 1 字节 (2 GB − 1)。

答案2

尝试将使用的像素缓存限制convert为 1 GiB:

convert 0001.miff ... 2000.miff -limit memory 1GiB -limit map 1GiB -compress jpeg -quality 80 out.pdf

希望这将迫使 ImageMagic 定期将已处理的数据转储到磁盘上,而不是尝试在 RAM 缓冲区中容纳超过 2 GiB 的数据。

顺便说一句,32 位 Linux 上单个进程可用的虚拟内存量由VMSPLIT内核配置设置定义。这可以是 2G/2G(2GB 用于内核 + 2GB 用于用户区)或 1G/3G(1 GB 用于内核 + 3 GB 用于用户区)。在正在运行的系统上,可以通过以下方式找到该设置

zcat /proc/config.gz | grep VMSPLIT

在某些系统上,内核配置被存储在/boot/config-$(uname -r)其中。

答案3

如果不是大量照片,您可以使用 TeX/LaTeX 创建 PDF。然后您仍然可以获得相同的结果(图像的 pdf),而不会出现转换器崩溃问题。 TeX 上的文件限制应该只是您的系统(硬件+操作系统)

但我认为你可以使用 shell 脚本来编写 TeX:

0)

mkdir convert
pushd convert
PATH=convert:$PATH /* keep everything in one directory for tidyness.*/

1)制作模板

1.1)我确信有一种方法可以一次性完成此步骤,通过用变量替换图像名称并插入而不是附加,并格式化 $FOO 以具有正确的前导 0,但以下只是我所知道的。

1.2) 模板需要拆分以便脚本插入文件名

1.3) nano tmplt1 /* 或您选择的编辑器*/

/* white space line */ 
\begin{figure}[h!]
    \includegraphics[width=0.5\linewidth]{
/* at this point the script will insert $FOO, the file name variable */

1.3.1) 但是,您的文件会变成 0001.miff … 0010.miff … 0100.miff … 2000.miff。即可变数量的前导零。解决方法:tmplt1 的 4 个版本:tmplt1-9、tmplt10-99、tmplt100-999、tmplt1000-2000。 tmplt1-9以“...width]{000”结束(即加3个0); tmplt10-99 结束“...width]{00”(即添加 2 个 0)。 100-999加1个零,1000-2000与tmplt1相同

1.4) 模板的下一部分:nano tmplt2 /* OEOYC */

.miff}
   \caption{ /* if you want to caption, otherwise skip to  tmplt3.
Same again, script will insert $FOO here */

1.5) 模板的下一部分:nano tmplt3 /* OEOYC */

}
\label{f:   /*if you want them labelled which is actually
a index/reference for the text to refer to, not a caption.
Same again, the script will insert $FOO here. If you do not
want labels, skip to tmplt4*/

1.6) 下一个模板:nano tmplt4 /* OEOYC */

    }
\end{figure}

2) 制作文件开头:nano head /* OEOYC */

\documentclass{article} /* Or more suitable class */
 \usepackage{graphicx}
 \begin{document}
  /* white space line*/

3)使文件结束:nano foot /*OEOYC */

\end {document} 

4)制作脚本:nano loader /* OEOYC */

#! /bin/bash

cat head > out.pdf

for FOO in {1...9}
do
    cat tmplt1-9 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt2 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt3 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt4 >> out.pdf
done

for FOO in {10...99}
do
    cat tmplt10-99 >> out.pdf /* this looks like a lot but
is actually copy-paste of first block, just add relevant 0's and 9's */
    echo "$FOO" | cat >> out.pdf
    cat tmplt2 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt3 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt4 >> out.pdf
done

for FOO in {100...999}
do
    cat tmplt100-999 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt2 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt3 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt4 >> out.pdf
done

for FOO in {1000...2000}
do
    cat tmplt1000-2000 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt2 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt3 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt4 >> out.pdf
done

cat foot >> out.pdf

5) 使脚本可执行: chmod u+x loader

5.1) 经过测试,我发现每次插入 $FOO 时,它都会分散在 3 行中。除了进入脚本并手动删除回车符之外,我不知道任何解决方法。 2000张照片至少只有36张

6)调用脚本:loader

7)编译TeX:pdflatex out.pdf

相关内容