मैं ग्रे-स्केल से एक पीडीएफ फाइल को काले-सफेद में कैसे बदल सकता हूं?


11

मेरा OS उबुन्टु 12.04 है। मैं ग्रे-स्केल से एक पीडीएफ फाइल को काले-सफेद में कैसे बदल सकता हूं? ग्रे-स्केल पीडीएफ फाइल ग्रे-स्केल विकल्प के साथ स्कैनिंग से आती है, और ओसीआर द्वारा ब्लैक-व्हाइट स्केल पीडीएफ की आवश्यकता होती है।


अपडेट करें:

मार्को के उत्तर के बाद, BW pdf अच्छा नहीं है और मूल फ़ाइल यहाँ है


कोशिश करेंscantailor
फ्रॉस्ट्सचुट्ज़

scantailorजब यह ओसीआर के लिए स्कैन तैयार करने की बात आती है, तो कई अन्य उपयोगी विशेषताएं होती हैं, और यही एकमात्र कारण है कि मैंने इसे सुझाया (टिप्पणी के रूप में, उत्तर नहीं)
frostschutz

आप खोल सकते हैं, और निर्यात कर सकते हैं, (कम से कम कुछ) .pdf के libreoffice में (और इसलिए मैं सबसे आधुनिक शब्द प्रोसेसर का अनुमान लगाऊंगा)। नहीं पता है कि अगर आपके वांछित परिवर्तन संभव या आसान हो जाएगा।
गोल्डीलॉक्स

1
pdfimagesइसके पीडीएफ कंटेनर से स्कैन की गई छवियों को निकालने के लिए (पॉपलर) भी है । पहली जगह में ImageMagick के साथ उन्हें संभालने के लिए अधिक कुशल हो सकता है।
फ्रॉस्टचुट्ज़

जवाबों:


9

1) का प्रयोग करें Ghostscript का उपयोग कर एक मोनोक्रोम पोस्टस्क्रिप्टफ़ाइल को पीडीएफ कन्वर्ट करने के लिए psmono डिवाइस:

gs -q -sDEVICE=psmono -o mono.ps input.pdf

2) फिर मोनोक्रोम पोस्टस्क्रिप्ट को वापस पीडीएफ में बदलें:

ps2pdf mono.ps

संपादित करें:psmono इस उपकरण में एक 1-बिट आधा स्वर छवि जो जाहिरा तौर पर नहीं है कि आप क्या चाहते बनाता है। मुझे घोस्टस्क्रिप्ट का उपयोग करके एक सीमा निर्दिष्ट करने का कोई तरीका नहीं मिला, इसलिए मैंने इमेजमैजिक का सहारा लिया। convertपीडीएफ को परिवर्तित करने के लिए आंतरिक रूप से भूतलेख का उपयोग करता है। यह तब 1-बिट छवि बनाने के लिए थ्रेशोल्ड फ़िल्टरिंग लागू करता है और एक पीडीएफ बनाने के लिए फिर से घोस्टस्क्रिप्ट का उपयोग करता है। चूंकि convertडिफ़ॉल्ट रूप से 75DPI के रिज़ॉल्यूशन का उपयोग करता है, जो आपके वास्तविक रिज़ॉल्यूशन से मेल नहीं खाता है, तो आप densityतर्क प्रदान कर सकते हैं । और thresholdसेटिंग के साथ प्रयोग करें । इष्टतम मान इनपुट फ़ाइल पर अत्यधिक निर्भर करते हैं।

convert -density 150 -threshold 50% input.pdf output.pdf

धन्यवाद! पहला कमांड चलाने की एक समस्या: मूल ग्रे-स्केल पीडीएफ लगभग 25 एमबी है, और रनिंग 15 मिनिट के बाद भी समाप्त नहीं हुई है, और आउटपुट फाइल मोन.ऑप्स पहले से ही 150 एमबी है और अभी भी बढ़ रही है। मुझे उसकी चिंता है। क्या अन्य तरीके हैं, उदाहरण के लिए, BW pdf फ़ाइल में प्रिंट करें?
टिम

@ यह असामान्य नहीं है। पोस्टस्क्रिप्ट फाइलें असंपीड़ित हैं, जिसके परिणामस्वरूप पीडीएफ छोटा होगा।
मार्को

धन्यवाद। इसमें लगभग 20mins लगे। BW pdf अच्छा नहीं है। और मूल फ़ाइल यहाँ है
टिम

