infopark_rails_connector 6.8.0.515.34928522 → 6.8.0.518.30999728
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/config/locales/de.rails_connector.controllers.yml +0 -2
- data/config/locales/en.rails_connector.controllers.yml +0 -2
- data/config/routes.rb +0 -6
- data/lib/generators/rails_connector/install/templates/initializers/rails_connector.rb +0 -8
- data/lib/rails_connector/configuration.rb +1 -2
- metadata +8 -36
- data/app/controllers/pdf_controller.rb +0 -7
- data/app/controllers/rails_connector/default_pdf_controller.rb +0 -138
- data/app/controllers/rails_connector/pdf_external_controller.rb +0 -55
- data/app/views/pdf/index.html.erb +0 -7
- data/app/views/pdf/index.xsl +0 -1240
- data/lib/rails_connector/configuration/pdf_generator.rb +0 -18
- data/lib/rails_connector/fop.rb +0 -18
- data/lib/rails_connector/fop_on_rails.rb +0 -92
- data/lib/rails_connector/fop_on_rails/document.rb +0 -25
- data/lib/rails_connector/fop_on_rails/document/dom_tree.rb +0 -42
- data/lib/rails_connector/fop_on_rails/document/images.rb +0 -34
- data/lib/rails_connector/fop_on_rails/document/tables.rb +0 -67
@@ -1,18 +0,0 @@
|
|
1
|
-
module RailsConnector
|
2
|
-
# @api public
|
3
|
-
class Configuration
|
4
|
-
# @api public
|
5
|
-
module PdfGenerator
|
6
|
-
@@hosts = []
|
7
|
-
|
8
|
-
# @api public
|
9
|
-
def self.host_whitelist(*hosts)
|
10
|
-
@@hosts = hosts
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.host_allowed?(host)
|
14
|
-
@@hosts.include?(host)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/lib/rails_connector/fop.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module RailsConnector
|
2
|
-
module Fop
|
3
|
-
#
|
4
|
-
# Is raised if the PDF generation fails.
|
5
|
-
# The error message contains the Java error stack trace of the Apache FOP.
|
6
|
-
#
|
7
|
-
class GenerationFailed < RuntimeError; end
|
8
|
-
|
9
|
-
CMD = 'fop -xml "%s" -xsl "%s" -pdf "%s" 2>&1'
|
10
|
-
|
11
|
-
def self.generate_pdf(xml, xsl, pdf)
|
12
|
-
output = `#{CMD % [xml, xsl, pdf]}`
|
13
|
-
unless `file -pb "#{pdf}"`.include?('PDF')
|
14
|
-
raise GenerationFailed, output
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
module RailsConnector
|
2
|
-
#
|
3
|
-
# This module provides an interface for generating PDF files.
|
4
|
-
#
|
5
|
-
module FopOnRails
|
6
|
-
#
|
7
|
-
# Is raised if the response was not 200.
|
8
|
-
#
|
9
|
-
class DownloadError < RuntimeError; end
|
10
|
-
|
11
|
-
READ_TIMEOUT = 300
|
12
|
-
|
13
|
-
#
|
14
|
-
# Generates a PDF from <code>xml_location</code> and <code>xsl_location</code> and returns its
|
15
|
-
# path in the file system.
|
16
|
-
#
|
17
|
-
# If the file <code>xml_location</code> doesn't already exist, then <code>xml_location</code>
|
18
|
-
# and <code>xsl_location</code> are interpreted as URLs and will be downloaded before
|
19
|
-
# the PDF is generated.
|
20
|
-
#
|
21
|
-
# If the download of <code>xml_location</code> or <code>xsl_location</code> fails, then
|
22
|
-
# the {RailsConnector::FopOnRails::DownloadError} is raised.
|
23
|
-
#
|
24
|
-
# To generate a PDF, the given XML <b>must</b> be valid. If for some reasons it is not, then you can use the
|
25
|
-
# <code>tidy</code> option to repair it.
|
26
|
-
#
|
27
|
-
# If the PDF generation fails, then the {RailsConnector::Fop::GenerationFailed} error
|
28
|
-
# is raised.
|
29
|
-
#
|
30
|
-
# Example:
|
31
|
-
#
|
32
|
-
# RailsConnector::FopOnRails.generate_pdf('/tmp/test.xml', '/tmp/test.xsl')
|
33
|
-
# # This will generate a PDF and return its path
|
34
|
-
#
|
35
|
-
# RailsConnector::FopOnRails.generate_pdf('http://mywebsite.com/test.xml', 'http://mywebsite.com/test.xsl', true)
|
36
|
-
# # This will download both files, repair the XML, generate a PDF, and return its path
|
37
|
-
#
|
38
|
-
def self.generate_pdf(xml_location, xsl_location, tidy = false)
|
39
|
-
log("\nStarting PDF generation...")
|
40
|
-
|
41
|
-
w_dir = File.join(Rails.root, %w(tmp fop_on_rails), $$.to_s)
|
42
|
-
FileUtils.rm_rf(w_dir)
|
43
|
-
FileUtils.mkdir_p(w_dir)
|
44
|
-
|
45
|
-
pdf = "#{w_dir}/pdf"
|
46
|
-
|
47
|
-
if File.exist?(xml_location)
|
48
|
-
xml = xml_location
|
49
|
-
xsl = xsl_location
|
50
|
-
log("\trepairing XML")
|
51
|
-
FopOnRails::Document.repair(xml)
|
52
|
-
else
|
53
|
-
xml = "#{w_dir}/xml"
|
54
|
-
xsl = "#{w_dir}/xsl"
|
55
|
-
|
56
|
-
log("\tgetting XSL source from #{xsl_location}")
|
57
|
-
download(xml_location, xml)
|
58
|
-
log("\tgetting XML source from #{xml_location}")
|
59
|
-
download(xsl_location, xsl)
|
60
|
-
end
|
61
|
-
|
62
|
-
if tidy
|
63
|
-
log("\trepairing XML")
|
64
|
-
FopOnRails::Document.repair(xml, xml_location)
|
65
|
-
end
|
66
|
-
|
67
|
-
log("\tgenerating PDF\n\n")
|
68
|
-
Fop.generate_pdf(xml, xsl, pdf)
|
69
|
-
|
70
|
-
return pdf
|
71
|
-
end
|
72
|
-
|
73
|
-
private
|
74
|
-
|
75
|
-
def self.download(src, dest)
|
76
|
-
url = URI.parse(src)
|
77
|
-
http = Net::HTTP.new(url.host, url.port)
|
78
|
-
http.read_timeout = READ_TIMEOUT
|
79
|
-
resp = http.get(url.request_uri)
|
80
|
-
unless resp.kind_of?(Net::HTTPSuccess)
|
81
|
-
raise DownloadError, "Could not download #{src}"
|
82
|
-
end
|
83
|
-
File.open dest, 'w' do |f|
|
84
|
-
f.write resp.body
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def self.log(msg)
|
89
|
-
Rails.logger.info(msg)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'rails_connector/fop_on_rails/document/dom_tree'
|
2
|
-
require 'rails_connector/fop_on_rails/document/images'
|
3
|
-
require 'rails_connector/fop_on_rails/document/tables'
|
4
|
-
|
5
|
-
module RailsConnector
|
6
|
-
module FopOnRails
|
7
|
-
module Document
|
8
|
-
def self.repair(path, xml_uri = nil)
|
9
|
-
xml = DomTree.repair(File.read(path))
|
10
|
-
|
11
|
-
if xml_uri
|
12
|
-
Images.absolutize_src_attrs(xml, xml_uri)
|
13
|
-
else
|
14
|
-
Images.dump_images(xml)
|
15
|
-
end
|
16
|
-
|
17
|
-
Tables.repair(xml)
|
18
|
-
|
19
|
-
File.open(path, 'w') do |f|
|
20
|
-
f.write(xml.to_s)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'tidy'
|
2
|
-
require "rexml/document"
|
3
|
-
|
4
|
-
module RailsConnector
|
5
|
-
module FopOnRails
|
6
|
-
module Document
|
7
|
-
module DomTree
|
8
|
-
TIDY_CONF = {
|
9
|
-
'clean' => true,
|
10
|
-
'doctype' => 'omit',
|
11
|
-
'output-xhtml' => true,
|
12
|
-
'numeric-entities' => true,
|
13
|
-
'drop-font-tags' => true,
|
14
|
-
'enclose-block-text' => true,
|
15
|
-
'char-encoding' => 'utf8'
|
16
|
-
}
|
17
|
-
|
18
|
-
def self.repair(data)
|
19
|
-
xml = REXML::Document.new(tidy(data))
|
20
|
-
clean_namespace(xml)
|
21
|
-
return xml
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def self.tidy(data)
|
27
|
-
%w(dylib so).each do |ext|
|
28
|
-
if File.exist?(path = "/usr/lib/libtidy.#{ext}")
|
29
|
-
Tidy.path = path
|
30
|
-
break
|
31
|
-
end
|
32
|
-
end
|
33
|
-
Tidy.open(TIDY_CONF) { |tidy| tidy.clean(data) }
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.clean_namespace(xml)
|
37
|
-
xml.root.delete_namespace
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module RailsConnector
|
2
|
-
module FopOnRails
|
3
|
-
module Document
|
4
|
-
module Images
|
5
|
-
def self.absolutize_src_attrs(xml, url)
|
6
|
-
@url = URI.parse(url)
|
7
|
-
xml.elements.each('//img') do |img|
|
8
|
-
url = URI.parse(img.attributes['src'])
|
9
|
-
unless (url.host == @url.host)
|
10
|
-
url = @url.merge(url)
|
11
|
-
end
|
12
|
-
img.attributes['src'] = url.to_s
|
13
|
-
end
|
14
|
-
xml
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.dump_images(xml)
|
18
|
-
xml.elements.each('//img') do |img|
|
19
|
-
unless URI.parse(src = img.attributes['src']).absolute?
|
20
|
-
if relative_url_root = ActionController::Base.config.relative_url_root
|
21
|
-
src.sub!(/\A#{relative_url_root}/i, '')
|
22
|
-
end
|
23
|
-
params = Rails.application.routes.recognize_path(src)
|
24
|
-
if params[:controller] == 'rails_connector/cms_dispatch' and params[:id]
|
25
|
-
img.attributes['src'] = Obj.find(params[:id]).body_data_path
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
xml
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module RailsConnector
|
2
|
-
module FopOnRails
|
3
|
-
module Document
|
4
|
-
module Tables
|
5
|
-
def self.repair(xml)
|
6
|
-
xml.elements.each '//table' do |table|
|
7
|
-
add_missing_cols(table)
|
8
|
-
add_col_metadata(table)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def self.add_missing_cols(table)
|
15
|
-
@@max = 0
|
16
|
-
trs = table.get_elements('./tr | ./tbody/tr | ./thead/tr | ./tfoot/tr')
|
17
|
-
trs.each do |tr|
|
18
|
-
n = 0
|
19
|
-
tr.each_element('./td | ./th') do |elem|
|
20
|
-
colspan = elem.attributes['colspan'].to_i
|
21
|
-
if colspan > 0
|
22
|
-
n += colspan
|
23
|
-
else
|
24
|
-
n += 1
|
25
|
-
elem.delete_attribute 'colspan'
|
26
|
-
end
|
27
|
-
end
|
28
|
-
@@max = n if n > @@max
|
29
|
-
end
|
30
|
-
trs.each do |tr|
|
31
|
-
n = @@max - tr.get_elements('./td | ./th').size
|
32
|
-
tr.each_element('./td | ./th') do |elem|
|
33
|
-
colspan = elem.attributes['colspan'].to_i
|
34
|
-
n -= colspan if colspan > 0
|
35
|
-
end
|
36
|
-
n.times do
|
37
|
-
tr.add_element 'td'
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.add_col_metadata(table)
|
43
|
-
default_width = 480
|
44
|
-
cols = table.get_elements('./col | ./colgroup/col')
|
45
|
-
vals, total, not_nulls = [], 0, 0
|
46
|
-
[@@max, cols.size].min.times do |i|
|
47
|
-
width = cols[i].attributes['width'].to_i
|
48
|
-
if width > 0
|
49
|
-
vals[i] = width
|
50
|
-
not_nulls += 1
|
51
|
-
end
|
52
|
-
total += width
|
53
|
-
end
|
54
|
-
total = default_width unless total > 0
|
55
|
-
@@max.times do |i|
|
56
|
-
if val = vals[i]
|
57
|
-
vals[i] = (val * default_width * not_nulls) / (total * @@max)
|
58
|
-
else
|
59
|
-
vals[i] = default_width / @@max
|
60
|
-
end
|
61
|
-
end
|
62
|
-
table.attributes['cols'] = vals * "\s"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|