So let’s say you have some random PDFs and what you want is one PDF that includes all of the original PDF files and a table of contents listing all of the files and the proper page numbers. Well in Ruby it is not too hard to put this together. There are a wealth of plugins, gems, and other ruby software available for manipulating and creating PDFs (a thorough list can be found here – ). To get this project up and running we are going to use two PDF::Writer () and PDFTK () – though if you want to get fancier and also include text, html, or xml documents you can use PDF::Htmldoc () which requires Htmldoc to be installed. Before I do get started though, I also have give thanks to George Anderson over at who wrote a lot of similar code on the project which provided me with some great examples.
Blog
Merging Adobe PDF’s and generating a table of contents on the fly using ruby
July 21st, 2008 by Joseph JakutaAdvanced Model Based searches in rails
July 21st, 2008 by Scott DavisAfter watching a on advanced searching I thought I would give it a try. So I came up with a slightly modified version that would handle my search.
Model
class ExportSearch def timecards find_cards end def users(u) @u = u end def projects(p) @p = p end def tasks(t) @t = t end def dates(date1, date2) @d1 = date1 @d2 = date2 end def clients(c) @c = c end private def find_cards TimeCard.find(:all, :conditions => conditions, :include => {:task => :project}, :order => :date) end def projects_conditions ["tasks.project_id IN (?)", @p] unless @p.blank? end def client_conditions ["projects.client_id IN (?)", @c] unless @c.blank? end def date_conditions ["date BETWEEN ? AND ?", @d1, @d2] unless (@d1.blank? || @d2.blank?) end def task_conditions ["task_id IN (?)", @t] unless @t.blank? end def users_conditions ["user_id IN (?)", @u] unless @u.blank? end def conditions [conditions_clauses.join(' AND '), *conditions_options] end def conditions_clauses conditions_parts.map { |condition| condition.first } end def conditions_options conditions_parts.map { |condition| condition[1..-1] }.flatten end def conditions_parts private_methods(false).grep(/_conditions$/).map { |m| send(m) }.compact end end
Controller
search = ExportSearch.new search.users(params[:export][:users].join(',')) unless params[:export][:users].blank? search.tasks(params[:export][:tasks].join(',')) unless params[:export][:tasks].blank? search.projects(params[:export][:projects].join(',')) unless params[:export][:projects].blank? search.dates(start_date, end_date) @time_cards = search.timecards
Creating Your First Custom SkinnableComponent in Flex 4
July 19th, 2008 by Greg JastrabIt took me a couple of days to get to my next Flex 4 example, but here we finally are. I wanted to try making a component which had optional SkinParts, so I came up with the following example (get the source). For those who don’t know, Flex 4 targets so you’ll need that in order to run the SWF.
In this example we will build a component called QuestionAndAnswer which will include a text field containing a question, a check box, and a text field containing an answer to the question. The check box and answer are both optional, so if the Skin file doesn’t include those , they won’t be a part of the view. If they are included, then clicking the check box will show the text field containing the answer. Let’s see what the code looks like.
Creating a Custom Layout Class in Flex 4
July 16th, 2008 by Greg JastrabSo apparently I’m giving a week long series on getting started with Flex 4. I would have titled my content as such, but I guess I wasn’t sure if I would have learned enough to provide a week’s worth of content. Let’s give it a shot anyway.
As I briefly touched upon in yesterday’s post, layout is handled in new layout classes in Flex 4. Let’s dive in to making a simple, custom layout manager.
Skinning A Button in Flex 4 Using FXG
July 16th, 2008 by Greg JastrabIn yesterday’s post I walked through how I got the Flex 4 SDK setup, compiled, and ran the first Hello World application in Flex 4. I said I would follow up today with skinning a Button using the new declarative graphics tags known as FXG (previously referred to as MXML-G), so here we are.
Today I want to explore using the new layout property as well as using a to describe how the button should look. Let’s get started…
Compiling Your First Flex 4 Application
July 15th, 2008 by Greg JastrabBig news today in the world of Flex! The first push of the was made this afternoon (and another push was made this evening). Additionally, a lot of was added to the Adobe Open Source site regarding (code-named “Gumbo”). Reading through the will leave you with a great handle around where things stand and the current direction Flex is headed.
To reward myself for reading through all of those docs this evening, I decided it would be appropriate to try to test out the new code and make my first Flex 4 application…
Losing Data When Drag and Dropping Custom Classes in Flex?
July 11th, 2008 by Greg JastrabOne of our developers recently encountered some strange behavior when he was dragging a piece of data (which was a custom class) from a TileList and dropping it into a List, but losing some pieces of the dragged data when it was dropped into the List. I discovered the root of the issue by delving into the source for the dragDropHandler function within ListBase…
Merging a :has_many relationship into one instance
July 10th, 2008 by Joseph JakutaSo the problem is that I have an ActiveRecord model that has a :has_many relationship to another model (we’ll call this one object), but when I am in the view context I didn’t want to have to loop through the object each time to determine which data was being displayed. Object has many attributes (approximately 30) and many are often null for a given instance. So I decided to add a method to my model to loop through all of objects and determine which data should be included. Pretty much the rule was that if there was no data for a particular attribute temporarily save it to a copy of the object and then return that. This is what I came up with.
def object tmp = objects.first objects.each {|o| tmp.attributes.each {|key, value| tmp[key] = o[key] if value.blank? && key != 'id'}} tmp.freeze end
However there was a flaw here. Every time I would view the page all of the data in the objects was getting overwritten with one copy of it. After banging my head on the desk it was realized that tmp[key] = o[key] was actually writing the changes to the database permanently rewriting all of the objects (which still seems counter intuitive to me, because it seems like only the first record should have been the one changing). But the solution was pretty simple. The working method is as follows.
def object tmp = Object.new objects.each {|o| tmp.attributes.each {|key, value| tmp[key] = o[key] if value.blank? && key != 'id'}} tmp.freeze end
Reading and replacing text in Word DocX and Excel XlsX documents using Ruby
July 9th, 2008 by Joseph JakutaSo as you may know. The new Word and Excel formats are similar to open office document formats in that they are just zips of multiple xml documents (well mostly xml documents). So what we wanted to do for our project (the WebDav one mentioned in my last post) is to set up a simple templating system that would do variable replacement in Word/Excel documents. And it turned out to be a piece of cake. I am just going to go through the DocX version of template model, but the only difference between them is the folder structure so there is not too much to change to get this working for both.
-
You are currently browsing the SmartLogic Solutions Blog blog archives for July, 2008.