CUPS 支持的印表機

From ArchWiki

Jump to: navigation, search


i18n
English
Рolski
正體中文
Русский
Image:Tango-preferences-desktop-locale.png This page was marked to be translated.
If you understand both "original" and "target" languages of this page, please help complete the translation.

Contents

導言

CUPS 是什么?

它是當前Unix-Like系統下最流行,最具易用性的底層基礎打印系統,適用於所有印表機。CUPS的出現極大的緩解了Unix-Like系統下打印的老大難問題。

It is based on the "Internet Printing Protocol" and provides complete printing services to most Postscript and raster printers. CUPS is provided under the GNU GPL..." Although there are other printing packages such as LPRNG, CUPS is quite popular and relatively easy to use. It is the default printing system on Arch Linux as well as many other Linux distributions.

Troubleshooting CUPS & components

The best way to get printing working is to set 'LogLevel' in '/etc/cups/cupsd.conf' to:

LogLevel debug2

And then viewing the output from '/var/log/cups/error_log' like this:

tail -n 100 -f /var/log/cups/error_log

The characters at the left of the output stands for:

D = Debug
E = Error
I = Information
etc...

These files may also prove useful.

/var/log/cups/page_log 'spits out a new entry each time a print is successful.'
/var/log/cups/access_log 'lists all cupsd http1.1 server activity'

Of course it's important to know how CUPS work if you want to solve your problems, this is somewhat correct:

  1. An application sends a .ps file(PostScript, a script language that details how the page will look) to CUPS when you select 'print'(99% of apps do).
  2. CUPS then looks at your printers PPD file(printer description file) and figures out what filters it needs to use to convert the .ps file to a language that the printer understands(like PJL,PCL). Usually it needs ghostscript.
  3. GhostScript takes the input and figures out which filters it should use,then applies them and converts the .ps file to a format understood by the printer.
  4. Then it is sent to the backend. For example, if you have your printer connected to a USB port, it uses the USB backend.

Print a document and watch 'error_log' to get a more detailed and correct image of the printing process.

Installing CUPS

Packages

You will need CUPS and Ghostscript for sure:

# pacman -S cups ghostscript gsfonts
  • cups - The actual CUPS software
  • ghostscript - An interpreter for the Postscript language
  • gsfonts - Ghostscript standard Type1 fonts


Some of the following driver packages, it depends on the printer you own. If unsure, install gutenprint.

  • gutenprint - A collection of high quality drivers for Canon, Epson, Lexmark, Sony, Olympus, and PCL printers for use with Ghostscript, CUPS, Foomatic, and the Gimp.
  • foomatic, foomatic-db, foomatic-db-engine, foomatic-db-ppd and foomatic-filters - Foomatic is a database-driven system for integrating free software printer drivers with common spoolers under Unix
  • Installing foomatic-filters should solve your problems if the cups error.log is reporting "stopped with status 22!"
  • hplip - HP Linux inkjet driver. Provides support for DeskJet, OfficeJet, Photosmart, Business Inkjet and some LaserJet printer models.
  • cups-pdf - A nice package that allows one to setup a virtual PDF Printer that generates a PDF out of anything sent to it.


If your system is connected to a networked printer using the samba protocol or if the system is to be a print server for Windows clients:

# pacman -S samba

為內核加載印表機模組

連接好印表機機,並打開電源,隨後:

USB 接口印表機

# modprobe usblp                      (2.6.x 內核)
# modprobe printer                    (2.4.x 內核)
# tail /var/log/messages.log          (看看安裝成功了沒有)

並口印表機

# modprobe lp parport parport_pc      (2.6.x 內核)
# modprobe parport parport_pc         (2.4.x 內核)
# tail /var/log/messages.log          (看看安裝成功了沒有)

將這些模組加入/etc/rc.conf中的MODULES中去,以便開機時自動加載。

啟動 CUPS

# /etc/rc.d/cups start

可將cups加入/etc/rc.conf中的DAEMONS中去,以便開機時自動加載.

這個時候,就可以用CUPS在控制檯下做一些簡單的打印了,如:

$ cat ~/.xinitrc > /dev/usb/lp0      (USB接口印表機)

當然僅僅依靠CUPS打印,如果在X下,肯定是不方便的。主要是因為缺少驅動,Linux下的打印驅動是PPD文件。

打印驅動: Foomatic

