The Linux kernel mostly supports any printer that you can plug into a serial or parallel port, but there are things to look out for, and printers that you won't be able to use, even though they can (electrically speaking) communicate with Linux. Primary among these incompatible printers are those that rely on the "Windows Printing System". (They're often vaguely labelled "for Windows", or called "GDI" printers.) These printers do not work with Linux. They haven't any "smarts" at all, and rely on the computer CPU to do most of the work that has been traditionally done by the printer's CPU. Unfortunately, this work can only be done by the vendor-supplied drivers, which only run under Windows. So don't buy one to use with Linux. (Note that if you already have one, there are roundabout ways to get Linux to print to one, but they're rather awkward and I've never tried it myself. See Section 12 of this document for more discussion of Windows-only printers.)
As for what printers do work with Linux, the best choice is to buy a printer with native PostScript support. Nearly all Unix software that produces printable output produces it in PostScript, so obviously it'd be nice to get a printer that supports PostScript directly. Unfortunately, PostScript support is scarce outside the laser printer domain, and is sometimes a costly add-on.
Unix software, and the publishing industry in general, have standardized upon Postscript as the printer control language of choice. This happened for several reasons:
Postscript arrived as part of the Apple Laserwriter, a perfect companion to the Macintosh and the printer largely responsible for the desktop publishing revolution of the 80s.
Postscript programs can be run to generate output on a pixel screen, a vector screen, a fax machine, or almost any sort of printer mechanism, without the original program needing to be changes. Postscript output will look the same on any postscript device, at least within the limits provided by the printer's capabilities. Before the creation of PDF, people exchanged complex documents online as Postscript files. The only reason this standard didn't "stick" was because Windows machines didn't usually include a Postscript previewer, so Adobe specified hyperlinks and compression for Postscript, called the result PDF, distributed previewers for it, and invented a market for their "distiller" tools. But I digress...
Postscript is a complete programming language; you can write software to do most anything in it. This is mostly useful for defining subroutines at the start of your program to reproduce complex things over and over throughout your document, like a logo or a big "DRAFT" in the background.
Postscript is fully specified in a publically available series of books (which you can find at any good bookstore). Although Adobe invented it and provides the dominant commercial implementation, other vendors like Aladdin produce independantly coded implementations as well.
Failing the (larger) budget necessary to buy a PostScript printer, you can use any printer supported by Ghostscript, the free PostScript interpreter used in lieu of actual printer PostScript support. The Ghostscript Home Page has a list of supported printers and information on the status of new and experimental drivers. Note that this page lists supported printers in the latest version of Ghostscript, while most Linux distributions can only ship a somewhat outdated version of Ghostscript due to the license. Fortunately, there is usually a prepackaged up to date Ghostscript made available in each distribution's contrib area. Please help improve the Ghostscript printer support page by reporting your successes and failures as it asks.
Adobe now has a new printer language called "PrintGear". I think it's a greatly simplified binary format language with some PostScript heritage but no PostScript compatibility. And I haven't heard of Ghostscript supporting it. But some PrintGear printers seem to support another language like PCL, and these printers will work with Linux.
This section is and will always be incomplete. But whatever information I do put here should always be correct, so here goes:
Canon makes an assortment of inkjet printers.
One report suggests that the this Canon works much better in Epson LQ mode (as set by a dip switch). Apparently output was intermittent or wrong in Canon mode. OTOH, there is much explicit Canon support in Ghostscript, so this might have been a fluke.
The 200 and 210 work in black and white mode. See Patrick Lambert's page for more information.
Lexmark (once part of IBM, I think) makes many printers; many of them, however, are Windows-only printers:
All sorts of things like alignment, cartridge loading, and so on are done under (Windows) software control. However, Lexmark has provided a Unix C program to perform these things under Linux. It is available from my download area. Thanks to Dale Snider for pestering Lexmark and obtaining this program.
Various models of the Epson Stylus Color are well supported by Ghostscript 5.x's Uniprint driver scheme. See Michael Holve's page for more information.
NEC's series of low-cost laser printers provides both PCL and PrintGear support and are generally attractive printers. Unfortunately, in many of these models, the PCL support is for PCL level 4.5, which allows printing at only 300dpi. PCL levels 5e, 6, and above do allow for 600dpi output.
Most HP DeskJets work, but there are various flavors of them. Most are PCL level 3 printers; there is an hpdj driver for them (and any other PCL 3 printers) by Martin Lottermoser. The 710, 720C, 722C, 820C, and 1000C are PPA printers, which can be used in black and white with Tom Norman's pbm2ppa utility.
Most Laserjets work fine, as well. The Postscript option is ideal, but failing that Ghostscript's PCL support will work as well.
HP's JetDirect-equipped printers (ie, ethernet printers) can be administered using HP's WebJet software, which is available for Linux.