Importing multiple pdf pages and documents into PDFlib - Part 2
This is a followup to my first post about importing multiple pages into PDFlib .
I have created a class that will allow you to import multi page PDF’s as well as importing multiple PDF documents into one generated PDF. It will also fill all of your PDFlib text blocks with the data you provide:
Please post any questions or comments about it.
Here’s the class on pastie: http://pastie.caboo.se/14052
Here’s the code:
class PdfDocsController < ApplicationController
def generate_pdf
@settings=Hash.new
@settings[‘checkbox_type’] = “8″ @settings[‘circlebox_type’] = “O”
circle_type = “”
@default_width = 612
@default_height = 792
@default_value = “n/a”
@data = Hash.new(@default_value)
@settings[“checkbox_type”] = “8″ @settings[“circle_type”] = “O”
@data[“male”] = @settings[“checkbox_type”]
@data[“name”] = “Nate Constant”
@data[“address”] = “1234 some street”
@data[“city”] = “Denver”
@data[“state”] = “Colorado”
send_data fill_app, :filename => “pdf_document.pdf”, :type => “application/pdf”,:disposition => “inline”
end
private
def fill_app
searchpath = “#{RAILS_ROOT}/my_pdfs”
p = PDFlib.new
if (p.begin_document(“”, “compatibility = 1.6″) == -1)
logger.info “Error: “ + p.get_errmsg()
end
p.set_parameter(“SearchPath”, searchpath)
p.set_parameter(“pdiwarning”, “true”)
p.set_info(“Creator”, “businesscard.rb”)
p.set_info(“Author”, “Your Name”)
p.set_info(“Title”, “The title of your PDF”)
import_file(p,“answer_pleading.pdf”)
p.end_document(“”)
p.get_buffer()
end
def import_file(p,filename)
blockcontainer = p.open_pdi(filename, “”, 0)
if (blockcontainer == -1)
logger.info “Error: “ + p.get_errmsg()
end
regularfont = p.load_font(“Helvetica”, “winansi”, “”)
checkbox_font = p.load_font(“ZapfDingbats”,“builtin”,“”)
number_of_pages = p.get_pdi_value(“/Root/Pages/Count”,blockcontainer,-1,0)
1.upto(number_of_pages){|page_num|
page = p.open_pdi_page(blockcontainer, page_num, “”)
if (page == -1)
logger.info “Error: “ + p.get_errmsg()
end
num_of_blocks_on_page = p.get_pdi_value(“vdp/blockcount”,blockcontainer,page,0)
cur_blocks = Array.new
0.upto(num_of_blocks_on_page-1){ |i|
cur_blocks.push( p.get_pdi_parameter(“vdp/Blocks[#{i}]/Name”, blockcontainer, page, 0))
}
width = p.get_pdi_value(“width”,blockcontainer,page,0)
height = p.get_pdi_value(“height”,blockcontainer,page,0)
p.begin_page_ext(@default_width, @default_height, “topdown”)
orient = width>height ? “orientate west” : “”
p.fit_pdi_page(page, 0, @default_height, “#{orient}“)
cur_blocks.each { |key, value|
use_font = p.get_pdi_parameter(“vdp/Blocks/#{key}/fontname”, blockcontainer, page, 0)
if use_font == “ZapfDingbats” font_string = “font #{checkbox_font.to_s} embedding encoding=builtin”
@data[key] = “” if @data[key] == @default_value
else
font_string =“font #{regularfont.to_s} embedding encoding=winansi”
end
if (p.fill_textblock(page, key, @data[key].to_s,font_string) == -1)
logger.info “Warning: “ + p.get_errmsg
end
}
p.end_page_ext(“”)
p.close_pdi_page(page)
} p.close_pdi(blockcontainer)
end
end
Update: Tony Buser has modified this code by making it into a hash object. View it here
No comments
Jump to comment form | comments rss [?] | trackback uri [?]