Foomatic是一個數據庫驅動的打印系統,它將Unix下的通用後臺打印系統與開源的印表機驅動整合在一起。 衹要有任一在開源驅動下能夠正常工作的印表機,它就能支持了。它支持CUPS, LPRng, LPD, GNUlpr, Solaris LP, PPR, PDQ, CPS 這些底層的打印系統,也能直接打印(既是驅動也是打印工具)。 Foomatic打印速度快,打印質量也挺不錯。不過缺點是,有個別的印表機可能沒有PPD文件驅動。

# pacman -S foomatic-***

Foomatic包含五個安裝包: foomatic-filters (幫助後臺打印系統將PostScript轉成印表機語言), foomatic-db (foomatic-db-engine生成PPD文件時要用到的一切資料), foomatic-db-PPD (已經獲支持的打印驅動) foomatic-db-engine (將 Foomatic XMLo數據庫中的數據生成PPD文件), foomatic-db-hpijs (專為HP打印驅動生成Foomatic XML 數據)。

一般來說,安裝前四個包就可以了。如果沒有惠普印表機,就不必安裝foomatic-db-hpijs了。

打印驅動:hplip

惠普DeskJet, OfficeJet, Photosmart, Business Inkjet 和一些 LaserJet 印表機型號,需要安裝hplip。只用於惠普印表機。 也可同時安裝上面的Foomatic,對比一下兩者的打印速度。

# pacman -S hplip

打印驅動:Gutenprint

也許以上的打印驅動仍然不行(不過安裝foomatic一定是必要的,能提高打印速度)。在配置CUPS時(即將講到) 沒有找到自己的印表機型號。那麼可能還需要接著安裝Gutenprint。 Gutenprint 是GIMP的打印擴充功能模塊,過去叫"gimp-print",它能夠為GIMP提供流行的打印驅動,能 讓佳能、愛普生、惠普、利盟、索尼、奧林巴斯,以及其他基於PCL技術的印表機,打印出更出色的品質。用於高品質的圖像打印是在好不過了。 它支持的印表機型號列表可見於:http://gutenprint.sourceforge.net/p_Supported_Printers.php3 不過Gutenprint的打印品質是沒得說,但速度就不敢恭維了。但有foomatic的支持就會快很多。

# pacman -S gutenprint

在 X 下配置 CUPS

打印基礎系統CUPS和打印驅動安裝好的,就要開始配置印表機了。 可以通過配置CUPS來配置印表機。配置CUPS的方法適用於一切印表機及其驅動。因此推薦使用。 進入X,打開一個網絡瀏覽器,訪問: http://localhost:631 (也可以用在/etc/hosts中設置好的hostname來代替localhost) 按照提示,一步一步的配置好印表機: Manage Printers ---> Add Printer ---> root密碼驗證 ---> 輸入印表機名稱 ---> 選擇設備類型 (印表機型號及其接口:USB接口 or 並口印表機) ---> 選擇你的印表機 ---> 通過印表機型號來選擇適當的印表機驅動,並Add (如果打印驅動的名稱中出現了foomatic字樣,一定要優先選擇) ---> 打印選項的設置 ---> 完成

也可以使用另外的配置界面,不過可能要另外安裝:

tupac -S gnome-cups-manager     (Gnome下)
tupac -S gtklp                  (KDE下)


Printer Sharing

Linux to Linux

Once you have CUPS setup on your Linux print server, sharing the printer with another Linux box is relatively easy. There are several ways to configure such a scenario, here we will describe the manual setup. On the server computer (the one managing and connecting to the printer) simply open up the /etc/cups/cupsd.conf file and allow access to the server by modifying the location lines. For instance:

<Location />
  Order Deny,Allow
  Deny From All
  Allow From 127.0.0.1
  Allow From 10.0.0.*
</Location>

You will also need to make sure the server is listening on the IP address your client will be addressing. Add the following line after "Listen localhost:631":

Listen 10.0.0.1:631

using your server's IP address instead of 10.0.0.1.

Add the IP address of the client computer by doing Allow From client_ip_address. After you make your modifications, you will want to restart CUPS by doing:

# /etc/rc.d/cups restart

On the client side, open up /etc/cups/client.conf and edit the ServerName option to match the ip address or the name of your server. For instance I named my server beast and have entry in my hosts file to point to it. So in my client.conf file, I just edited this line:

ServerName beast

Next, run the following command to update the client computer:

