summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2022-05-03 19:18:43 -0600
committerGitHub <noreply@github.com>2022-05-03 19:18:43 -0600
commit00c7d87d3b431bad46a18c0fafeddba9d7603adb (patch)
tree6c58664f9dc89bcff900c7ec4f0e506d03a2a8ce
parentb4d40427a16e43c970a54bc846fbc99e9ff4f5cd (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.rb9
-rw-r--r--lib/asciidoctor/pdf/optimizer.rb17
-rw-r--r--spec/optimizer_spec.rb20
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?