@ भयानक गुणवत्ता, ओसीआर के लिए अनुकूल नहीं, चाहे आप कुछ भी करें।
फ्रॉस्टचुट्ज़

4

सर्वोत्तम तरीके से मुझे पता चला कि गुणवत्ता के नुकसान के बिना, अगले पृष्ठ से छाया, शोर, पाठ आदि को हटा दिया जाता है:

1) सबसे पहले पीडीएफ़ को अलग-अलग इमेज में बदलें

pdfimages combined_ocr.pdf page

2) दूसरे पृष्ठ से रक्तस्राव, शोर, शोर को दूर करें ( इस ब्लॉग को क्रेडिट )

ls ./p*.ppm | xargs -L1 -I {} convert {}  -quality 100 -density 300 -fill white -fuzz 80% +opaque "#000000" {}.jpg

इसे अतिरिक्त चरण के रूप में जोड़ा जा सकता है या इसके बजाय ऊपर दिए गए आदेश के अनुसार वास्तव में केवल दो रंग मिल सकते हैं:

ls ./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg

3) यह किसी भी रिज़ॉल्यूशन या गुणवत्ता के नुकसान के बिना हर jpg इमेज से एक पीडीएफ फाइल बनाने के लिए है:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

4) इस pdfpages को एक में बदलना है:

pdftk *.pdf cat output combined.pdf

5) और आखिरी में मैं एक OCRed टेक्स्ट लेयर जोड़ता हूं जो pdfs में स्कैन की गुणवत्ता को नहीं बदलता है ताकि उन्हें खोजा जा सके:

pypdfocr combined.pdf 

3

मेरे पास कुछ स्कैन किए गए रंग pdfs और ग्रेस्केल pdfs थे जिन्हें मैं bw में बदलना चाहता था। मैं उपयोग करने की कोशिश gsके साथ यहाँ सूचीबद्ध कोड , और छवि गुणवत्ता अभी भी वहाँ पीडीएफ पाठ के साथ अच्छा है। हालाँकि, यह gs कोड केवल ग्रेस्केल में परिवर्तित होता है (जैसा कि प्रश्न में पूछा गया है) और अभी भी बड़े फ़ाइल आकार में है। convertसीधे उपयोग किए जाने पर बहुत खराब परिणाम मिलते हैं।

मैं अच्छी छवि गुणवत्ता और छोटे फ़ाइल आकार के साथ bd pdfs चाहता था। मेरा समाधान gsपीडीएफ से ग्रेस्केल bmp फ़ाइलों को निकालने के लिए उपयोग करता है, convertउन bmps को bw को दहलीज करने और उन्हें tiff फ़ाइलों के रूप में सहेजने के लिए, और फिर tg छवियों को संपीड़ित करने के लिए img2pdf और उन सभी को एक pdf में मर्ज करें।

मैंने सीधे पीडीएफ से टिफ करने की कोशिश की, लेकिन गुणवत्ता समान नहीं है इसलिए मैं प्रत्येक पृष्ठ को bmp में सहेजता हूं। एक पेज की पीडीऍफ़ फाइल के लिए, convertbmp से pdf में बहुत अच्छा काम करता है। उदाहरण:

gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -r300x300 \
   -sOutputFile=./pdf_image.bmp ./input.pdf

convert ./pdf_image.bmp -threshold 40% -compress zip ./bw_out.pdf

कई पृष्ठों के लिए, gsएक में कई पीडीएफ फाइलों को मर्ज किया जा सकता है, लेकिन img2pdfजीएस की तुलना में छोटे फ़ाइल आकार की पैदावार होती है। Tg फाइलें img2pdf के इनपुट के रूप में असम्पीडित होनी चाहिए। बड़ी संख्या में पृष्ठों के लिए ध्यान रखें, मध्यवर्ती bmp और tiff फाइलें आकार में बड़ी होती हैं। pdftkया joinpdfबेहतर होगा यदि वे संपीड़ित पीडीएफ फाइलों को मर्ज कर सकते हैं convert

मुझे लगता है कि एक और अधिक सुंदर समाधान है। हालांकि, मेरी विधि बहुत अच्छी छवि गुणवत्ता और बहुत छोटे फ़ाइल आकार के साथ परिणाम उत्पन्न करती है। पाठ को bw pdf में वापस लाने के लिए, OCR को फिर से चलाएँ।