# lpq

You should see something like this:

ml1250 is ready
no entries

There are more configuration possibilities including an automatic configuration which are described in detail on http://localhost:631/sam.html#CLIENT_SETUP (this link works on your printer server).

when prompted for username and password use root to access then follow the instructions from here http://www.digitalhermit.com/linux/printing/ if its a TCP/IP printer use Jetdirect

That's it for Linux to Linux printer sharing.

Linux to Windows

If you are connected to a Windows print server (or any other Samba capable print server), you can skip the section about kernel modules and such. All you have to do is start the CUPS daemon and complete the web interface as specified in section 3.3 and 3.4. Before this, you need to activate the Samba CUPS backend. You can do this by entering the following command:

# ln -s `which smbspool` /usr/lib/cups/backend/smb

Note that the symbol before is ` (underneath the ~ on a standard US keyboard) and not '. After this, you will have to restart CUPS using the command specified in the previous section. Next, simply login into the CUPS web interface and choose to add a new printer. For device, there should be an option that says something to the effect Windows Printer Via Samba near the button of the device list. For the device location enter:

smb://username:password@hostname/printer_name

Or without a password:

smb://username@hostname/printer_name

Make sure that the user actually has access to the printer on Windows computer. Select the appropriate drivers and that's about it. If the computer is located on a domain, make sure the username includes the domain:

smb://username:password@domain/hostname/printer_name

Note: if your network contains many printers use "lpoptions -d your_desired_default_printer_name" to set your preferred printer

Note: I, thepizzaking, was having 'NT_STATUS_ACCESS_DENIED' errors and to fix them I needed to use a slightly different syntax:

smb://workgroup/username:password@hostname/printer_name

Windows to Linux

Sometimes, you might want to allow a Windows computer to connect to your computer. There are a few ways to do this, and the one I am most familiar with is using Samba. In order to do this, you will have to edit your /etc/samba/smb.conf file to allow access to your printers. Your smb.conf can look something like this:

[global]
workgroup = Heroes
server string = Arch Linux Print Server
security = user

[printers]
    comment = All Printers
    path = /var/spool/samba
    browseable = yes
    # to allow user 'guest account' to print.
    guest ok = no
    writable = no
    printable = yes
    create mode = 0700
    write list = @adm root neocephas

That should be enough to share your printer, but you just might want to add an individual printer entry:

[ML1250]
    comment = Samsung ML-1250 Laser Printer
    printer=ml1250
    path = /var/spool/samba
    printing = cups
    printable = yes
    printer admin = @admin root neocephas
    user client driver = yes
    # to allow user 'guest account' to print.
    guest ok = no
    writable = no
    write list = @adm root neocephas
    valid users = @adm root neocephas

Please note that in my configuration I made it so that users must have a valid account to access the printer. To have a public printer, set guest ok to yes, and remove the valid users line. To add accounts, you must setup a regular Linux account and then setup a Samba password on the server. For instance:

# useradd neocephas
# smbpasswd -a neocephas

After setting up any user accounts that you need, you will also need to set up the samba spool folder:

# mkdir /var/spool/samba
# chmod 777 /var/spool/samba

The next items that need changing are /etc/cups/mime.convs and /etc/cups/mime.types:

mime.convs:

# The following line is found at near the end of the file. Uncomment it.
application/octet-stream        application/vnd.cups-raw        0       -

mime.types:

# Again near the end of the file.
application/octet-stream

The changes to mime.convs and mime.types are needed to make CUPS print Microsoft Office document files. Many people seem to need that.

After this restart your Samba daemon:

# /etc/rc.d/samba restart

Obvious, there are a lot of tweaks and customization that can be done with setting up a Samba print server, so I advise you to look at the Samba and CUPS documentation for more help. The smb.conf.example file also has some good samples to that you might want to look at.

Windows 2000 and Windows XP to Linux

For the most modern flavors of Windows an alternative way of connecting to your Linux printer server is to use the CUPS protocol directly. The Windows client will need to be using Windows 2000 or Windows XP. Make sure you allows the clients to access the print server by editing the location settings as specified in section 4.1.

On the Windows computer, go to the printer control panel and choose to Add a New Printer. Next, choose to give an url. For the url type in the location of your printer:

http://host_ip_address:631/printers/printer_name

where host_ip_address is the Linux server's IP address and printer_name is the name of the printer you are connecting to. After this, install the printer drivers for the Windows computer. If you setup the CUPS server to use its own printer drivers, then you can just select a generic postscript printer for the Windows client. You can then test your print setup by printing a test page.

Others to Linux, Linux to others

More information on interfacing CUPS with other printing systems can be found in the CUPS manual, e.g. on http://localhost:631/sam.html#PRINTING_OTHER

Appendix

Alternative CUPS Interfaces

If you are a GNOME user, you can manage and configure your printer by using the gnome-cups-manager.

Update: this package is now available through pacman if you have the "community" repository uncommented in /etc/pacman.conf

pacman -S gnome-cups-manager

The package is also still available from the AUR.

KDE users can modify their printers from the Control Center. Both should refer the those desktop environments' documentation for more information on how to use the interfaces.

There is also gtklp. It is in the "extra" repository.

pacman -S gtklp

PDF Virtual Printer

A nice little package that I submitted to the incoming folder (ftp://ftp.archlinux.org/incoming) is CUPS-PDF. This package allows one to setup a virtual printer that will generate a PDF from anything sent to it. For example, I wrote this document in AbiWord and then printed it to the Virtual Printer which generated a pdf in my /var/spool/cups-pdf/neocephas folder. Obviously, this package is not necessary, but it can be quite useful. After downloading the package from the ftp server and installing it, you can set it up as you would for any other printer in the web interface. Select Virtual PDF Printer as the device and choose Postscript -> Postscript Color Printer for the drivers.

Online Resources

Here is a listing of websites that may be of use to you:

Specialized Cases

This section is dedicated to specific problems and their solutions. If you managed to get some unusual printer working, please put the solution here.

Printing does not work/aborts with the HP Deskjet 700 Series Printers.

  • The solution is to install pnm2ppa printer filter for the HP Deskjet 700 series. Without this the print jobs will be aborted by the system. A PKGBUILD for pnm2ppa can be found in AUR.

Getting HP LaserJet 1010 to work

I had to compile ghostscript myself because ESP gs in rep was 7.07 and had not fixed some bugs like ESP 8.15.1 had. I never downloaded 'foomatic' in rep. I think that is an old package.

$ pacman -Qs cups a2ps psutils foo ghost
local/cups 1.1.23-3
    The CUPS Printing System
local/a2ps 4.13b-3
    a2ps is an Any to PostScript filter
local/psutils p17-3
    A set of postscript utilities.
local/foomatic-db 3.0.2-1
    Foomatic is a system for using free software printer drivers with common
    spoolers on Unix
local/foomatic-db-engine 3.0.2-1
    Foomatic is a system for using free software printer drivers with common
    spoolers on Unix
local/foomatic-db-ppd 3.0.2-1
    Foomatic is a system for using free software printer drivers with common
    spoolers on Unix
local/foomatic-filters 3.0.2-1
    Foomatic is a system for using free software printer drivers with common
    spoolers on Unix
local/espgs 8.15.1-1
    ESP Ghostscript

I also had to set LogLevel in /etc/cups/cupsd.conf to debug2 before i saw that I missed some "Nimbus" fonts. Then I had to rename & put them where the log told me to. Some fancy google searching had to be applied, example: http://www.google.com/search?q=n019003l+filetype%3Apfb since the fonts turned out to be proprietary (i'm sure windows comes with these default). Nevertheless after downloading them(about 7 fonts) and putting them in the correct folder printing started working.

Before that i were getting all the errors said here: http://linuxprinting.org/show_printer.cgi?recnum=HP-LaserJet_1010 'Unsupport PCL' etc...

I'm sure it could have worked with ESP gs 7.07 too(in rep) if i was smart enough to turn on DebugLevel2 sooner :/ UPDATE: yeah it did... maybe this info is useful for someone else though.. sorry for the inconvenience.

Getting HP LaserJet 1020 to work

After a lot of tries with hplib and gutenprint I finally found the solution to get my printer HP Laserjet 1020 printing.

First of all you only need to install cups and ghostscript. Then follow the link on http://www.linuxprinting.org/show_printer.cgi?recnum=HP-LaserJet_1020 to the http://foo2zjs.rkkda.com/ printer driver page and follow the install instructions. Log in as root. After you downloaded the package and extracted the archive, change into the foo2zjs directory. Now you can follow the original installation instructions with a minor modification to change the userid for printing:

$ make
$ ./getweb 1020

Open the Makefile

$ nano Makefile

and search for the line

# LPuid=-olp

and modify it to

# LPuid=-oroot

then continue with the script

$ make install
$ make install-hotplug
$ make cups

Or you can use the package foo2zjs from AUR and modify the PKGBUILD: change the line

./getweb all

to

./getweb 1020

(or if you're setting another printer change this line to what you need).

As a last step add and configure the printer in the CUPS manager. The printer should be recognized automatically. It works fine for root and all users. When booting the operating system, the printer is initialized and indicates its working.

Printer connected to an Airport Express Station

The first thing to do is to scan the airport express station. It seems that there are different addresses depending on the model.

[root@somostation somos]# nmap 192.168.0.4

Starting Nmap 4.20 ( http://insecure.org ) at 2007-06-26 00:50 CEST
Interesting ports on 192.168.0.4:
Not shown: 1694 closed ports
PORT      STATE SERVICE
5000/tcp  open  UPnP
9100/tcp  open  jetdirect
10000/tcp open  snet-sensor-mgmt
MAC Address: 00:14:51:70:D5:66 (Apple Computer)

Nmap finished: 1 IP address (1 host up) scanned in 25.815 seconds

With my station the port is 9100. The airport station is accessed like an HP JetDirect printer. After, you can edit your printer.conf file in this way:

# Printer configuration file for CUPS v1.2.11
# Written by cupsd on 2007-06-26 00:44
<Printer LaserSim>
Info SAMSUNG ML-1510 gdi
Location SomoStation
DeviceURI socket://192.168.0.4:9100
State Idle
StateTime 1182811465
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy stop-printer
</Printer>

It should work. I had a few problems. There were resolved by removing foomatic and installing foomatic-db, foomatic-db-engine, foomatic-db-ppd instead.

Performing Utility Functions on Epson Printers

Escputil

Here we explain how to perform some of the utility functions such as nozzle cleaning and nozzle checks on Epson printers. We will use the escputil utility, which is part of the gutenprint package.

There is a man page ("man escputil") that provides pretty good information, but it does not include necessary information on how to identify your printer. There are two parameters that can be used. One is --printer; what it expects is the name you used to identify your printer when you configured it. The other is --raw-device. What this option expects is is something beginning with "/dev". If your printer is a serial printer, and the only serial printer, it is "/dev/lp0". If it is an usb printer, it is "/dev/usb/lp0". If you have more than one printer, they will have names ending in "lp1", "lp2", etc.

  • To clean the printer heads:
  escputil -u --clean-head
  • To prints the nozzle-check pattern, allowing you to verify that the previous head cleaning worked. (Or to determine that you need to clean the heads)
  escputil -u --nozzle-check

If you want to perform an operation that requires 2-way communication with a printer, you must use the "--raw-device" specification, and your user must root or be a member of the group "lp".

  • The following is an example of getting the printer's internal identification:
  sudo escputil --raw-device=/dev/usb/lp0 --identify
  • To prints out the ink levels of the printer:
  sudo escputil --raw-device=/dev/usb/lp0 --ink-level

Mtink

This is a printer status monitor which enables to get the remaining ink quantity, to print test patterns, to reset printer and to clean nozzle. It use an intuitive graphical user interface. Package can be downloaded from AUR.

Another Source for Printer Drivers

On http://www.turboprint.de/english.html is a really good printer driver for many printers not yet supported by Linux (especially Canon i*). The only problem is that high-quality-prints are either marked with a turboprint-logo or you have to pay for it... It's not Open-Source.

See the Wikipedia article on this subject for more information: Common_Unix_Printing_System

Troubleshooting

As a result of upgrade

Error with gnutls

After updating, if you get something like :

 /usr/sbin/cupsd: error while loading shared libraries: libgnutls.so.13: cannot open shared object file: No such file or directory

You need to update gnutls:

 pacman -Sy gnutls

In addition, in /etc/cups, there will be a file named cupsd.conf.pacnew. Rename it cupsd.conf.

All jobs are "stopped"

After updating CUPS, if all jobs sent to the printer become "stopped", delete the printer and add it again. Using the CUPS web interface (http://localhost:631), go to Printers > Delete Printer.

Note: If you don't remember your printer's settings, go to Printers > Modify Printer. Copy down the information displayed, click 'Modify Printer' to proceed to the next page(s), etc.

Personal tools