ImageMagick ile PDF oluşturmada 2 GB sınırını aşın


19

convertYaklaşık 2.000 görüntüden bir PDF dosyası oluşturmak için kullanıyorum :

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

Çıktı dosyası iletiyle 2 ^ 31-1 bayta (2 GB −1) ulaştığında işlem yeniden üretilebilir

convert: unknown `out.pdf'.

PDF dosya belirtimi GB10 GB'a izin verir . Daha fazla bilgi almaya çalıştım -debug all, ancak günlük çıktısında yararlı bir şey görmedim. Dosya sistemidir ext3 (daha fazla olabilir) 16 GiB kadar en az dosyalar için izin verir . Gelince ulimit, file sizeöyle unlimited. /etc/security/limits.confyalnızca yorum yapılmamış satırlar içerir. Buna başka ne neden olabilir ve sınırı nasıl artırabilirim?

ImageMagick sürümü: 6.4.3 2016-08-05 Q16 OpenMP
Dağıtım: SLES 11.4 (i586)


4
Resimlerin yarısı ile (veya size en uygun olanı) iki dosya oluşturmanız ve bunları pdftk ile birleştirmeniz mümkün mü?
Gallifreyan

1
> 2 Gb PDF dosyası oluşturmak için iyi bir nedeniniz var mı? Birçok PDF okuyucunun onu açmaya çalışırken çökmesinden korkuyorum.
dr01

Çünkü ImageMagick kopyanız Büyük Dosya Desteği olmadan derlenmiştir. Lütfen bir hata gönderin
Monica'yı eski

@ dr01: Neden yapsınlar? Büyük Dosya Desteği onlarca yıldan beri var.
Monica'yı eski durumuna döndürün - M. Schröder

@ MartinSchröder Yine de bazı programlar çok büyük dosyaları işleyemiyor. Her neyse, 2 Gb (~ 150.000 A4 sayfa) PDF dosyası oluşturmanın nedenini merak ettim.
dr01

Yanıtlar:


24

Sınırlamanız aslında dosya sisteminden kaynaklanmıyor; veya paket versiyonlarından bence .

2GB sınırınız işletim sisteminizin 32 bit sürümünü kullanarak sizden geliyor.

Donanım destekliyorsa , dosyayı artırma seçeneği 64 bitlik bir sürüm yüklemektir .

Bkz. Büyük dosya desteği

Geleneksel olarak, birçok işletim sistemi ve bunların temel dosya sistemi uygulamaları dosya boyutlarını ve konumlarını temsil etmek için 32 bit tamsayılar kullanır. Sonuç olarak, hiçbir dosya 2 32-1 bayttan (4 GB - 1) büyük olamaz . Bir çok uygulamada, sorun daha 2 sınırı alçaltılmış imzalı numaraları gibi boyutları işlenmesiyle şiddetlenir 31 1 bayt (2 GB - - 1).


3
Yan not: Linux, yaklaşık on yıl öncesinden beri 32 bit'de bile 64 bit dosya boyutlarını ve konumlarını kullanabilir. Her ne kadar emin olmasa da, bu pdf oluşturma aracı bu işlevi kullanabilir.
peterh - Monica'yı geri yükle

2
64 bitlik @peterh off_t, yazılım tüm dosyayı RAM'de oluşturmaya ve tek seferde diske yazmaya çalışırsa yardımcı olmaz.
Dmitry Grigoryev

2
Linux, boyutları imzalı olarak işlemez, ancak çekirdeğin çalışması için bazı özel adres alanına ihtiyacı vardır ve eski günlerde 2GB'ı kullanıcı alanına bırakmak çok fazla görünüyordu, bu nedenle çekirdek diğer 2GB'yi ayıracaktır.
Dmitry Grigoryev

2
@DmitryGrigoryev: Boyutlar imzalanmamış, ancak işaretçi farklılıkları ( ptrdiff_t), boyutların maksimum (işaretli) değerle sınırlı olması gerektiği anlamına gelebilir ptrdiff_t, aksi takdirde uygulamaların gerçekten kötü UB ve UB ile ilgili hataları elde edersiniz. çalışmak için iyi bir yol.
R ..

@DmitryGrigoryev Bu durumda, dosya tam olarak 2GB-1 bayta sahip olmayacaktır, çünkü programın yürütülebilir kod gibi şeyleri saklamak için daha fazla belleğe ihtiyacı vardır.
user23013

12

Tarafından kullanılan piksel önbelleğini convertörneğin 1 GiB ile sınırlamayı deneyin :

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

Umarım bu, ImageMagic'i RAM arabelleklerine 2'den fazla GiB sığdırmaya çalışmak yerine düzenli olarak önceden işlenmiş verileri diske dökmeye zorlar.

32-bit Linux'ta tek bir işlem için kullanılabilen sanal bellek miktarı BTW, VMSPLITçekirdek yapılandırma ayarı tarafından tanımlanır . Bu 2G / 2G (çekirdek için 2GB + kullanıcı için 2GB) veya 1G / 3G (çekirdek için 1 GB + kullanıcı için 3 GB) olabilir. Çalışan bir sistemde, ayar şu şekilde bulunabilir:

zcat /proc/config.gz | grep VMSPLIT

Bazı sistemlerde çekirdek yapılandırması /boot/config-$(uname -r)bunun yerine depolanır .


1

Çok sayıda fotoğraf olmasaydı, PDF oluşturmak için TeX / LaTeX kullanabilirsiniz. Sonra dönüştürücü çökme sorunu olmadan aynı sonucu (görüntülerin pdf) alabilirsiniz. TeX'teki dosya sınırları sadece sisteminiz olmalıdır (donanım + OS)

Ama TeX yazmak için bir kabuk komut dosyası kullanabileceğinizi düşünüyorum:

0)

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

1) Bir Şablon Yapın

1.1) Eminim bu adımı tek seferde yapmanın bir yolu var, görüntü adını değişken yerine eklemek ve eklemek yerine eklemek ve $ FOO'yu doğru baştaki 0'lara sahip olacak şekilde biçimlendirmek, ancak aşağıdakileri biliyorum .

1.2) Komut dosyasının dosya adını girebilmesi için şablonun bölünmesi gerekir

1.3) nano tmplt1 / * veya seçtiğiniz editör * /

/* 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) Ancak dosyalarınız 0001.miff… 0010.miff… 0100.miff… 2000.miff. Yani değişken sayıda önde gelen sıfır. Çözüm: tmplt1'in 4 sürümü: tmplt1-9, tmplt10-99, tmplt100-999, tmplt1000-2000. Tmplt1-9 “... genişlik] {000” ile biter (yani 3 0 ekleyin); tmplt10-99 “... genişlik] {00” ile biter (yani 2 0 ekleyin). 100-999 1 sıfır ekler ve 1000-2000 tmplt1 ile aynıdır

1.4) şablonun sonraki bölümü: nano tmplt2 / * OEOYC * /

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

1.5) şablonun sonraki bölümü: 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) sonraki şablon: nano tmplt4 / * OEOYC * /

    }
\end{figure}

2) dosyanın başlangıcını yapın: nano head / * OEOYC * /

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

3) dosyanın sonunu yapın: nano foot / * OEOYC * /

\end {document} 

4) komut dosyasını hazırlayın: nano yükleyici / * 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) komut dosyasını yürütülebilir hale getirin: chmod u + x loader

5.1) Bunu test ettikten sonra, $ FOO her eklendiğinde 3 satıra yayıldığını gördüm. Betiğe girip el ile taşıma iadelerini silmekten başka bir çözüm bilmiyorum. En azından 2000 fotoğraf için sadece 36

6) çağrı komut dosyası: yükleyici

7) TeX'i derleyin: pdflatex out.pdf

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.