libis-format 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40c91211db466867a86d905e707302783d77f8ce96bce970229294fc3506f4dd
4
- data.tar.gz: 3254048984ba29c9c6a1d556f25e7dc346ba1c0fc2082b80562c3ae64f41dc8f
3
+ metadata.gz: c8f2304a5f189140ad867cb1d7d9d41f280f796992c84514316b7e584628a64b
4
+ data.tar.gz: ee097826d8e73fa7fa72167b4a3eaebef5992bba8fd78a6e0d454fe552730d6c
5
5
  SHA512:
6
- metadata.gz: caa9a7a5cbc6e99c7d1afb8af83274b2db4de847fde394d3d9cdc1129019044353bdbe6527fb4aabbcb8817be175e99f6bac1eeef0b79eb3e7ab94b7594db4ce
7
- data.tar.gz: f3ade6093b38aab4b8c529c0d80e5a822aa2042264efc8d076077f74ee0cd20ebd91dbe5b2d6d030394607fcde196b28c8dabc2659788308e926981cca880905
6
+ metadata.gz: 9fdb85d3847ba3ed08c96cc409b5e7f2c471d80edf61ab6581b28cb46380e1b48e8c65daf182717dd35cf216d91e50f1680d31a352d9aab557d54f7f3af61dc8
7
+ data.tar.gz: 0d8d4f7c29c0fa5da26a85eb82554796cb1ac18f98e00e3f1e700bd4eb79f647b8311f56e2eb7a46cc1679a2809fc140b1cc702856da1baacafd5127a65ea66f
data/.gitignore CHANGED
@@ -18,3 +18,4 @@ mkmf.log
18
18
  *.pyc
19
19
  tools/pdf/
20
20
  /test*
21
+ .rake_tasks~
Binary file
data/data/PDFA_def.ps CHANGED
@@ -5,10 +5,10 @@
5
5
  % unless the user modifies the corresponding line below.
6
6
 
7
7
  % Define entries in the document Info dictionary :
8
- /ICCProfile ([** Fill in ICC profile location **])
8
+ /ICCProfile ([**ICC profile**])
9
9
  def
10
10
 
