ruby 1.9.3 および itext 4.2.0 で rjb を使用する場合:
私がやろうとしているのは、tiffファイルをpdfにマージすることです。ただし、tiff から pdf への変換をファイルに保存してから、ファイルに対して結合を実行するのではなく、マージをメモリ内で実行したいと考えています。PdfReader にファイル名を指定するのではなく、バイト配列を入力として受け取ることもできるという例をいくつか見てきました。ファイル バージョンを動作させることはできますが、ByteArrayOutStream を使用するとエラーが発生し、その理由がわかりません。
ファイルストリームを使用すると、次のようにうまく動作するようです。
def tiff_to_pdf_by_file(image_file_name)
@document = Rjb::import('com.lowagie.text.Document')
@tifreader = Rjb::import('com.lowagie.text.pdf.codec.TiffImage')
@randomaccess = Rjb::import('com.lowagie.text.pdf.RandomAccessFileOrArray')
@pdfwriter = Rjb::import('com.lowagie.text.pdf.PdfWriter')
@filestream = Rjb::import('java.io.FileOutputStream')
pdf = @document.new
@pdfwriter.getInstance(pdf, @filestream.new('test_temp.pdf'))
pdf.open()
ra = @randomaccess.new(image_file_name)
pages = @tifreader.getNumberOfPages(ra)
(1..pages).each do |i|
image = @tifreader.getTiffImage(ra,i)
scaler = ((pdf.getPageSize().getWidth() - pdf.leftMargin() - pdf.rightMargin()) / image.getWidth() * 100)
image.scalePercent(scaler)
pdf.add(image)
end
pdf.close()
return 'test_temp.pdf'
end
@pdfreader = Rjb::import('com.lowagie.text.pdf.PdfReader')
@pdfcopyfields = Rjb::import('com.lowagie.text.pdf.PdfCopyFields')
@filestream = Rjb::import('java.io.FileOutputStream')
filestream = @filestream.new('new_combined_pdf.pdf')
copy = @pdfcopyfields.new(filestream)
copy.addDocument(@pdfreader.new(tiff_to_pdf_by_file('test_image.tif')))
copy.addDocument(@pdfreader.new('test_template.pdf))
copy.close()
しかし、以下のコードのようなバイト配列を使用しようとすると、pdfreader がバイト配列を読み取る行に「ファイルまたはリソースとして見つかりません」というエラーが表示されます。
def tiff_to_pdf_by_file(image_file_name)
@document = Rjb::import('com.lowagie.text.Document')
@tifreader = Rjb::import('com.lowagie.text.pdf.codec.TiffImage')
@randomaccess = Rjb::import('com.lowagie.text.pdf.RandomAccessFileOrArray')
@pdfwriter = Rjb::import('com.lowagie.text.pdf.PdfWriter')
@bytestream = Rjb::import('java.io.ByteArrayOutputStream')
pdf = @document.new
outstream = @bytestream.new
@pdfwriter.getInstance(pdf, outstream)
pdf.open()
ra = @randomaccess.new(image_file_name)
pages = @tifreader.getNumberOfPages(ra)
(1..pages).each do |i|
image = @tifreader.getTiffImage(ra,i)
scaler = ((pdf.getPageSize().getWidth() - pdf.leftMargin() - pdf.rightMargin()) / image.getWidth() * 100)
image.scalePercent(scaler)
pdf.add(image)
end
pdf.close()
outstream.flush()
return outstream.toByteArray()
end
@pdfreader = Rjb::import('com.lowagie.text.pdf.PdfReader')
@pdfcopyfields = Rjb::import('com.lowagie.text.pdf.PdfCopyFields')
@filestream = Rjb::import('java.io.FileOutputStream')
filestream = @filestream.new('new_combined_pdf.pdf')
copy = @pdfcopyfields.new(filestream)
copy.addDocument(@pdfreader.new(tiff_to_pdf_by_file('test_image.tif')))
copy.addDocument(@pdfreader.new('test_template.pdf))
copy.close()