ImageMagick के साथ PDF बनाने के लिए 2 GB से अधिक की सीमा प्राप्त करें


19

मैं convertलगभग 2,000 छवियों से एक पीडीएफ फाइल बनाने के लिए उपयोग कर रहा हूं :

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

जब संदेश के साथ आउटपुट फ़ाइल 2 ^ 31-1 बाइट्स (2 जीबी )1) तक पहुंच जाती है, तो प्रक्रिया प्रतिलिपि प्रस्तुत करने योग्य कहलाती है

convert: unknown `out.pdf'.

पीडीएफ फाइल विनिर्देश GB10 जीबी के लिए अनुमति देता है । मैंने अधिक जानकारी खींचने की कोशिश की -debug all, लेकिन मुझे लॉगिंग आउटपुट में कुछ भी मददगार नहीं लगा। फ़ाइल सिस्टम ext3 है जो कम से कम 16 GiB तक की फ़ाइलों की अनुमति देता है (अधिक हो सकता है) । जैसा है ulimit, file sizeहै unlimited/etc/security/limits.confकेवल टिप्पणी वाली लाइनें शामिल हैं। इसके कारण और क्या हो सकता है और मैं सीमा कैसे बढ़ा सकता हूं?

ImageMagick संस्करण: 6.4.3 2016-08-05 Q16 OpenMP
वितरण: SLES 11.4 (i586)


4
क्या आपके लिए संभव है कि आप आधी छवियों (या जो कुछ भी आपको सबसे अच्छा लगता है) के साथ दो फाइलें बनाएं, और फिर उन्हें pdftk के साथ मर्ज करें?
गैलिफ़्रेयन

1
क्या आपके पास> 2 Gb PDF फ़ाइल बनाने का कोई अच्छा कारण है? मुझे डर है कि कई पीडीएफ पाठक इसे खोलने के प्रयास में दुर्घटनाग्रस्त हो जाएंगे।
dr01

क्योंकि आपकी ImageMagick की प्रतिलिपि बड़े फ़ाइल समर्थन के बिना संकलित की गई है। कृपया बग दर्ज करें - यह 2017 है।
मोनिका को पुनः स्थापित करें - एम। श्रोडर

@ dr01: वे क्यों चाहिए? दशकों से बड़ी फाइल सपोर्ट रही है।
मोनिका को पुनः स्थापित करें - एम। श्रोडर

@ MartinSchröder और अभी तक कुछ प्रोग्राम बहुत बड़ी फ़ाइलों को संभालने में सक्षम नहीं हैं। वैसे भी, मैं 2-Gb (यानी, 150'000 A4 पृष्ठ) PDF फ़ाइल बनाने के कारण के बारे में उत्सुक था।
dr01

जवाबों:


24

आपकी सीमा फाइलसिस्टम से वास्तव में उपजी नहीं है; या पैकेज संस्करणों से मुझे लगता है

आपकी 2GB की सीमा आपके ओएस के 32-बिट संस्करण का उपयोग करके आप से आ रही है।

यदि फ़ाइल इसका समर्थन करती है तो फ़ाइल को बढ़ाने का विकल्प 64-बिट संस्करण स्थापित करना होगा ।

बड़ी फ़ाइल समर्थन देखें

परंपरागत रूप से, कई ऑपरेटिंग सिस्टम और उनके अंतर्निहित फ़ाइल सिस्टम कार्यान्वयन ने फ़ाइल आकार और स्थिति का प्रतिनिधित्व करने के लिए 32-बिट पूर्णांक का उपयोग किया। नतीजतन, कोई भी फाइल 2 32 - 1 बाइट्स (4 जीबी - 1) से बड़ी नहीं हो सकती है । कई कार्यान्वयन में, आकार को हस्ताक्षरित संख्याओं के रूप में मानकर समस्या को समाप्त कर दिया गया था, जिसने सीमा को 2 31 - 1 बाइट्स (2 जीबी - 1) तक कम कर दिया था।


3
साइड नोट: लिनक्स एक दशक पहले से 64-बिट फ़ाइल आकार और 32-बिट पर भी स्थिति का उपयोग कर सकता है। हालांकि यह सुनिश्चित नहीं है, कि यह पीडीएफ जनरेटर उपकरण इस कार्यक्षमता का उपयोग कर सकता है।
पेटेर - मोनिका

2
@peterh में 64-बिट होने off_tसे सॉफ्टवेयर को रैम में पूरी फाइल बनाने और एक बार में डिस्क पर लिखने की कोशिश करने में मदद नहीं मिलेगी।
दिमित्री ग्रिगोरीव

2
लिनक्स साइज़ के अनुसार साइन नहीं करता है, लेकिन कर्नेल को कार्य करने के लिए कुछ समर्पित एड्रेस स्पेस की आवश्यकता होती है, और पुराने दिनों में 2GB छोड़ कर यूजरलैंड बहुत कुछ ऐसा लगता था, इसलिए कर्नेल अन्य 2GB को आरक्षित कर देता था।
दिमित्री ग्रिगोरीव

2
@DmitryGrigoryev: आकार पर हस्ताक्षर नहीं किए गए हैं, लेकिन सूचक अंतर ( ptrdiff_t) हैं, जो प्रभावी रूप से इसका मतलब है कि आकार अधिकतम (हस्ताक्षरित) मूल्य तक सीमित हो ptrdiff_tसकते हैं, या फिर आप वास्तव में बहुत बुरा यूबी और यूबी-संबंधित-संबंधित प्राप्त कर सकते हैं जिनके पास आवेदन नहीं है काम करने का अच्छा तरीका।
आर ..

@DmitryGrigoryev उस स्थिति में फ़ाइल में 2GB-1 बाइट्स नहीं होंगे, क्योंकि प्रोग्राम को निष्पादन योग्य कोड जैसी चीजों को स्टोर करने के लिए अधिक मेमोरी की आवश्यकता होती है।
user23013

12

convertउदाहरण के लिए 1 GiB द्वारा उपयोग किए जाने वाले पिक्सेल कैश को सीमित करने का प्रयास करें :

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

उम्मीद है कि यह ImageMagic को नियमित रूप से डिस्क पर पहले से संसाधित डेटा को रैम बफ़र्स में 2 से अधिक GiB फिट करने के बजाय डंप करने के लिए मजबूर करेगा।

BTW, 32-बिट लिनक्स पर एकल प्रक्रिया के लिए उपलब्ध वर्चुअल मेमोरी की मात्रा को VMSPLITकर्नेल कॉन्फ़िगरेशन सेटिंग द्वारा परिभाषित किया गया है । यह या तो 2G / 2G (कर्नेल + उपयोगकर्ता के लिए 2GB) या 1G / 3G (उपयोगकर्ता के लिए कर्नेल + 3 जीबी के लिए 1 जीबी) हो सकता है। एक रनिंग सिस्टम पर, सेटिंग के माध्यम से पाया जा सकता है

zcat /proc/config.gz | grep VMSPLIT

कुछ सिस्टम पर /boot/config-$(uname -r)इसके बजाय कर्नेल कॉन्फिगर को स्टोर किया जाता है।


1

यदि यह तस्वीरों की बड़ी संख्या के लिए नहीं था, तो आप पीडीएफ बनाने के लिए TeX / LaTeX का उपयोग कर सकते हैं। तब आप अभी भी कनवर्टर क्रैश समस्या के बिना एक ही परिणाम (छवियों के पीडीएफ) प्राप्त कर सकते हैं। 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) नैनो 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 समाप्त होता है "... चौड़ाई] {000" (यानी 3 0 जोड़ें); tmplt10-99 समाप्त होता है "... चौड़ाई] {00" (यानी 2 0 जोड़ें)। 100-999 में 1 शून्य और 1000-2000 tmplt1 के समान है

1.4) टेम्पलेट का अगला भाग: नैनो tmplt2 / * OEOYC * /

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

1.5) टेम्पलेट का अगला भाग: नैनो 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) अगला टेम्प्लेट: नैनो tmplt4 / * OEOYC * /

    }
\end{figure}

2) फ़ाइल की शुरुआत करें: नैनो हेड / * OEOYC * /

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

3) फ़ाइल का अंत बनाएं: नैनो फुट / * OEOYC * /

\end {document} 

4) स्क्रिप्ट बनाएं: नैनो लोडर / * 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 लोडर

5.1) यह परीक्षण करने के बाद, मैंने पाया कि हर बार $ FOO डाला गया था, यह 3 लाइनों में फैला हुआ था। मुझे स्क्रिप्ट में जाने और मैन्युअल रूप से गाड़ी का रिटर्न डिलीट करने के अलावा कोई वर्कअराउंड नहीं पता है। कम से कम यह सभी 2000 तस्वीरों के लिए केवल 36 है

6) कॉल स्क्रिप्ट: लोडर

7) TeX संकलित करें: pdflatex out.pdf

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.