কীভাবে কোনও রঙের পিডিএফকে কালো-সাদা রূপান্তর করবেন?


18

আমি কিছু রঙিন পাঠ্য এবং অন্য পিডিএফ-এর চিত্রগুলি কেবল কালো ও সাদা সহ এর পিডিএফের মাত্রা হ্রাস করতে রূপান্তর করতে চাই। তদুপরি, আমি পৃষ্ঠাগুলির উপাদানগুলিকে ছবিতে রূপান্তর না করেই পাঠ্যটিকে পাঠ্য হিসাবে রাখতে চাই। আমি নিম্নলিখিত আদেশটি চেষ্টা করেছি:

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

অন্য একটি প্রশ্নে, একটি লিঙ্ক পাওয়া গেছে , তবে এটি যা চায় না তা করে: আউটপুটটির পাঠ্যটি একটি দরিদ্র চিত্রে রূপান্তরিত হয় এবং এটি আর নির্বাচনযোগ্য হয় না। আমি ঘোস্টস্ক্রিপ্ট দিয়ে চেষ্টা করেছি:

gs      -sOutputFile=output.pdf \
        -q -dNOPAUSE -dBATCH -dSAFER \
        -sDEVICE=pdfwrite \
        -dCompatibilityLevel=1.3 \
        -dPDFSETTINGS=/screen \
        -dEmbedAllFonts=true \
        -dSubsetFonts=true \
        -sColorConversionStrategy=/Mono \
        -sColorConversionStrategyForImages=/Mono \
        -sProcessColorModel=/DeviceGray \
        $1

তবে এটি আমাকে নিম্নলিখিত ত্রুটি বার্তা দেয়:

./script.sh: 19: ./script.sh: output.pdf: not found

ফাইল তৈরির জন্য অন্য কোনও উপায় আছে?


এই সৌন্দর্য তাই ভাল superuser.com/questions/200378/...
slackmart

1
সম্পর্কিত: unix.stackexchange.com/questions/84709/...
SLM

সতর্ককারী যখন কিছু সুপারসর ব্যবহার করে তখন তারা পিডিএফটিকে একটি রাস্টারাইজড সংস্করণে রূপান্তরিত করে, তাই এটি আর ভেক্টর গ্রাফিক্স আর থাকবে না।
slm

1
আপনি যে পুরো স্ক্রিপ্ট দৌড়েছিলেন তা কি? দেখে মনে হচ্ছে না, আপনি কি পুরো স্ক্রিপ্টটি পোস্ট করতে পারেন?
টেরডন

উত্তর:


23

জিএস উদাহরণ

gsআপনি উপরে যে কমান্ডটি চালাচ্ছেন তার একটি পিছন রয়েছে $1যা সাধারণত স্ক্রিপ্টে কমান্ড লাইন আর্গুমেন্টগুলি সরবরাহ করার জন্য বোঝানো হয়। সুতরাং আপনি আসলে কী চেষ্টা করেছেন তা আমি নিশ্চিত নই তবে আমি অনুমান করছি যে আপনি সেই আদেশটি একটি স্ক্রিপ্টে দেওয়ার চেষ্টা করেছিলেন script.sh,:

#!/bin/bash

gs      -sOutputFile=output.pdf \
        -q -dNOPAUSE -dBATCH -dSAFER \
        -sDEVICE=pdfwrite \
        -dCompatibilityLevel=1.3 \
        -dPDFSETTINGS=/screen \
        -dEmbedAllFonts=true \
        -dSubsetFonts=true \
        -sColorConversionStrategy=/Mono \
        -sColorConversionStrategyForImages=/Mono \
        -sProcessColorModel=/DeviceGray \
        $1

এবং এটি এইভাবে চালান:

$ ./script.sh: 19: ./script.sh: output.pdf: not found

আপনি কীভাবে এই স্ক্রিপ্টটি সেটআপ করবেন তা নিশ্চিত নয় তবে এটি কার্যকর করার দরকার needs

$ chmod +x script.sh

যদিও স্ক্রিপ্টের সাথে অবশ্যই কিছু ঠিক আছে বলে মনে হচ্ছে না। আমি যখন চেষ্টা করেছি তখন পরিবর্তে আমি এই ত্রুটিটি পেয়েছি:

অপরিবর্তনযোগ্য ত্রুটি:

একটি বিকল্প

সেই স্ক্রিপ্টের পরিবর্তে আমি এস-এর প্রশ্ন থেকে এটি ব্যবহার করব।

#!/bin/bash

gs \
 -sOutputFile=output.pdf \
 -sDEVICE=pdfwrite \
 -sColorConversionStrategy=Gray \
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
 -dNOPAUSE \
 -dBATCH \
 $1

