ImageMagick으로 2GB 이상의 제한적인 PDF 작성


19

convert약 2,000 개의 이미지로 PDF 파일을 만드는 데 사용 하고 있습니다.

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

출력 파일이 메시지와 함께 2 ^ 31-1 바이트 (2GB -1)에 도달하면 프로세스가 재현 가능합니다.

convert: unknown `out.pdf'.

PDF 파일 사양 은 ≈10GB를 허용합니다 . 에서 더 많은 정보를 가져 오려고 시도했지만 -debug all로깅 출력에 도움이되는 것을 보지 못했습니다. 파일 시스템은 ext3 이며, 최대 16GiB 이상의 파일허용합니다 (더 많을 수 있음) . 에 관해서는 ulimit, file size이다 unlimited. /etc/security/limits.conf주석 처리 된 행만 포함합니다. 이로 인해 다른 원인이 무엇이고 한도를 늘리려면 어떻게해야합니까?

ImageMagick 버전 : 6.4.3 2016-08-05 Q16 OpenMP
배포 : SLES 11.4 (i586)


4
이미지의 절반 (또는 가장 적합한 것)으로 두 개의 파일을 만든 다음 pdftk와 병합 할 수 있습니까?
Gallifreyan

1
> 2Gb PDF 파일을 생성 할만한 이유가 있습니까? 많은 PDF 리더가이를 열려고 시도 할 때 두렵습니다.
dr01

ImageMagick의 사본이 큰 파일 지원없이 컴파일 되었기 때문입니다. 버그를
Reinstate Monica-M. Schröder

@ dr01 : 왜 그래야합니까? 대용량 파일 지원은 수십 년 동안 사용되어 왔습니다.
복원 모니카

@ MartinSchröder 그리고 일부 프로그램은 너무 큰 파일을 처리 할 수 ​​없습니다. 어쨌든, 나는 2-Gb (즉, ~ 150'000 A4 페이지) PDF 파일을 만드는 이유가 궁금했습니다.
dr01

답변:


24

당신의 한계는 실제로 파일 시스템에서 비롯된 것이 아닙니다. 또는 내가 생각 하는 패키지 버전에서 .

32 비트 버전의 OS를 사용하면 2GB 제한이 발생합니다.

하드웨어에서 지원하는 경우 파일을 늘리는 옵션은 64 비트 버전을 설치하는 입니다.

큰 파일 지원 참조

전통적으로 많은 운영 체제와 기본 파일 시스템 구현은 32 비트 정수를 사용하여 파일 크기와 위치를 나타냅니다. 결과적으로 파일은 2 32-1 바이트 (4GB-1) 보다 클 수 없습니다 . 많은 구현에서 크기를 부호있는 숫자로 처리하여 문제를 악화 시켰으며, 이로 인해 한계가 2 31-1 바이트 (2 GB-1) 로 낮아졌습니다 .


3
참고 : Linux는 약 10 년 전부터 64 비트 파일 크기와 위치를 32 비트에서도 사용할 수 있습니다. 확실하지 않지만이 PDF 생성기 도구는이 기능을 사용할 수 있습니다.
peterh는 Monica Monica를 복원

2
64 비트를 가진 @peterh off_t는 소프트웨어가 RAM에 전체 파일을 작성하여 한 번에 디스크에 쓰려고하면 도움이되지 않습니다.
Dmitry Grigoryev '

2
리눅스는 크기를 부호가있는 것으로 취급하지 않지만, 커널은 기능하기 위해 약간의 전용 주소 공간이 필요하며, 예전에는 2GB를 사용자 영역으로 남겨 두는 것이 많은 것처럼 보였으므로 커널은 다른 2GB를 예약합니다.
Dmitry Grigoryev

2
@DmitryGrigoryev : 크기는 서명되지 않지만 포인터의 차이 ( ptrdiff_t) 크기는 최대로 제한되어야 함을 효과적으로 의미하는이다 (서명) 값을 ptrdiff_t나타낼 수있는, 또는 다른 당신이 얻을 정말 불쾌한 응용 프로그램이 더 있다고 UB와 UB-관련 버그 해결하는 좋은 방법.
R ..

@DmitryGrigoryev이 경우 프로그램은 실행 코드와 같은 것을 저장하기 위해 더 많은 메모리가 필요하기 때문에 정확히 2GB-1 바이트를 갖지 않습니다.
user23013

12

convert1GiB에 사용되는 픽셀 캐시를 제한 해보십시오 .

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

이로 인해 ImageMagic은 RAM 버퍼에 2GiB 이상을 맞추려고하는 대신 이미 처리 된 데이터를 디스크에 정기적으로 덤프해야합니다.

32 비트 Linux에서 단일 프로세스에 사용 가능한 가상 메모리의 양인 BTW는 VMSPLIT커널 구성 설정에 의해 정의됩니다 . 2G / 2G (커널의 경우 2GB + 사용자 영역의 경우 2GB) 또는 1G / 3G (커널의 경우 1GB + 사용자 영역의 경우 3GB) 일 수 있습니다. 실행중인 시스템에서 설정은 다음을 통해 찾을 수 있습니다.

zcat /proc/config.gz | grep VMSPLIT

일부 시스템에서는 커널 구성이 /boot/config-$(uname -r)대신 저장 됩니다.


1

대량의 사진이 아닌 경우 TeX / LaTeX를 사용하여 PDF를 만들 수 있습니다. 그러면 변환기 충돌 문제없이 동일한 결과 (이미지의 PDF)를 얻을 수 있습니다. TeX의 파일 제한은 시스템 (하드웨어 + OS)이어야합니다.

그러나 쉘 스크립트를 사용하여 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로 이동합니다. 즉, 선행 0의 가변 수입니다. 해결 방법 : 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) 호출 스크립트 : 로더

7) TeX 컴파일 : pdflatex out.pdf

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.