module FlyingSaucer4R
Constants
- VERSION
Public Class Methods
create_pdf(xhtml, base_path, logger = nil)
click to toggle source
# File lib/flyingsaucer4r.rb, line 24 def self.create_pdf(xhtml, base_path, logger = nil) estimated_pdf_length = xhtml.length output = java.io.ByteArrayOutputStream.new(estimated_pdf_length) begin dom = create_java_dom(xhtml, logger) render_pdf(dom, base_path, output) ensure output.close end end
Private Class Methods
create_java_dom(s, logger)
click to toggle source
# File lib/flyingsaucer4r.rb, line 61 def self.create_java_dom(s, logger) begin builder = javax.xml.parsers.DocumentBuilderFactory.new_instance.new_document_builder builder.parse(java.io.ByteArrayInputStream.new(s.to_java_bytes)) rescue NativeException => e java_e = e.cause if java_e.is_a?(org.xml.sax.SAXParseException) context = provide_context(s, java_e.line_number) logger.info("Unable to parse XHTML at line #{java_e.line_number}, column #{java_e.column_number}: #{java_e.message}\n#{context}") if logger end raise e end end
path_to_url(path)
click to toggle source
# File lib/flyingsaucer4r.rb, line 87 def self.path_to_url(path) java.io.File.new(path).to_uri.to_url.to_string end
provide_context(doc, line_no)
click to toggle source
# File lib/flyingsaucer4r.rb, line 37 def self.provide_context(doc, line_no) mark_selected = line_no != -1 line_no = 1 if line_no == -1 result = doc.enum_for(:each_line).enum_for(:each_with_index).inject([]) do |memo, pair| line, current = pair current += 1 diff = line_no - current if diff.abs < 20 format_string = if line_no == current && mark_selected "==> %4d %s" else " %4d %s" end memo << sprintf(format_string, current, line) elsif current > line_no break memo end memo end result.join('') end
render_pdf(dom, base_path, output)
click to toggle source
# File lib/flyingsaucer4r.rb, line 75 def self.render_pdf(dom, base_path, output) renderer = org.xhtmlrenderer.pdf.ITextRenderer.new agent = UserAgent.new(renderer.output_device) agent.shared_context = renderer.shared_context renderer.shared_context.user_agent_callback = agent renderer.set_document(dom, path_to_url(base_path)) renderer.layout renderer.create_pdf(output) String.from_java_bytes(output.to_byte_array) end