diff options
| author | Dan Allen <dan.j.allen@gmail.com> | 2022-05-03 19:18:43 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-03 19:18:43 -0600 |
| commit | 00c7d87d3b431bad46a18c0fafeddba9d7603adb (patch) | |
| tree | 6c58664f9dc89bcff900c7ec4f0e506d03a2a8ce | |
| parent | b4d40427a16e43c970a54bc846fbc99e9ff4f5cd (diff) | |
resolves #125 allow built-in optimizer to set PDF compliance flag (PDF/A and PDF/X) (PR #2133)
| -rw-r--r-- | lib/asciidoctor/pdf/converter.rb | 9 | ||||
| -rw-r--r-- | lib/asciidoctor/pdf/optimizer.rb | 17 | ||||
| -rw-r--r-- | spec/optimizer_spec.rb | 20 |
3 files changed, 40 insertions, 6 deletions
diff --git a/lib/asciidoctor/pdf/converter.rb b/lib/asciidoctor/pdf/converter.rb index 96c102af..e3678c09 100644 --- a/lib/asciidoctor/pdf/converter.rb +++ b/lib/asciidoctor/pdf/converter.rb @@ -3802,7 +3802,14 @@ module Asciidoctor pdf_doc.render_file target # QUESTION: restore attributes first? @pdfmark&.generate_file target - (Optimizer.new @optimize, pdf_doc.min_version).optimize_file target if @optimize + if (quality = @optimize) + if quality.include? ',' + quality, compliance = quality.split ',', 2 + elsif quality.include? '/' + quality, compliance = nil, quality + end + (Optimizer.new quality, pdf_doc.min_version, compliance).optimize_file target + end to_file = true end if !ENV['KEEP_ARTIFACTS'] diff --git a/lib/asciidoctor/pdf/optimizer.rb b/lib/asciidoctor/pdf/optimizer.rb index 4d3a6086..f1c5c2d0 100644 --- a/lib/asciidoctor/pdf/optimizer.rb +++ b/lib/asciidoctor/pdf/optimizer.rb @@ -40,9 +40,10 @@ module Asciidoctor attr_reader :quality attr_reader :compatibility_level - def initialize quality = 'default', compatibility_level = '1.4' + def initialize quality = 'default', compatibility_level = '1.4', compliance = 'PDF' @quality = QUALITY_NAMES[quality] @compatibility_level = compatibility_level + @compliance = compliance if (gs_path = ::ENV['GS']) ::RGhost::Config::GS[:path] = gs_path end @@ -57,10 +58,16 @@ module Asciidoctor else inputs = target end - (::RGhost::Convert.new inputs).to :pdf, - filename: filename_tmp.to_s, - quality: @quality, - d: { Printed: false, CannotEmbedFontPolicy: '/Warning', CompatibilityLevel: @compatibility_level } + d = { Printed: false, CannotEmbedFontPolicy: '/Warning', CompatibilityLevel: @compatibility_level } + case @compliance + when 'PDF/A', 'PDF/A-1', 'PDF/A-2', 'PDF/A-3' + d[:PDFA] = ((@compliance.split '-', 2)[1] || 1).to_i + d[:ShowAnnots] = false + when 'PDF/X', 'PDF/X-1', 'PDF/X-3' + d[:PDFX] = true + d[:ShowAnnots] = false + end + (::RGhost::Convert.new inputs).to :pdf, filename: filename_tmp.to_s, quality: @quality, d: d filename_o.binwrite filename_tmp.binread end nil diff --git a/spec/optimizer_spec.rb b/spec/optimizer_spec.rb index 925d7a09..d630e3e5 100644 --- a/spec/optimizer_spec.rb +++ b/spec/optimizer_spec.rb @@ -86,6 +86,26 @@ describe 'Asciidoctor::PDF::Optimizer', if: (gem_available? 'rghost'), &(proc do end).to not_raise_exception end + it 'should generate PDF that conforms to specified PDF/A compliance' do + input_file = Pathname.new example_file 'basic-example.adoc' + to_file = to_pdf_file input_file, 'optimizer-screen-pdf-a.pdf', attribute_overrides: { 'optimize' => 'PDF/A' } + pdf = PDF::Reader.new to_file + (expect pdf.pdf_version).to eql 1.4 + (expect pdf.pages).to have_size 1 + # Non-printing annotations (i.e., hyperlinks) are not permitted in PDF/A + (expect get_annotations pdf, 1).to be_empty + end + + it 'should generate PDF that conforms to specified PDF/A compliance when quality is specified' do + input_file = Pathname.new example_file 'basic-example.adoc' + to_file = to_pdf_file input_file, 'optimizer-print-pdf-a.pdf', attribute_overrides: { 'optimize' => 'print,PDF/A' } + pdf = PDF::Reader.new to_file + (expect pdf.pdf_version).to eql 1.4 + (expect pdf.pages).to have_size 1 + # Non-printing annotations (i.e., hyperlinks) are not permitted in PDF/A + (expect get_annotations pdf, 1).to be_empty + end + it 'should install bin script named asciidoctor-pdf-optimize' do bin_script = (Pathname.new Gem.bindir) / 'asciidoctor-pdf-optimize' bin_script = Pathname.new Gem.bin_path 'asciidoctor-pdf', 'asciidoctor-pdf-optimize' unless bin_script.exist? |