তারপরে এটি চালান:

$ ./script.bash LeaseContract.pdf 
GPL Ghostscript 8.71 (2010-02-10)
Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 2.
Page 1
Page 2

আপনি ঠিক বলেছেন, স্ক্রিপ্টটিতে কিছু ভুল আছে: "কেস" এই ক্ষেত্রে এর পরিবর্তে sProcessColorModelহওয়া উচিত dProcessColorModel
সোরা।

8

আমি একটি স্ক্রিপ্ট পাওয়া এখানে এটা করতে পারেন যে। এটি আপনার প্রয়োজন gsআছে বলে মনে হয় তবে এটিরও প্রয়োজন pdftk। আপনি আপনার বিতরণটির কথা উল্লেখ করেন নি তবে ডেবিয়ান-ভিত্তিক সিস্টেমে আপনার এটি ইনস্টল করতে সক্ষম হওয়া উচিত

sudo apt-get install pdftk

আপনি এটির জন্য এখানে RPM খুঁজে পেতে পারেন ।

একবার ইনস্টল হয়ে গেলে pdftkস্ক্রিপ্টটি সংরক্ষণ করুন graypdf.shএবং এর মতো চালান:

./greypdf.sh input.pdf

এটি একটি ফাইল তৈরি করবে input-gray.pdf। লিঙ্ক পচা এড়াতে আমি এখানে পুরো স্ক্রিপ্টটি অন্তর্ভুক্ত করছি:

# convert pdf to grayscale, preserving metadata
# "AFAIK graphicx has no feature for manipulating colorspaces. " http://groups.google.com/group/latexusersgroup/browse_thread/thread/5ebbc3ff9978af05
# "> Is there an easy (or just standard) way with pdflatex to do a > conversion from color to grayscale when a PDF file is generated? No." ... "If you want to convert a multipage document then you better have pdftops from the xpdf suite installed because Ghostscript's pdf to ps doesn't produce nice Postscript." http://osdir.com/ml/tex.pdftex/2008-05/msg00006.html
# "Converting a color EPS to grayscale" - http://en.wikibooks.org/wiki/LaTeX/Importing_Graphics
# "\usepackage[monochrome]{color} .. I don't know of a neat automatic conversion to monochrome (there might be such a thing) although there was something in Tugboat a while back about mapping colors on the fly. I would probably make monochrome versions of the pictures, and name them consistently. Then conditionally load each one" http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2005-08/msg01864.html
# "Here comes optional.sty. By adding \usepackage{optional} ... \opt{color}{\includegraphics[width=0.4\textwidth]{intro/benzoCompounds_color}} \opt{grayscale}{\includegraphics[width=0.4\textwidth]{intro/benzoCompounds}} " - http://chem-bla-ics.blogspot.com/2008/01/my-phd-thesis-in-color-and-grayscale.html
# with gs:
# http://handyfloss.net/2008.09/making-a-pdf-grayscale-with-ghostscript/
# note - this strips metadata! so:
# http://etutorials.org/Linux+systems/pdf+hacks/Chapter+5.+Manipulating+PDF+Files/Hack+64+Get+and+Set+PDF+Metadata/
COLORFILENAME=$1
OVERWRITE=$2
FNAME=${COLORFILENAME%.pdf}
# NOTE: pdftk does not work with logical page numbers / pagination;
# gs kills it as well;
# so check for existence of 'pdfmarks' file in calling dir;
# if there, use it to correct gs logical pagination
# for example, see
# http://askubuntu.com/questions/32048/renumber-pages-of-a-pdf/65894#65894
PDFMARKS=
if [ -e pdfmarks ] ; then
PDFMARKS="pdfmarks"
echo "$PDFMARKS exists, using..."
# convert to gray pdf - this strips metadata!
gs -sOutputFile=$FNAME-gs-gray.pdf -sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH "$COLORFILENAME" "$PDFMARKS"
else # not really needed ?!
gs -sOutputFile=$FNAME-gs-gray.pdf -sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH "$COLORFILENAME"
fi
# dump metadata from original color pdf
## pdftk $COLORFILENAME dump_data output $FNAME.data.txt
# also: pdfinfo -meta $COLORFILENAME
# grep to avoid BookmarkTitle/Level/PageNumber:
pdftk $COLORFILENAME dump_data output | grep 'Info\|Pdf' > $FNAME.data.txt
# "pdftk can take a plain-text file of these same key/value pairs and update a PDF's Info dictionary to match. Currently, it does not update the PDF's XMP stream."
pdftk $FNAME-gs-gray.pdf update_info $FNAME.data.txt output $FNAME-gray.pdf
# (http://wiki.creativecommons.org/XMP_Implementations : Exempi ... allows reading/writing XMP metadata for various file formats, including PDF ... )
# clean up
rm $FNAME-gs-gray.pdf
rm $FNAME.data.txt
if [ "$OVERWRITE" == "y" ] ; then
echo "Overwriting $COLORFILENAME..."
mv $FNAME-gray.pdf $COLORFILENAME
fi
# BUT NOTE:
# Mixing TEX & PostScript : The GEX Model - http://www.tug.org/TUGboat/Articles/tb21-3/tb68kost.pdf
# VTEX is a (commercial) extended version of TEX, sold by MicroPress, Inc. Free versions of VTEX have recently been made available, that work under OS/2 and Linux. This paper describes GEX, a fast fully-integrated PostScript interpreter which functions as part of the VTEX code-generator. Unless specified otherwise, this article describes the functionality in the free- ware version of the VTEX compiler, as available on CTAN sites in systems/vtex.
# GEX is a graphics counterpart to TEX. .. Since GEX may exercise subtle influence on TEX (load fonts, or change TEX registers), GEX is op- tional in VTEX implementations: the default oper- ation of the program is with GEX off; it is enabled by a command-line switch.
# \includegraphics[width=1.3in, colorspace=grayscale 256]{macaw.jpg}
# http://mail.tug.org/texlive/Contents/live/texmf-dist/doc/generic/FAQ-en/html/FAQ-TeXsystems.html
# A free version of the commercial VTeX extended TeX system is available for use under Linux, which among other things specialises in direct production of PDF from (La)TeX input. Sadly, it���s no longer supported, and the ready-built images are made for use with a rather ancient Linux kernel.
# NOTE: another way to capture metadata; if converting via ghostscript:
# http://compgroups.net/comp.text.pdf/How-to-specify-metadata-using-Ghostscript
# first:
# grep -a 'Keywo' orig.pdf
# /Author(xxx)/Title(ttt)/Subject()/Creator(LaTeX)/Producer(pdfTeX-1.40.12)/Keywords(kkkk)
# then - copy this data in a file prologue.ini:
#/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
#[/Author(xxx)
#/Title(ttt)
#/Subject()
#/Creator(LaTeX with hyperref package + gs w/ prologue)
#/Producer(pdfTeX-1.40.12)
#/Keywords(kkkk)
#/DOCINFO pdfmark
#
# finally, call gs on the orig file,
# asking to process pdfmarks in prologue.ini:
# gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
# -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -dDOPDFMARKS \
# -sOutputFile=out.pdf in.pdf prologue.ini
# then the metadata will be in output too (which is stripped otherwise;
# note bookmarks are preserved, however). 

