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.