diff options
| author | Dan Allen <dan.j.allen@gmail.com> | 2021-05-09 16:06:56 -0600 |
|---|---|---|
| committer | Dan Allen <dan.j.allen@gmail.com> | 2021-05-09 16:06:56 -0600 |
| commit | fb12931013d206559c1fb57366780e7354b30664 (patch) | |
| tree | b9e6697c408ceac5b37652e4961596bf21a49f69 | |
| parent | 8ca4f32b1a0b5a6c96459a972cf803af8475fc26 (diff) | |
backport fix for #1791 honor GS environment variable when looking for Ghostscript's gs command
| -rw-r--r-- | CHANGELOG.adoc | 4 | ||||
| -rwxr-xr-x | bin/asciidoctor-pdf-optimize | 2 | ||||
| -rw-r--r-- | lib/asciidoctor/pdf/converter.rb | 7 | ||||
| -rw-r--r-- | lib/asciidoctor/pdf/optimizer.rb | 52 |
4 files changed, 50 insertions, 15 deletions
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index e49126d5..98ef14e4 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -7,6 +7,10 @@ For a detailed view of what has changed, refer to the {uri-repo}/commits/v1.6.x[ == Unreleased +Enhancements:: + +* allow path of ghostscript command to be controlled using `GS` env var (#1791) + Compliance:: * add support for Ruby 3 and drop support for Ruby < 2.5 and JRuby < 9.2 diff --git a/bin/asciidoctor-pdf-optimize b/bin/asciidoctor-pdf-optimize index 44376134..d5e86aec 100755 --- a/bin/asciidoctor-pdf-optimize +++ b/bin/asciidoctor-pdf-optimize @@ -17,4 +17,4 @@ end quality = args[0] == '--quality' ? args[1].to_s : '' -(Asciidoctor::PDF::Optimizer.new quality).generate_file filename +(Asciidoctor::PDF::Optimizer.new quality).optimize_file filename diff --git a/lib/asciidoctor/pdf/converter.rb b/lib/asciidoctor/pdf/converter.rb index c53962e4..7617b008 100644 --- a/lib/asciidoctor/pdf/converter.rb +++ b/lib/asciidoctor/pdf/converter.rb @@ -368,7 +368,10 @@ module Asciidoctor @index = IndexCatalog.new # NOTE: we have to init Pdfmark class here while we have reference to the doc @pdfmark = (doc.attr? 'pdfmark') ? (Pdfmark.new doc) : nil - @optimize = doc.attr 'optimize' + # NOTE: defer instantiating optimizer until we know min pdf version + if (@optimize = doc.attr 'optimize') + @optimize = nil unless (defined? ::Asciidoctor::PDF::Optimizer) || !(Helpers.require_library OptimizerRequirePath, 'rghost', :warn).nil? + end init_scratch_prototype self end @@ -3584,7 +3587,7 @@ module Asciidoctor pdf_doc.render_file target # QUESTION restore attributes first? @pdfmark&.generate_file target - (Optimizer.new @optimize, pdf_doc.min_version).generate_file target if @optimize && ((defined? ::Asciidoctor::PDF::Optimizer) || !(Helpers.require_library OptimizerRequirePath, 'rghost', :warn).nil?) + (Optimizer.new @optimize, pdf_doc.min_version).optimize_file target if @optimize && ((defined? ::Asciidoctor::PDF::Optimizer) || !(Helpers.require_library OptimizerRequirePath, 'rghost', :warn).nil?) end # write scratch document if debug is enabled (or perhaps DEBUG_STEPS env) #get_scratch_document.render_file 'scratch.pdf' diff --git a/lib/asciidoctor/pdf/optimizer.rb b/lib/asciidoctor/pdf/optimizer.rb index 00e747b6..744f3d3b 100644 --- a/lib/asciidoctor/pdf/optimizer.rb +++ b/lib/asciidoctor/pdf/optimizer.rb @@ -2,11 +2,35 @@ require 'pathname' require 'rghost' +require 'rghost/gs_alone' require 'tmpdir' +RGhost::GSAlone.prepend (Module.new do + WindowsRx = /win|ming/ + + def initialize params, debug + (@params = params.dup).push(*(@params.pop.split File::PATH_SEPARATOR)) + @debug = debug + end + + def run + RGhost::Config.config_platform unless File.exist? RGhost::Config::GS[:path].to_s + (cmd = @params.slice 1, @params.length).unshift RGhost::Config::GS[:path].to_s + #puts cmd if @debug + system(*cmd) + end +end) + +RGhost::Engine.prepend (Module.new do + def shellescape str + str + end +end) + module Asciidoctor module PDF class Optimizer + # see https://www.ghostscript.com/doc/current/VectorDevices.htm#PSPDF_IN for details (QUALITY_NAMES = { 'default' => :default, 'screen' => :screen, @@ -15,27 +39,31 @@ module Asciidoctor 'prepress' => :prepress, }).default = :default + attr_reader :quality + attr_reader :compatibility_level + def initialize quality = 'default', compatibility_level = '1.4' @quality = QUALITY_NAMES[quality] @compatibility_level = compatibility_level + if (gs_path = ::ENV['GS']) + ::RGhost::Config::GS[:path] = gs_path + end end - def generate_file target + def optimize_file target ::Dir::Tmpname.create ['asciidoctor-pdf-', '.pdf'] do |tmpfile| - filename = Pathname.new target - filename_o = Pathname.new tmpfile - pdfmark = filename.sub_ext '.pdfmark' - inputs = pdfmark.file? ? [target, pdfmark.to_s] : target + filename_o = ::Pathname.new target + filename_tmp = ::Pathname.new tmpfile + if (pdfmark = filename_o.sub_ext '.pdfmark').file? + inputs = [target, pdfmark.to_s].join ::File::PATH_SEPARATOR + else + inputs = target + end (::RGhost::Convert.new inputs).to :pdf, - filename: filename_o.to_s, + filename: filename_tmp.to_s, quality: @quality, d: { Printed: false, CannotEmbedFontPolicy: '/Warning', CompatibilityLevel: @compatibility_level } - begin - filename_o.rename target - rescue ::Errno::EXDEV - filename.binwrite filename_o.binread - filename_o.unlink - end + filename_o.binwrite filename_tmp.binread end nil end |