3

আমার কাছে কিছু স্ক্যান করা রঙিন পিডিএফ এবং গ্রেস্কেল পিডিএফ ছিল যা আমি বিডব্লিউতে রূপান্তর করতে চেয়েছিলাম। আমি ব্যবহার করার চেষ্টা gsসঙ্গে এখানে তালিকাভুক্ত কোড , এবং ইমেজ মানের এখনও আছে পিডিএফ পাঠ্য সহ ভাল। তবে, সেই জিএস কোডটি কেবল গ্রেস্কেলে রূপান্তরিত হয় (প্রশ্নে জিজ্ঞাসা করা হয়েছে) এবং তারপরেও বড় আকারের ফাইল আকার রয়েছে। convertসরাসরি ব্যবহার করা হলে খুব খারাপ ফলাফল দেয়।

আমি ভাল ইমেজ মানের এবং ছোট ফাইল আকার সঙ্গে bw পিডিএফস চেয়েছিলেন। আমি টেরডনের সমাধানটি চেষ্টা করে দেখতে পারি, তবে আমি pdftkইউএম (লেখার সময়) ব্যবহার করে সেন্টোস 7 এ যেতে পারি না ।

আমার সলিউশন gsপিডিএফ থেকে গ্রেস্কেল বিএমপি ফাইলগুলি এক্সট্র্যাক্ট convertকরতে, বিডাব্লুথ্রিফোল্ড ফাইল হিসাবে সেভ করার জন্য এই বিএমপিগুলিকে প্রসারিত করতে এবং তারপরে টিফ চিত্রগুলি সংকুচিত করতে এবং সেগুলি সমস্ত এক পিডিএফ- তে মিশ্রিত করতে img2pdf ব্যবহার করে।

