Many of the parts for a complete printing system do not exist yet. Projects are underway to address most of these, although most have not yet produced running useful code, and efforts to standardize the necessary protocols and APIs are in their infancy.
There's a general problem with getting all the parts to talk to one another; especially in a spooler-independent way. This problem manifests itself most noticeably in the pathetic application support for control over all the "usual" printing features. There is simply no way for an application writer to get information about printers, jobs, etc; no standardized way to submit jobs; no good way to get job status back; nor even really a standardized way to generate print data (although most of the new desktop systems offer desktop-specific facilities for doing this).
Font handling on free systems is rather awkward. The display, the printer, the application, and the data files should ideally all have access to the same fonts. Unfortunately this was simply not the case. With the advent of xft2 and fontconfig - which the newest distributions will start deploying - this should finally be solved. Redhat 8.0 is AFAIK the first distro that uses xft2.
There is still some work to be done on free software drivers. Although the drivers have improved a lot the last several years, not all printers are supported.
Printer vendors have a major role to play in this area. With the increasing popularity of Linux it is getting really hard for them to simple ignore this userbase.