如果 java 程序是一个库,可以用 RJB 去调用 java 里面的方法,速度比 命令行快得多。
缺点是可能影响多线程。例如以下程序。
require "rjb"
Rjb::load(File.join(File.dirname(__FILE__), '..', '..', '..', 'ext', 'iText-2.1.4.jar'), ['-Djava.awt.headless=true'])
def self.itext_merge(filenames, output)
class_pdfreader = Rjb::import('com.lowagie.text.pdf.PdfReader')
class_pdfcopyfields = Rjb::import('com.lowagie.text.pdf.PdfCopyFields')
class_filestream = Rjb::import('java.io.FileOutputStream')
filestream = class_filestream.new(output)
copy = class_pdfcopyfields.new(filestream)
failure_list = []
filenames.each do |f|
# remove double quote
if match = /"(.*)"/.match(f)
f = match[1]
end
if File.exists?(f)
begin
copy.addDocument(class_pdfreader.new(f))
rescue => e
failure_list << f
Rails.logger.info "PdfMerger: Invalid PDF: #{f}"
end
else
failure_list << f
Rails.logger.info "PdfMerger: File does not exist: #{f}"
end
end
copy.close()
# pages = class_pdfreader.new(output).getNumberOfPages
Rails.logger.info "failed pdf: #{failure_list}" if failure_list.present?
return failure_list.empty?
rescue Exception => e
Rails.logger.info "itext_merge failure: #{e.message}"
return false
end