আমি পিডিএফ থেকে সরাসরি ঝুঁকির দিকে যাওয়ার চেষ্টা করেছি তবে মানেরটি একই নয় তাই আমি প্রতিটি পৃষ্ঠাকে বিএমপি-তে সংরক্ষণ করি। এক পৃষ্ঠার পিডিএফ ফাইলের জন্য, convertবিএমপি থেকে পিডিএফ পর্যন্ত দুর্দান্ত কাজ করে। উদাহরণ:

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জিএস এর চেয়ে ছোট ফাইলের আকার দেয়। টিফ ফাইলগুলি img2pdf ইনপুট হিসাবে সঙ্কুচিত করা আবশ্যক। বিপুল সংখ্যক পৃষ্ঠার জন্য মনে রাখবেন, মধ্যবর্তী বিএমপি এবং টিফ ফাইলগুলি আকারে বড় হতে থাকে। pdftkবা joinpdfতারা যদি সংকুচিত পিডিএফ ফাইলগুলি মার্জ করতে পারে তবে আরও ভাল convert

আমি আরও একটি মার্জিত সমাধান আছে কল্পনা। যাইহোক, আমার পদ্ধতিটি খুব ভাল চিত্রের মানের এবং অনেক ছোট ফাইল আকারের ফলাফল তৈরি করে। বিডব্লিউ পিডিএফটিতে পাঠ্য ফিরে পেতে, আবার ওসিআর চালান।

আমার শেল স্ক্রিপ্টটি জিএস, রূপান্তর এবং ইমজি 2 পিডিএফ ব্যবহার করে। প্রয়োজনীয় হিসাবে শুরুতে তালিকাভুক্ত প্যারামিটারগুলি (পাতার # স্ক্যান ডিপিআই, প্রান্তিক%, ইত্যাদি) পরিবর্তন করুন এবং চালান 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

1

RHEL6 এবং RHEL5, যা উভয়ই ,.70০ তে বেসলাইন ঘোস্টস্ক্রিপ্ট, উপরের বর্ণিত কমান্ডের ফর্মগুলি ব্যবহার করতে পারে না। প্রথম আর্গুমেন্ট "$ 1" হিসাবে পিডিএফ ফাইলটি প্রত্যাশা করে কোনও স্ক্রিপ্ট বা কোনও ফাংশন ধরে নিচ্ছেন, নিম্নলিখিতটি আরও বহনযোগ্য হতে হবে:

gs \
    -sOutputFile="grey_$1" \
    -sDEVICE=pdfwrite \
    -sColorConversionStrategy=Mono \
    -sColorConversionStrategyForImages=/Mono \
    -dProcessColorModel=/DeviceGray \
    -dCompatibilityLevel=1.3 \
    -dNOPAUSE -dBATCH \
    "$1"

যেখানে আউটপুট ফাইলটি "গ্রেয়_" এর সাথে উপস্থাপিত হবে।

RHEL6 এবং 5 কমপ্যাটিবিলিভেল = 1.4 ব্যবহার করতে পারে যা অনেক দ্রুত, তবে আমি বহনযোগ্যতার জন্য লক্ষ্য রেখেছিলাম।


দেবগণ বলে ( 1 , 2 , 3 , 4 ) যে কোনও sColorConversionStrategyForImagesসুইচ নেই।
ইগোর

ধন্যবাদ, @ ইগর - আমার জানা নেই যে এই স্নিপেটটি কোথা থেকে পেয়েছি! আমি একটি সত্যের জন্য জানি যে আমি এটি পরীক্ষা করেছিলাম এবং এটি সেই সময়ে কাজ করেছিল । (এবং, ভাবেন, এজন্য আপনার কোডের জন্য আপনাকে সর্বদা রেফারেন্স সরবরাহ করা উচিত))
সমৃদ্ধ

1
সেই "নকল প্যারামিটার" ওয়েবের মধ্যে অবিশ্বাস্যভাবে জনপ্রিয় বলে মনে হচ্ছে। জিএস অজানা সুইচগুলি উপেক্ষা করে (যা দুঃখজনক), সুতরাং এটি যেভাবেই চলতে পারে।
ইগোর

1

এই স্ক্রিপ্টের সাথে ভাল বিপরীতে স্ক্যান হওয়া পিডিএফ সাফ করার জন্য আমি নির্ভরযোগ্য ফলাফল পেয়েছি;

#!/bin/bash
# 
# $ sudo apt install poppler-utils img2pdf pdftk imagemagick
#
# Output is still greyscale, but lots of scanner light tone fuzz removed.
#

pdfimages $1 pages

ls ./pages*.ppm | xargs -L1 -I {} convert {}  -quality 100 -density 400 \
  -fill white -fuzz 80% -auto-level -depth 4 +opaque "#000000" {}.jpg

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

pdftk pages*.pdf cat output ${1/.pdf/}_bw.pdf

rm pages*
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.