मेरी शेल स्क्रिप्ट gs, Convert और img2pdf का उपयोग करती है। जरूरत के अनुसार शुरुआत में सूचीबद्ध पैरामीटर (# पेज के स्कैन, डीपीआई, थ्रेशोल्ड%, आदि) को बदलें और चलाएं chmod +x ./pdf2bw.sh। यहाँ पूरी स्क्रिप्ट है (pdf2bw.sh):

#!/bin/bash

num_pages=12
dpi_res=300
input_pdf_name=color_or_grayscale.pdf
bw_threshold=40%
output_pdf_name=out_bw.pdf
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in `seq 1 $num_pages`
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in `seq 1 $num_pages`
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in `seq 1 $num_pages`
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done

2

वास्तव में, यदि यह एक स्कैन से आता है, तो इसका एकमात्र उचित तरीका पीडीएफ़माज़ का उपयोग करना और अंतर्निहित ग्राफिक्स को परिवर्तित करना है। मैंने इसे बदलने के लिए इस स्क्रिप्ट का उपयोग किया:

#!/bin/sh
if [ -z "$1" -o -z "$2" ]; then
    echo "Syntax: $0 <input.pdf> <output.pdf>"
    exit 1
fi

pdfimages "$1" scan
for a in scan*.ppm; do 
   convert -white-threshold 85% -monochrome $a `basename $a .ppm`.tiff
done
tiffcp scan*.tiff output.tiff
tiff2pdf output.tiff -o "$2" -p A4 -F
rm scan*.ppm scan*.tiff output.tiff

2

उसकी पटकथा के लिए ऑकमसराज़ोर का धन्यवाद, जो रंग और ग्रेस्केल पीडीएफ दोनों को एक कॉम्पैक्ट और सुगम्य मोनोक्रोम संस्करण में बदलने का एक बड़ा काम करता है। यह वास्तव में OccamsRazor की पोस्ट पर एक टिप्पणी है, लेकिन मेरे पास टिप्पणी करने के लिए पर्याप्त बिंदु नहीं हैं।

स्क्रिप्ट विफल हो जाएगी img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files क्योंकि --dpiअब img2pdf के लिए एक स्वीकृत तर्क नहीं है। इसके बजाय, इसे इनपुट फ़ाइल से रिज़ॉल्यूशन मिलता है, इसलिए आप इसे छोड़ सकते हैं।

यहाँ स्क्रिप्ट का मेरा संस्करण है। मैं हर फ़ाइल के लिए स्क्रिप्ट को संपादित नहीं करना चाहता था, इसलिए जब मैं इसे चलाता हूं तो मैं कई पृष्ठों और इनपुट फ़ाइल नाम से गुजरता हूं। मेरे पास 200 डीपीआई के लिए सेट और रिज़ॉल्यूशन नाम सेट है , जो मेरे वर्कफ़्लो के लिए काम करता है, लेकिन आप इसे बदलना चाहते हैं, या उन्हें चालू कर सकते हैं और उन्हें पास कर सकते हैं।00input_name$3$4

चलाने के लिए, उपयोग , जैसे ।./pdf2bw.sh <number_of_pages> <input_name>./pdf2bw.sh 55 input.pdf

#!/bin/bash

num_pages=$1
input_pdf_name=$2
output_pdf_name="00$2"
bw_threshold=40%
dpi_res=200
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in `seq 1 $num_pages`
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in `seq 1 $num_pages`
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in `seq 1 $num_pages`
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done

आपको अपने शेल चरों को उद्धृत करना चाहिए; विशेष रूप से तर्क या अन्य उपयोगकर्ता इनपुट से आने वाले: उदाहरण के लिए, "./$input_pdf_name"और यहां तक ​​कि seq 1 "$num_pages"। इसके अलावा, आप बदल सकते हैं `…`करने के लिए $(…)- देखना यह , यह , और यह
जी-मैन का कहना है कि 'मोनिका'

मेरे द्वारा किए गए परिवर्तनों को छोड़कर यह ओम्स्टैराज की स्क्रिप्ट है। मैं कोई शेल प्रोग्रामर नहीं हूं, इसलिए मैं किसी ऐसी चीज के साथ खिलवाड़ नहीं करना चाहता था जो काम की हो। लेकिन अगर कोई इसे साफ करना चाहता है, तो आपको मेरा धन्यवाद है।
लोवालवाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.