After a bit of experimentation my conclusion is that there's no direct way to add a particle system to a text object, or to use it for boolean operations.
However, you can make your life easier by using a single button to create and update a mesh version of your text, using the script below.

I tried making the mesh updates automatic by running the update function in the scene update event handlers, but this proved to be a bad idea, and caused memory usage to increase continuously every second.
The script will add a "Text" tab in the tools panel, where you have a button called "Update text mesh".
Pressing the button will generate a mesh version of your text, or update an existing one to any changes you made to your text object. It will also hide the text object so as to make it a bit easier to work. To update anything, just unhide the text object, make your changes, then press the button again.
To make things simple, the script assumes your text object's name is "Text". No other name will work, and if no such object appears, you will not even see the "Text" tab in the tools panel.
Copy and paste this to a text editor and press "Run Script", or install as an addon for more permanent usage.
bl_info = {
"name" : "Update text to mesh",
"blender" : (2, 75, 0),
"version" : (0, 0, 0, 1),
"location" : "3D View > Toolbox",
"description" : "Update mesh copy of text object",
"category" : "Object"
}
import bpy
class update_text_mesh( bpy.types.Operator ):
bl_idname = 'object.update_text_mesh'
bl_label = 'Update text mesh'
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll( self, context ): return 'Text' in context.scene.objects
def generate_text_mesh( self, context ):
if 'TextMesh' not in context.scene.objects:
m = bpy.data.meshes.new_from_object(
context.scene, context.scene.objects['Text'], True, 'RENDER', True, True
)
o = bpy.data.objects.new( 'TextMesh', m )
context.scene.objects.link( o )
def execute( self, context ):
o = context.scene.objects['TextMesh']
t = context.scene.objects['Text']
t.hide = True
o.location = t.location
o.data = t.to_mesh( context.scene, True, 'RENDER', True, True )
return {'FINISHED'}
class UpdateTextPanel( bpy.types.Panel ):
bl_idname = "UpdateTextPanel"
bl_label = "Text to Mesh Updater"
bl_category = "Text"
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
@classmethod
def poll( self, context ): return 'Text' in context.scene.objects
def draw( self, context):
layout = self.layout
col = layout.column()
col.operator(
'object.update_text_mesh',
text = 'Update text mesh'
)
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()
EDITED: added a version that updates the mesh automatically with every frame change. Also requires the text object to be named "Text", but otherwise requires nothing else. Copy this script to the text editor and press "Run Script" to activate.
import bpy
def update_text( scene ):
if 'TextMesh' not in scene.objects:
m = bpy.data.meshes.new_from_object(
scene, scene.objects['Text'], True, 'RENDER', True, True
)
o = bpy.data.objects.new( 'TextMesh', m )
scene.objects.link( o )
o = scene.objects['TextMesh']
t = scene.objects['Text']
t.hide = True
o.location = t.location
o.data = t.to_mesh( scene, True, 'RENDER', True, True )
bpy.app.handlers.frame_change_pre.append( update_text )