11
- [ /Title (Title)
11
+ [ [**METADATA**]
12
12
  /DOCINFO pdfmark
13
13
 
14
14
  % Define an ICC profile :
@@ -35,6 +35,6 @@ def
35
35
  /Type /OutputIntent % Must be so (the standard requires).
36
36
  /S /GTS_PDFA1 % Must be so (the standard requires).
37
37
  /DestOutputProfile {icc_PDFA} % Must be so (see above).
38
- /OutputConditionIdentifier ([** Fill in ICC reference name **])
38
+ /OutputConditionIdentifier ([**ICC reference**])
39
39
  >> /PUT pdfmark
40
40
  [{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
@@ -21,7 +21,7 @@ module Libis
21
21
  Config[:fido_formats] = [(File.join(Libis::Format::DATA_DIR, 'lias_formats.xml'))]
22
22
  Config[:pdf_tool] = File.join(Libis::Format::TOOL_DIR, 'PdfTool.jar')
23
23
  Config[:preflight_jar] = File.join(Libis::Format::TOOL_DIR, 'pdfbox', 'preflight-app-2.0.13.jar')
24
- Config[:emai2pdf_jar] = File.join(Libis::Format::TOOL_DIR, 'emailconverter.jar')
24
+ Config[:email2pdf_jar] = File.join(Libis::Format::TOOL_DIR, 'emailconverter.jar')
25
25
  # noinspection RubyStringKeysInHashInspection
26
26
  Config[:xml_validations] = [['archive/ead', File.join(Libis::Format::DATA_DIR, 'ead.xsd')]]
27
27
  Config[:type_database] = File.join(Libis::Format::DATA_DIR, 'types.yml')
@@ -5,6 +5,7 @@ require_relative 'base'
5
5
  require 'libis/tools/extend/hash'
6
6
  require 'libis/format/tool/pdf_copy'
7
7
  require 'libis/format/tool/pdf_to_pdfa'
8
+ require 'libis/format/tool/pdfa_validator'
8
9
  require 'libis/format/tool/pdf_optimizer'
9
10
 
10
11
  module Libis
@@ -120,7 +121,7 @@ module Libis
120
121
  end
121
122
 
122
123
  {
123
- files: [result]
124
+ files: [result],
124
125
  converter: self.class.name
125
126
  }
126
127
 
@@ -163,11 +164,16 @@ module Libis
163
164
 
164
165
  using_temp(target) do |tmpname|
165
166
  result = Libis::Format::Tool::PdfToPdfa.run source, tmpname
166
- if result[:status] != 0
167
- error("Pdf/A conversion encountered errors:\n%s", result[:err].join("\n"))
167
+
168
+ if result[:command][:status] != 0
169
+ error("Pdf/A conversion encountered errors:\n%s", (result[:command][:out] + result[:command][:err]).join("\n"))
168
170
  next nil
169
171
  else
170
- warn("Pdf/A conversion warnings:\n%s", result[:err].join("\n")) unless result[:err].empty?
172
+ r = Libis::Format::Tool::PdfaValidator.run tmpname
173
+ if r[:status] != 0
174
+ error "Pdf/A file failed to validate with following errors:\n%s", (r[:err] || r[:out] || []).join("\n")
175
+ next nil
176
+ end
171
177
  end
172
178
  tmpname
173
179
  end
@@ -1,17 +1,17 @@
1
- require_relative 'base'
1
+ require_relative "base"
2
2
 
3
3
  module Libis
4
4
  module Format
5
5
  module Converter
6
-
7
6
  class XsltConverter < Libis::Format::Converter::Base
8
-
9
7
  def self.input_types
10
8
  [:XML]
11
9
  end
12
10
 
13
11
  def self.output_types(format = nil)
14
- return [] unless input_types.include?(format) if format
12
+ if format
13
+ return [] unless input_types.include?(format)
14
+ end
15
15
  [:XML, :HTML, :TXT]
16
16
  end
17
17
 
@@ -28,20 +28,20 @@ module Libis
28
28
  end
29
29
 
30
30
  unless @options[:xsl_file]
31
- error 'No xsl_file supplied'
31
+ error "No xsl_file supplied"
32
32
  return nil
33
33
  end
34
34
 
35
35
  FileUtils.mkpath(File.dirname(target))
36
36
 
37
37
  if RUBY_PLATFORM == "java"
38
- require 'saxon-xslt'
38
+ require "saxon-xslt"
39
39
  xsl = Saxon.XSLT(File.open(@options[:xsl_file]))
40
40
  xml = Saxon.XML(File.open(source))
41
41
  result = xsl.transform(xml)
42
- File.open(target, 'w') {|f| f.write(result.to_s)}
42
+ File.write(target, result.to_s)
43
43
  else
44
- require 'nokogiri'
44
+ require "nokogiri"
45
45
 
46
46
  doc = nil
47
47
  begin
@@ -65,7 +65,7 @@ module Libis
65
65
  xsl = nil
66
66
 
67
67
  begin
68
- fp = File.open(file, 'r')
68
+ fp = File.open(file, "r")
69
69
  xsl = Nokogiri::XSLT(fp) do |config|
70
70
  config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NOBLANKS
71
71
  end
@@ -80,7 +80,7 @@ module Libis
80
80
 
81
81
  begin
82
82
  target_xml = xsl.transform(doc)
83
- fp = File.open(target, 'w')
83
+ fp = File.open(target, "w")
84
84
  fp.write(target_xml)
85
85
  rescue Exception => e
86
86
  error "Error transforming '#{source}' with '#{file}': #{e.message} @ #{e.backtrace[0]}"
@@ -89,13 +89,14 @@ module Libis
89
89
  fp.close unless fp.nil? or fp.closed?
90
90
  end
91
91
 
92
- target
93
- end
92
+ {
93
+ command: {status: 0},
94
+ files: [target]
95
+ }
94
96
 
97
+ end
95
98
  end
96
-
97
99
  end
98
-
99
100
  end
100
101
  end
101
102
  end
@@ -26,8 +26,8 @@ module Libis
26
26
  timeout = Libis::Format::Config[:timeouts][:email2pdf] || 120
27
27
  result = Libis::Tools::Command.run(
28
28
  Libis::Format::Config[:java_cmd],
29
- "-Duser.timezone=Europe/Brussels -Duser.language=nl -Duser.country=BE",
30
- "jar", Libis::Format::Config[:email2pdf_cmd],
29
+ "-Duser.timezone=Europe/Brussels", "-Duser.language=nl", "-Duser.country=BE",
30
+ "-jar", Libis::Format::Config[:email2pdf_jar],
31
31
  "-e", "-hd", "-a",
32
32
  "-o", target,
33
33
  source,
@@ -35,7 +35,7 @@ module Libis
35
35
  kill_after: timeout * 2
36
36
  )
37
37
 
38
- warn "EmailToPdf conversion messages: \n\t#{result[:out].join("\n\t")}" unless result[:out].empty?
38
+ warn "EmailToPdf conversion messages: \n\t#{result[:err].join("\n\t")}" unless result[:err].empty?
39
39
 
40
40
  raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
41
41
  raise "#{self.class} failed to generate target file #{target}" unless File.exist?(target)
@@ -59,7 +59,7 @@ module Libis
59
59
  return headers unless File.exist?(headers_file)
60
60
  doc = REXML::Document.new(File.new(headers_file))
61
61
  root = doc.root
62
- root.elements("/emailheader/*").each do |element|
62
+ root.children.each do |element|
63
63
  case element.name
64
64
  when "attachments"
65
65
  headers[:attachments] = element.elements.map { |e| e.text }
@@ -33,6 +33,7 @@ module Libis
33
33
  result = Libis::Tools::Command.run(
34
34
  Libis::Format::Config[:java_cmd],
35
35
  "-Dfop.home=#{File.dirname(Libis::Format::Config[:fop_jar])}",
36
+ '-Djava.awt.headless=true',
36
37
  '-jar', Libis::Format::Config[:fop_jar],
37
38
  '-fo', xml,
38
39
  '-pdf', target,
@@ -52,14 +52,14 @@ module Libis
52
52
 
53
53
  FileUtils.copy tgt_file, target, preserve: true
54
54
 
55
- ensure
56
- FileUtils.rmtree workdir rescue nil
57
-
58
55
  {
59
56
  command: result,
60
57
  files: [ target ]
61
58
  }
62
59
 
60
+ ensure
61
+ FileUtils.rmtree workdir rescue nil
62
+
63
63
  end
64
64
  end
65
65
 
@@ -1,18 +1,18 @@
1
- require 'tempfile'
2
- require 'csv'
3
- require 'fileutils'
1
+ require "tempfile"
2
+ require "csv"
3
+ require "fileutils"
4
+ require 'pdfinfo'
4
5
 
5
- require 'libis/tools/extend/string'
6
- require 'libis/tools/logger'
7
- require 'libis/tools/command'
8
- require 'libis/tools/temp_file'
6
+ require "libis/tools/extend/string"
7
+ require "libis/tools/logger"
8
+ require "libis/tools/command"
9
+ require "libis/tools/temp_file"
9
10
 
10
- require 'libis/format'
11
+ require "libis/format"
11
12
 
12
13
  module Libis
13
14
  module Format
14
15
  module Tool
15
-
16
16
  class PdfToPdfa
17
17
  include ::Libis::Tools::Logger
18
18
 
@@ -22,71 +22,78 @@ module Libis
22
22
  end
23
23
 
24
24
  def self.run(source, target = nil, options = {})
25
- self.new.run source, target, options
25
+ new.run source, target, options
26
26
  end
27
27
 
28
28
  def run(source, target = nil, options = nil)
29
-
30
- tmp_target = Tools::TempFile.name(File.basename(source, '.*'), '.pdf')
29
+ tmp_target = Tools::TempFile.name(File.basename(source, ".*"), ".pdf")
31
30
  target ||= tmp_target
32
31
 
32
+ metadata = get_metadata(source)
33
+
33
34
  icc_info = icc_options(options[:colorspace])
34
35
 
35
- icc_file = Tools::TempFile.name(icc_info[:icc_name], '.icc')
36
+ icc_file = Tools::TempFile.name(icc_info[:icc_name], ".icc")
36
37
  FileUtils.cp(File.join(Libis::Format::DATA_DIR, "#{icc_info[:icc_name]}.icc"), icc_file)
37
38
 
38
- def_filename = Tools::TempFile.name('PDFA_def', '.ps')
39
- File.open(def_filename, 'w') do |f|
40
- f.puts File.read(File.join(Libis::Format::DATA_DIR, 'PDFA_def.ps')).
41
- gsub('[** Fill in ICC profile location **]', icc_file).
42
- gsub('[** Fill in ICC reference name **]', icc_info[:icc_ref])
39
+ def_filename = Tools::TempFile.name("PDFA_def", ".ps")
40
+ File.open(def_filename, "w") do |f|
41
+ f.puts File.read(File.join(Libis::Format::DATA_DIR, "PDFA_def.ps"))
42
+ .gsub("[**ICC profile**]", icc_file)
43
+ .gsub("[**ICC reference**]", icc_info[:icc_ref])
44
+ .gsub("[**METADATA**]", metadata)
43
45
  end
44
46
 
45
47
  timeout = Libis::Format::Config[:timeouts][:pdf_to_pdfa]
46
48
  result = Libis::Tools::Command.run(
47
- Libis::Format::Config[:ghostscript_cmd],
48
- '-dBATCH', '-dNOPAUSE', '-dNOOUTERSAVE',
49
- '-sColorConversionStrategy=/UseDeviceIndependentColor',
50
- "-sProcessColorModel=#{icc_info[:device]}",
51
- '-sDEVICE=pdfwrite', '-dPDFA', '-dPDFACompatibilityPolicy=1',
52
- "-sOutputICCProfile=#{icc_file}",
53
- '-o', File.absolute_path(target),
54
- def_filename,
55
- source,
56
- timeout: timeout,
57
- kill_after: timeout * 2
49
+ Libis::Format::Config[:ghostscript_cmd],
50
+ "-q",
51
+ "-dBATCH", "-dNOPAUSE", "-dNOOUTERSAVE", "-dNOSAFER",
52
+ # "-dNOPLATFONTS", "-dUseCIEColor=true",
53
+ # "-sColorConversionStrategy=/UseDeviceIndependentColor",
54
+ "-sProcessColorModel=#{icc_info[:device]}",
55
+ "-sOutputICCProfile=#{icc_file}",
56
+ "-dCompatibilityLevel=1.4",
57
+ "-sDEVICE=pdfwrite", "-dPDFA=1", "-dPDFACompatibilityPolicy=1",
58
+ "-o", File.absolute_path(target),
59
+ def_filename,
60
+ source,
61
+ timeout: timeout,
62
+ kill_after: timeout * 2
58
63
  )
59
64
 
60
- raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
65
+ raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
66
+ raise "#{self.class} failed with error #{result[:status]}: \n#{(result[:out] + result[:err]).join("\n")}" if result[:status] != 0
61
67
 
62
68
  FileUtils.rm [icc_file, def_filename].compact, force: true
63
69
 
64
- unless Format::Tool::PdfaValidator.run(target)
65
- result[:status] = -999
66
- result[:err] << 'Failed to validate generated PDF/A file.'
67
- end
68
-
69
70
  {
70
71
  command: result,
71
- files: [ target ]
72
+ files: [target]
72
73
  }
73
-
74
74
  end
75
75
 
76
-
77
76
  private
78
77
 
78
+ def get_metadata(source)
79
+ info = Pdfinfo.new(source)
80
+ metadata = "/Title (#{info.title})"
81
+ metadata += "\n /Author (#{info.author})" if info.author
82
+ metadata += "\n /Subject (#{info.subject})" if info.subject
83
+ metadata += "\n /Keywords (#{info.keywords})" if info.keywords
84
+ metadata += "\n /Creator (#{info.creator})" if info.creator
85
+ metadata
86
+ end
87
+
79
88
  def icc_options(colorspace)
80
89
  case colorspace.to_s.downcase
81
- when 'cmyk'
82
- {icc_name: 'ISOcoated_v2_eci', icc_ref: 'FOGRA39L', device: 'DeviceCMYK'}
83
- else
84
- {icc_name: 'eciRGB_v2', icc_ref: 'sRGB', device: 'DeviceRGB'}
90
+ when "cmyk"
91
+ {icc_name: "ISOcoated_v2_eci", icc_ref: "FOGRA39L", device: "DeviceCMYK"}
92
+ else
93
+ {icc_name: "AdobeRGB1998", icc_ref: "sRGB", device: "DeviceRGB"}
85
94
  end
86
95
  end
87
-
88
96
  end
89
-
90
97
  end
91
98
  end
92
99
  end
@@ -1,24 +1,22 @@
1
- require 'fileutils'
1
+ require "fileutils"
2
2
 
3
- require 'libis/tools/extend/string'
4
- require 'libis/tools/logger'
5
- require 'libis/tools/command'
3
+ require "libis/tools/extend/string"
4
+ require "libis/tools/logger"
5
+ require "libis/tools/command"
6
6
 
7
- require 'libis/format/config'
7
+ require "libis/format/config"
8
8
 
9
9
  module Libis
10
10
  module Format
11
11
  module Tool
12
-
13
12
  class PdfaValidator
14
13
  include ::Libis::Tools::Logger
15
14
 
16
15
  def self.run(source)
17
- self.new.run source
16
+ new.run source
18
17
  end
19
18
 
20
19
  def run(source)
21
-
22
20
  src_file = File.absolute_path(source)
23
21
 
24
22
  timeout = Libis::Format::Config[:timeouts][:pdfa_validator]
@@ -28,46 +26,41 @@ module Libis
28
26
  Dir.chdir(Dir.tmpdir)
29
27
 
30
28
  result = Libis::Tools::Command.run(
31
- pdfa,
32
- '--noxml',
33
- '--level', 'B',
34
- '--verb', '0',
35
- src_file,
36
- timeout: timeout,
37
- kill_after: timeout * 2
29
+ pdfa,
30
+ "--noxml",
31
+ "--level", "B",
32
+ "--verb", "0",
33
+ src_file,
34
+ timeout: timeout,
35
+ kill_after: timeout * 2
38
36
  )
39
37
 
40
- raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
41
- raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
38
+ raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
39
+ raise "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
42
40
 
43
41
  Dir.chdir(previous_wd)
44
42
 
45
- unless result[:out].any? {|line| line =~ /^VLD-\[PASS\]/}
46
- warn "Validator failed to validate the PDF file '%s' against PDF/A-1B constraints:\n%s", source,
47
- result[:out].join("\n")
48
- return false
49
- end
43
+ out, err = result[:out].partition { |line| line =~ /^VLD-\[PASS\]/ }
44
+ result[:out] = out
45
+ result[:err] += err
46
+
47
+ result
50
48
  else
51
49
  jar = Libis::Format::Config[:preflight_jar]
52
50
  result = Libis::Tools::Command.run(
53
- Libis::Format::Config[:java_cmd],
54
- '-jar', jar,
55
- src_file,
56
- timeout: timeout,
57
- kill_after: timeout * 2
51
+ Libis::Format::Config[:java_cmd],
52
+ "-jar", jar,
53
+ src_file,
54
+ timeout: timeout,
55
+ kill_after: timeout * 2
58
56
  )
59
- raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
60
57
 
61
- unless result[:status] == 0
62
- warn "Validator failed to validate the PDF file '%s' against PDF/A-1B constraints:\n%s", source,
63
- result[:out].join("\n")
64
- return false
65
- end
58
+ raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
59
+
60
+ result
66
61
  end
67
- true
68
62
  end
69
63
  end
70
-
71
64
  end
72
65
  end
73
66
  end
@@ -53,14 +53,14 @@ module Libis
53
53
 
54
54
  FileUtils.copy tgt_file, target, preserve: true
55
55
 
56
- ensure
57
- FileUtils.rmtree workdir rescue nil
58
-
59
56
  {
60
57
  command: result,
61
58
  files: [ target ]
62
59
  }
63
60
 
61
+ ensure
62
+ FileUtils.rmtree workdir rescue nil
63
+
64
64
  end
65
65
  end
66
66
 
@@ -1,5 +1,5 @@
1
1
  module Libis
2
2
  module Format
3
- VERSION = '1.1.0'
3
+ VERSION = '1.2.0'
4
4
  end
5
5
  end
data/libis-format.gemspec CHANGED
@@ -39,4 +39,6 @@ Gem::Specification.new do |spec|
39
39
  spec.add_runtime_dependency 'deep_dive', '~> 0.3'
40
40
  spec.add_runtime_dependency 'chromaprint', '~> 0.0.2'
41
41
  spec.add_runtime_dependency 'naturally', '~> 2.1'
42
+ spec.add_runtime_dependency 'pdfinfo', '~> 1.4'
43
+
42
44
  end
data/tools/pdf2pdfa ADDED
@@ -0,0 +1,395 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # PDF2ARCHIVE 0.3.2
4
+ # (C) 2018 Matteo Seclì <secli.matteo@gmail.com>
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+
20
+ #=====# INITIALIZE VARIABLES #=====#
21
+ VERSION="0.3.2"
22
+ INPUT=""
23
+ OUTPUT=""
24
+ QUALITYOPTS=""
25
+ DEBUG=false
26
+ VALIDATE=false
27
+ MSGOPTS="-dQUIET -sstdout=/dev/null"
28
+ VERAMSGOPTS=""
29
+ #ERROPTS="2>/dev/null"
30
+
31
+
32
+ #=====# HELP FUNCTION #=====#
33
+ help()
34
+ {
35
+ TOTLEN="38" # Adjust this
36
+ TITLESTRING="PDF2ARCHIVE, version $VERSION"
37
+ SPACEL=$(echo "($TOTLEN-${#TITLESTRING})/2 + (36-${#TITLESTRING})%2 - 1" | bc)
38
+ SPACER=$(echo "($TOTLEN-${#TITLESTRING})/2 - 1" | bc)
39
+ TITLESTRING=$(printf "|%-${SPACEL}s%s%-${SPACER}s|" "" "$TITLESTRING" "")
40
+ DASHSTRING=$(eval printf "%.0s-" {1..$TOTLEN})
41
+ echo \
42
+ "$DASHSTRING
43
+ $TITLESTRING
44
+ $DASHSTRING
45
+
46
+ OVERVIEW:
47
+ A simple Ghostscript-based PDF to PDF/A-1B converter.
48
+
49
+ USAGE:
50
+ $0 [options] input.pdf [output.pdf]
51
+
52
+ EXAMPLES:
53
+ Convert 'input.pdf' in PDF/A-1B format; the output is 'input-PDFA.pdf':
54
+ $0 input.pdf
55
+ Convert 'input.pdf' in PDF/A-1B format; the output is 'output.pdf':
56
+ $0 input.pdf output.pdf
57
+ Convert 'input.pdf' in PDF/A-1B format and perform a high-quality compression:
58
+ $0 --quality=high input.pdf
59
+ Convert 'input.pdf' in PDF/A-1B format and specify the document title:
60
+ $0 --title=\"Title of your nice document\" input.pdf
61
+ Convert 'input.pdf' in PDF/A-1B format and validate the result:
62
+ $0 --validate input.pdf
63
+
64
+ OPTIONS:
65
+ -h, --help Show the help
66
+ --quality=<value> Set the quality of the output when downsampling. The
67
+ possible values are 'high', 'medium' and 'low', where
68
+ 'high' gives the highest output quality. By specifying no
69
+ option, no additional downsampling is done.
70
+ --title=<value> Title of the resulting PDF/A file
71
+ --author=<value> Author of the resulting PDF/A file
72
+ --subject=<value> Subject of the resulting PDF/A file
73
+ --keywords=<value> Comma-separated keywords of the resulting PDF/A file
74
+ --cleanmetadata Clean all the standard metadata fields, except the ones
75
+ specified via the command line options.
76
+ --validate Validate the resulting file. The validation is done with
77
+ VeraPDF, you need a working Java installation.
78
+ --validate-only Perform only the validation on the input file, again using
79
+ VeraPDF
80
+ --debug Write additional debug information on screen
81
+ -v, --version Show the program version
82
+
83
+ LICENSE:
84
+ GPLv3
85
+
86
+ AUTHORS:
87
+ (C) 2017-2018 Matteo Seclì"
88
+ }
89
+
90
+
91
+ #=====# RUN HELPER FUNCTION #=====#
92
+ run() {
93
+ if $DEBUG; then
94
+ #v=$(exec 2>&1 && set -x && set -- "$@")
95
+ #echo "#${v#*--}"
96
+ "$@"
97
+ else
98
+ "$@" 2>/dev/null #>/dev/null 2>&1
99
+ fi
100
+ }
101
+
102
+
103
+ #=====# CHECKS #=====#
104
+ if [ "$(which gs)" == "" ]; then
105
+ echo " ERROR: Ghostscript is not installed or it's not in the path"
106
+ exit
107
+ fi
108
+
109
+
110
+ #=====# VALIDATION #=====#
111
+
112
+ javaCheck() {
113
+ if [ "$(which java)" == "" ]; then
114
+ echo " ERROR: Java is not installed or it's not in the path"
115
+ echo " Cannot perform validation"
116
+ exit 1
117
+ fi
118
+ }
119
+
120
+ validate() {
121
+ echo " Validating..."
122
+ echo " $(./verapdf/verapdf "$1" --extract --flavour 1b --format text "$2")"
123
+ }
124
+
125
+
126
+ #=====# INPUT PARSER #=====#
127
+ if [ "$1" == "" ]; then
128
+ help
129
+ exit
130
+ fi
131
+ while [ "$1" != "" ]; do
132
+ PARAM=`echo $1 | awk -F= '{print $1}'`
133
+ VALUE=`echo $1 | awk -F= '{print $2}'`
134
+ case $PARAM in
135
+ -h | --help)
136
+ help
137
+ exit
138
+ ;;
139
+ -v | --version)
140
+ echo $VERSION
141
+ exit
142
+ ;;
143
+ --debug)
144
+ DEBUG=true
145
+ MSGOPTS=""
146
+ VERAMSGOPTS="--verbose"
147
+ #ERROPTS=""
148
+ ;;
149
+ --quality)
150
+ if [ "$VALUE" == "high" ]; then
151
+ QUALITYOPTS="-dPDFSETTINGS=/printer"
152
+ elif [ "$VALUE" == "medium" ]; then
153
+ QUALITYOPTS="-dPDFSETTINGS=/ebook"
154
+ elif [ "$VALUE" == "low" ]; then
155
+ QUALITYOPTS="-dPDFSETTINGS=/screen"
156
+ else
157
+ echo " ERROR: unknown quality option '$VALUE'"
158
+ help
159
+ exit 1
160
+ fi
161
+ ;;
162
+ --cleanmetadata)
163
+ [ -z ${PDFTITLE+x} ] && PDFTITLE=""
164
+ [ -z ${PDFAUTHOR+x} ] && PDFAUTHOR=""
165
+ [ -z ${PDFSUBJECT+x} ] && PDFSUBJECT=""
166
+ [ -z ${PDFKEYWORDS+x} ] && PDFKEYWORDS=""
167
+ [ -z ${PDFCREATOR+x} ] && PDFCREATOR=""
168
+ [ -z ${PDFPRODUCER+x} ] && PDFPRODUCER=""
169
+ [ -z ${PDFCREATIONDATE+x} ] && PDFCREATIONDATE=""
170
+ [ -z ${PDFMODDATE+x} ] && PDFMODDATE=""
171
+ [ -z ${PDFTRAPPED+x} ] && PDFTRAPPED=""
172
+ ;;
173
+ --title)
174
+ PDFTITLE=$VALUE
175
+ ;;
176
+ --author)
177
+ PDFAUTHOR=$VALUE
178
+ ;;
179
+ --subject)
180
+ PDFSUBJECT=$VALUE
181
+ ;;
182
+ --keywords)
183
+ PDFKEYWORDS=$VALUE
184
+ ;;
185
+ --validate)
186
+ javaCheck
187
+ VALIDATE=true
188
+ ;;
189
+ --validate-only)
190
+ javaCheck
191
+ validate $VERAMSGOPTS $2
192
+ exit
193
+ ;;
194
+ *.pdf)
195
+ if [ "$INPUT" == "" ]; then
196
+ INPUT=$PARAM
197
+ elif [ "$OUTPUT" == "" ]; then
198
+ OUTPUT=$PARAM
199
+ else
200
+ echo " ERROR: too many PDF files as input!"
201
+ help
202
+ exit 1
203
+ fi
204
+ ;;
205
+ *)
206
+ echo " ERROR: unknown parameter \"$PARAM\""
207
+ help
208
+ exit 1
209
+ ;;
210
+ esac
211
+ shift
212
+ done
213
+
214
+ #=====# SET UP ALL THE STUFF #=====#
215
+ echo "=== Welcome to PDF2ARCHIVE ==="
216
+ if [ "$OUTPUT" == "" ]; then
217
+ OUTPUT="${INPUT%.pdf}-PDFA.pdf"
218
+ fi
219
+ TMPFILE=$(mktemp)
220
+ TMPDIR=$(mktemp -d)
221
+ PSTMPFILE=$TMPDIR/PDFA_def.ps
222
+ ICCTMPFILE=$TMPDIR/AdobeRGB1998.icc
223
+ INFOTMPFILE=$TMPDIR/pdf_minimal_info.ps
224
+ echo \
225
+ "%!PS
226
+ % Extract PDF info in a minimal way.
227
+ % Inspired by 'toolbin/pdf_info.ps'.
228
+
229
+ /QUIET true def
230
+ File dup (r) file runpdfbegin
231
+ Trailer /Info knownoget {
232
+ dup /Title knownoget { (__knowninfoTitle: ) print = flush } if
233
+ dup /Author knownoget { (__knowninfoAuthor: ) print = flush } if
234
+ dup /Subject knownoget { (__knowninfoSubject: ) print = flush } if
235
+ dup /Keywords knownoget { (__knowninfoKeywords: ) print = flush } if
236
+ dup /Creator knownoget { (__knowninfoCreator: ) print = flush } if
237
+ dup /Producer knownoget { (__knowninfoProducer: ) print = flush } if
238
+ dup /CreationDate knownoget { (__knowninfoCreationDate: ) print = flush } if
239
+ dup /ModDate knownoget { (__knowninfoModDate: ) print = flush } if
240
+ dup /Trapped knownoget { (__knowninfoTrapped: ) print = flush } if
241
+ } if
242
+ quit
243
+ " > $INFOTMPFILE
244
+
245
+
246
+ #=====# PRESERVE UNSPECIFIED KNOWN STANDARD METADATA #=====#
247
+ # Notes:
248
+ # 'iconv' is necessary to filter out all the invalid bytes.
249
+ # If it's not used, sed (unless it's GNU sed) will fail with
250
+ # 'RE error: illegal byte sequence'. A solution to this is to
251
+ # use 'LC_CTYPE=C && LANG=C && echo "$METADUMP" ...' in the
252
+ # variable assignments; however, this produces bad PDF files.
253
+ #
254
+ METADUMP=$(gs -dNOSAFER -dNODISPLAY -q -sFile="$INPUT" $INFOTMPFILE | iconv -f utf-8 -t utf-8 -c)
255
+ [ -z ${PDFTITLE+x} ] && PDFTITLE=$(echo "$METADUMP" | grep "__knowninfoTitle: " | sed "s/^__knowninfoTitle: //g")
256
+ [ -z ${PDFAUTHOR+x} ] && PDFAUTHOR=$(echo "$METADUMP" | grep "__knowninfoAuthor: " | sed "s/^__knowninfoAuthor: //g")
257
+ [ -z ${PDFSUBJECT+x} ] && PDFSUBJECT=$(echo "$METADUMP" | grep "__knowninfoSubject: " | sed "s/^__knowninfoSubject: //g")
258
+ [ -z ${PDFKEYWORDS+x} ] && PDFKEYWORDS=$(echo "$METADUMP" | grep "__knowninfoKeywords: " | sed "s/^__knowninfoKeywords: //g")
259
+ [ -z ${PDFCREATOR+x} ] && PDFCREATOR=$(echo "$METADUMP" | grep "__knowninfoCreator: " | sed "s/^__knowninfoCreator: //g")
260
+ [ -z ${PDFPRODUCER+x} ] && PDFPRODUCER=$(echo "$METADUMP" | grep "__knowninfoProducer: " | sed "s/^__knowninfoProducer: //g")
261
+ [ -z ${PDFCREATIONDATE+x} ] && PDFCREATIONDATE=$(echo "$METADUMP" | grep "__knowninfoCreationDate: " | sed "s/^__knowninfoCreationDate: //g")
262
+ [ -z ${PDFMODDATE+x} ] && PDFMODDATE=$(echo "$METADUMP" | grep "__knowninfoModDate: " | sed "s/^__knowninfoModDate: //g")
263
+ [ -z ${PDFTRAPPED+x} ] && PDFTRAPPED=$(echo "$METADUMP" | grep "__knowninfoTrapped: " | sed "s/^__knowninfoTrapped: //g")
264
+ # Replace "Trapped" string, if not empty, with an operator. Fixes 3Heights.
265
+ if [ "$PDFTRAPPED" != "" ]; then
266
+ PDFTRAPPED="/$(tr '[:lower:]' '[:upper:]' <<< ${PDFTRAPPED:0:1})$(tr '[:upper:]' '[:lower:]' <<< ${PDFTRAPPED:1})"
267
+ fi
268
+ # Check if the operator is allowed, otherwise empty variable.
269
+ if [ "$PDFTRAPPED" != "/True" ] && [ "$PDFTRAPPED" != "/False" ]; then
270
+ PDFTRAPPED=""
271
+ fi
272
+
273
+
274
+ #=====# PRINT DEBUG INFO #=====#
275
+ if $DEBUG; then
276
+ echo " DEBUG: running PDF2ARCHIVE, version $VERSION"
277
+ echo " DEBUG: using Ghostscript binary at $(which gs), version $(gs --version)"
278
+ echo " DEBUG: the input file is '$INPUT'"
279
+ echo " DEBUG: the output file is '$OUTPUT'"
280
+ echo " DEBUG: the intermediate processing file is $TMPFILE"
281
+ echo " DEBUG: the temporary directory is $TMPDIR"
282
+ echo " DEBUG: the current quality options are '$QUALITYOPTS'"
283
+ echo " DEBUG: PDF title '$PDFTITLE'"
284
+ echo " DEBUG: PDF author '$PDFAUTHOR'"
285
+ echo " DEBUG: PDF subject '$PDFSUBJECT'"
286
+ echo " DEBUG: PDF keywords '$PDFKEYWORDS'"
287
+ echo " DEBUG: PDF creator '$PDFCREATOR'"
288
+ echo " DEBUG: PDF producer '$PDFPRODUCER'"
289
+ echo " DEBUG: PDF creation date '$PDFCREATIONDATE'"
290
+ echo " DEBUG: PDF modification date '$PDFMODDATE'"
291
+ echo " DEBUG: PDF trapping '$PDFTRAPPED'"
292
+ fi
293
+
294
+
295
+ #=====# CREATE THE PS DEFINITION FILE #=====#
296
+ echo " Creating the definition file..."
297
+ echo \
298
+ "%!
299
+ % This prefix file for creating a PDF/A document is derived from
300
+ % the sample included with Ghostscript 9.07, released under the
301
+ % GNU Affero General Public License.
302
+ % Modified 4/15/2013 by MCB Systems.
303
+
304
+ % Feel free to modify entries marked with \"Customize\".
305
+
306
+ % This assumes an ICC profile to reside in the file (AdobeRGB1998.icc),
307
+ % unless the user modifies the corresponding line below.
308
+
309
+ % The color space described by the ICC profile must correspond to the
310
+ % ProcessColorModel specified when using this prefix file (GRAY with
311
+ % DeviceGray, RGB with DeviceRGB, and CMYK with DeviceCMYK).
312
+
313
+ % Define entries in the document Info dictionary :
314
+
315
+ /ICCProfile ($ICCTMPFILE) % Customize.
316
+ def
317
+
318
+ [ /Title ($PDFTITLE) % Customize." > $PSTMPFILE
319
+ if [ "$PDFAUTHOR" != "" ]; then
320
+ echo " /Author ($PDFAUTHOR)" >> $PSTMPFILE
321
+ fi
322
+ if [ "$PDFSUBJECT" != "" ]; then
323
+ echo " /Subject ($PDFSUBJECT)" >> $PSTMPFILE
324
+ fi
325
+ if [ "$PDFKEYWORDS" != "" ]; then
326
+ echo " /Keywords ($PDFKEYWORDS)" >> $PSTMPFILE
327
+ fi
328
+ if [ "$PDFCREATOR" != "" ]; then
329
+ echo " /Creator ($PDFCREATOR)" >> $PSTMPFILE
330
+ fi
331
+ echo \
332
+ "% /Producer % Reserved to GS
333
+ % /CreationDate % Reserved to GS
334
+ % /ModDate % Reserved to GS" >> $PSTMPFILE
335
+ if [ "$PDFTRAPPED" != "" ]; then
336
+ echo " /Trapped $PDFTRAPPED" >> $PSTMPFILE
337
+ fi
338
+ echo \
339
+ " /DOCINFO pdfmark
340
+
341
+ % Define an ICC profile :
342
+
343
+ [/_objdef {icc_PDFA} /type /stream /OBJ pdfmark
344
+ [{icc_PDFA} <</N systemdict /ProcessColorModel get /DeviceGray eq {1} {systemdict /ProcessColorModel get /DeviceRGB eq {3} {4} ifelse} ifelse >> /PUT pdfmark
345
+ [{icc_PDFA} ICCProfile (r) file /PUT pdfmark
346
+
347
+ % Define the output intent dictionary :
348
+
349
+ [/_objdef {OutputIntent_PDFA} /type /dict /OBJ pdfmark
350
+ [{OutputIntent_PDFA} <<
351
+ /Type /OutputIntent % Must be so (the standard requires).
352
+ /S /GTS_PDFA1 % Must be so (the standard requires).
353
+ /DestOutputProfile {icc_PDFA} % Must be so (see above).
354
+ /OutputConditionIdentifier (AdobeRGB1998) % Customize
355
+ >> /PUT pdfmark
356
+ [{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
357
+ " >> $PSTMPFILE
358
+
359
+
360
+ #=====# CREATE THE COLOR PROFILE FILE #=====#
361
+ echo -n -e "\\x00\\x00\\x02\\x30\\x41\\x44\\x42\\x45\\x02\\x10\\x00\\x00\\x6d\\x6e\\x74\\x72\\x52\\x47\\x42\\x20\\x58\\x59\\x5a\\x20\\x07\\xd0\\x00\\x08\\x00\\x0b\\x00\\x13\\x00\\x33\\x00\\x3b\\x61\\x63\\x73\\x70\\x41\\x50\\x50\\x4c\\x00\\x00\\x00\\x00\\x6e\\x6f\\x6e\\x65\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xf6\\xd6\\x00\\x01\\x00\\x00\\x00\\x00\\xd3\\x2d\\x41\\x44\\x42\\x45\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x0a\\x63\\x70\\x72\\x74\\x00\\x00\\x00\\xfc\\x00\\x00\\x00\\x32\\x64\\x65\\x73\\x63\\x00\\x00\\x01\\x30\\x00\\x00\\x00\\x6b\\x77\\x74\\x70\\x74\\x00\\x00\\x01\\x9c\\x00\\x00\\x00\\x14\\x62\\x6b\\x70\\x74\\x00\\x00\\x01\\xb0\\x00\\x00\\x00\\x14\\x72\\x54\\x52\\x43\\x00\\x00\\x01\\xc4\\x00\\x00\\x00\\x0e\\x67\\x54\\x52\\x43\\x00\\x00\\x01\\xd4\\x00\\x00\\x00\\x0e\\x62\\x54\\x52\\x43\\x00\\x00\\x01\\xe4\\x00\\x00\\x00\\x0e\\x72\\x58\\x59\\x5a\\x00\\x00\\x01\\xf4\\x00\\x00\\x00\\x14\\x67\\x58\\x59\\x5a\\x00\\x00\\x02\\x08\\x00\\x00\\x00\\x14\\x62\\x58\\x59\\x5a\\x00\\x00\\x02\\x1c\\x00\\x00\\x00\\x14\\x74\\x65\\x78\\x74\\x00\\x00\\x00\\x00\\x43\\x6f\\x70\\x79\\x72\\x69\\x67\\x68\\x74\\x20\\x32\\x30\\x30\\x30\\x20\\x41\\x64\\x6f\\x62\\x65\\x20\\x53\\x79\\x73\\x74\\x65\\x6d\\x73\\x20\\x49\\x6e\\x63\\x6f\\x72\\x70\\x6f\\x72\\x61\\x74\\x65\\x64\\x00\\x00\\x00\\x64\\x65\\x73\\x63\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x11\\x41\\x64\\x6f\\x62\\x65\\x20\\x52\\x47\\x42\\x20\\x28\\x31\\x39\\x39\\x38\\x29\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x58\\x59\\x5a\\x20\\x00\\x00\\x00\\x00\\x00\\x00\\xf3\\x51\\x00\\x01\\x00\\x00\\x00\\x01\\x16\\xcc\\x58\\x59\\x5a\\x20\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x63\\x75\\x72\\x76\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x02\\x33\\x00\\x00\\x63\\x75\\x72\\x76\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x02\\x33\\x00\\x00\\x63\\x75\\x72\\x76\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x02\\x33\\x00\\x00\\x58\\x59\\x5a\\x20\\x00\\x00\\x00\\x00\\x00\\x00\\x9c\\x18\\x00\\x00\\x4f\\xa5\\x00\\x00\\x04\\xfc\\x58\\x59\\x5a\\x20\\x00\\x00\\x00\\x00\\x00\\x00\\x34\\x8d\\x00\\x00\\xa0\\x2c\\x00\\x00\\x0f\\x95\\x58\\x59\\x5a\\x20\\x00\\x00\\x00\\x00\\x00\\x00\\x26\\x31\\x00\\x00\\x10\\x2f\\x00\\x00\\xbe\\x9c" > $ICCTMPFILE
362
+
363
+
364
+ #=====# DO THE ACTUAL CONVERSION #=====#
365
+ echo " Compressing PDF & embedding fonts..."
366
+ run gs $MSGOPTS \
367
+ -dBATCH -dNOPAUSE -dNOOUTERSAVE \
368
+ -dCompatibilityLevel=1.4 \
369
+ -dEmbedAllFonts=true -dSubsetFonts=true \
370
+ -dCompressFonts=true -dCompressPages=true \
371
+ -sColorConversionStrategy=RGB \
372
+ -dDownsampleMonoImages=false -dDownsampleGrayImages=false -dDownsampleColorImages=false \
373
+ -dAutoFilterColorImages=false -dAutoFilterGrayImages=false \
374
+ -sDEVICE=pdfwrite \
375
+ -sOutputFile="$TMPFILE" "$INPUT"
376
+ echo " Converting to PDF/A-1B..."
377
+ run gs $MSGOPTS \
378
+ -dPDFA=1 -dBATCH -dNOPAUSE -dNOOUTERSAVE \
379
+ $QUALITYOPTS \
380
+ -dCompatibilityLevel=1.4 -dPDFACompatibilityPolicy=1 \
381
+ -sProcessColorModel=DeviceRGB -sColorConversionStrategy=RGB \
382
+ -sOutputICCProfile=$ICCTMPFILE \
383
+ -sDEVICE=pdfwrite \
384
+ -sOutputFile="$OUTPUT" "$TMPFILE" $PSTMPFILE
385
+ echo " Removing temporary files..."
386
+ rm $TMPFILE
387
+ echo " Done, now ESSE3 is happy! ;)"
388
+
389
+
390
+ #=====# VALIDATE THE RESULT #=====#
391
+ if $VALIDATE; then
392
+ validate $VERAMSGOPTS "$OUTPUT"
393
+ else
394
+ echo " Suggestion: validate the resulting PDF to be sure it's PDF/A-1B compliant."
395
+ fi
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libis-format
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kris Dekeyser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-08 00:00:00.000000000 Z
11
+ date: 2023-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
166
  version: '2.1'
167
+ - !ruby/object:Gem::Dependency
168
+ name: pdfinfo
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.4'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.4'
167
181
  description: Collection of tools and classes that help to identify formats of binary
168
182
  files and create derivative copies (e.g. PDF from Word).
169
183
  email:
@@ -193,10 +207,10 @@ files:
193
207
  - bin/formatinfo
194
208
  - bin/libis_format
195
209
  - bin/pdf_copy
210
+ - data/AdobeRGB1998.icc
196
211
  - data/ISOcoated_v2_eci.icc
197
212
  - data/PDFA_def.ps
198
213
  - data/ead.xsd
199
- - data/eciRGB_v2.icc
200
214
  - data/lias_formats.xml
201
215
  - data/types.yml
202
216
  - data/xlink.xsd
@@ -299,6 +313,7 @@ files:
299
313
  - tools/fop/lib/xmlgraphics-commons-2.3.jar
300
314
  - tools/fop/lib/xmlgraphics-commons.LICENSE.txt
301
315
  - tools/fop/lib/xmlgraphics-commons.NOTICE.txt
316
+ - tools/pdf2pdfa
302
317
  - tools/pdfbox/pdfbox-app-2.0.13.jar
303
318
  - tools/pdfbox/preflight-app-2.0.13.jar
304
319
  homepage: ''
data/data/eciRGB_v2.icc DELETED
Binary file