logoOL.gif
user_gelb_schwarz_or.gif
logoUL.gif
logoUR.gif claim.gif
LinuxUser LinuxCommunity EasyLinux Linux-Magazin International
      Anzeige
TFT Monitor bei Mercateo kaufen.
Neues Netbook? Ein Preisvergleich lohnt sich.
Bei uns finden sie Notebooks, PDAs und Drucker mit Testberichten und Tipps.
Diamant Buchhaltungssoftware – transparent und detailliert auch für die Konzernbuchhaltung.
Günstige Shareware Programme als direkte Downloads im Software Portal.
Bis zu 70% sparen durch Preisvergleich.
      Anzeige

Erschienen in LinuxUser 04/2004   »   Ausgabe bestellen

CUPS als Printserver konfigurieren

Treffpunkt für Dokumente

von Tim Schürmann 

Einen Drucker mit anderen Benutzern zu teilen, schont den Geldbeutel und lastet die Hardware-Ressourcen besser aus. Hängt der Drucker an einem CUPS-Server lassen sich Dokumente sogar von Apple- oder Microsoft-Clients ausgeben.

Ausrangierte Computer eignen sich ideal als Druckerserver in einem Netzwerk. So nutzen nicht nur mehrere Personen einen Drucker gemeinsam, auch die Rechenlast übernimmt der Print-Server, und auf dem eigenen Rechner geht es mit voller Leistung weiter. Oftmals senden auch Familienmitglieder die Dokumente an verschiedene Drucker. Während Vati mit seinem Laserdrucker Massenbriefe erstellt, f;uuml;ttert die Tochter den Tintenstrahler lieber mit Fotos der letzten Party. Ähnliche Szenarien spielen sich auch im Unternehmen ab. Auch dort erlaubt das Common Unix Printing System (CUPS), dass Linux-, Microsoft- oder Apple-Clients auf jeden Drucker zugreifen können.

Cups durchleuchtet 

Drucken ist eigentlich eine einfache Angelegenheit: Der User wählt in der Anwendung den Menüpunkt Drucken und schon sendet das Programm die Daten zum Drucker. Dieser wiederum spuckt artig das Ergebnis auf Papier. Doch dies ist nicht so trivial, wie es zunächst aussieht.

Das erste Problem besteht darin, dass der Computer für die Zeit des Ausdrucks blockiert bleibt. Die meisten Drucker besitzen nicht genügend eigenen Speicher, um ein Dokument vollständig zu laden. Daher verwendet das Drucksystem mit dem Spooler ein zusätzliches Programm, das einen Zwischenspeicher bereit stellt, die so genannte Druckerwarteschlange. Der Spooler überwacht den Drucker und gibt ihm den nächsten anstehenden Auftrag (Job), wenn er dafür bereit ist. Bei Cups übernimmt diese Arbeit cupsd, der Cups-Daemon (auch Scheduler genannt). Er startet in der Regel nach dem Einschalten des Systems und wartet ständig im Hintergrund auf neue Jobs.

Auch die Vielzahl der Druckermodelle ist problematisch. Jeder Drucker verwendet andere Steuerbefehle, spricht also eine eigene Sprache. Eine Anwendung, die ein Dokument zum Drucker schickt, bereitet die Daten so auf, dass sie der Drucker versteht. Dazu müsste sie jedoch alle auf dem Markt befindlichen Druckermodelle kennen. Da dies utopisch ist, schaltet man so genannten Filter zwischen Spooler und Drucker. Diese kleinen Programme übersetzen die ankommenden Daten vor dem Ausdruck in die Sprache des Druckers. Die Anwendung überführen die Daten vorher nur in ein Standardformat, das sie anschließend dem Spooler übergibt. Auf Linux kommt das Format Postscript zum Einsatz. Adobe [6] hat Postscript als spezielle Programmiersprache für Grafiken entwickelt. Postscript-fähige Drucker interpretieren diese Dateien direkt und drucken sie ohne Hilfsprogramm aus. Um das Format auch auf anderen Druckern zu benutzen, haben Open-Source-Programmierer das Programm Ghostscript zusammengestellt. Es wandelt Postscript-Dokumente mit Hilfe eines passenden Druckertreibers in die Sprache des Druckers um. Erkennt der Cups-Spooler, dass ein Drucker Postscript nicht direkt ausgeben kann, ruft er Ghostscript auf. Dieses wandelt die Daten entsprechend um.

Den Abschluss der Kette bilden Backends. Ein Backend repräsentiert einen Anschluss wie den Parallel-Port. Entwickler erhalten damit eine relativ einfache Möglichkeit, Cups mit neuen Anschlussarten wie Firewire auszustatten.

Distributions-Cups bevorzugt

Um Cups im Netzwerk zu betreiben, sind zwei Schritte notwendig. Zunächst konfigurieren Sie die Computer, an denen ein Drucker angeschlossen ist. Dies kann ein Arbeitsplatzrechner oder ein Server sein, auf dem keine grafische Oberfläche laufen muss. Alle aktuellen Distributionen richten Cups bereits bei der Betriebssysteminstallation ein oder enthalten Werkzeuge für die nachträgliche Konfiguration. Diese richten Cups so ein, dass es automatisch beim Start des Systems aktiv ist. Sollte Ihre Distribution Cups nicht mitbringen oder möchten Sie es aktualisieren, finden Sie auf der Cups-Website [1] die aktuelle Version als Quelltext. Neue RPM- oder Debian-Binärpakete befinden sich auf den Update-Servern der Distributionen.

Vor Cups haben die Distributionen die wesentlich leistungsschwächeren BSD- oder LPRng-Drucksysteme eingesetzt. Sofern Sie eine ältere Distribution verwenden, empfiehlt es sich, diese gegen Cups auszutauschen. Weitere Informationen hierzu finden Sie auf der Cups-Website.

Einzelne Anwendungen an Cups anzupassen ist nicht notwendig. Entweder verstehen sich die Programme von Haus aus mit dem Drucksystem (wie die KDE-Anwendungen) oder sie verwenden die so genannten System-V- oder Berkley-Druckkommandos lp und lpr. Dabei handelt es sich um Kommandozeilenwerkzeuge, die von den eigentlichen Anwendungsprogrammen aufgerufen werden. Cups bringt die beiden Tools in einer kompatiblen Version mit. Sie bieten eine schnelle Möglichkeit, um Dateien direkt von der Kommandozeile an einen (entfernten) Drucker zu senden. Detaillierte Informationen zu den Kommandos befinden sich im Cups Software Users Manual [2] oder den Manpages, die Distributionen wie Suse auch auf Deutsch enthalten.

Im Gegensatz zum alten LPRng-System ist Cups prädestiniert für den Einsatz im Netzwerk, da es auf dem Internet Printing Protocol (IPP, [3]) basiert. IPP ist eine Erweiterung des Hyptertext Transport Protocol (HTTP), das im Internet Webseiten transportiert. Die Funktionsweise ähnelt daher dem Datenverkehr im Internet: ein Computer, den der Cups-Jargon als Client bezeichnet, sendet die Druckdaten an einen Cups-Server. Der dort im Hintergrund laufende Daemon cupsd nimmt die Daten entgegen, verarbeitet sie weiter und gibt sie schließlich über den Drucker aus.

Per Browser konfigurieren

Zur Konfiguration enthält Cupsd eine Webschnittstelle, die sich unter http://localhost:631 erreichen lässt. Greifen Sie von einem entfernten Rechner aus den Cups-Server zu, ersetzen Sie localhost durch den Rechnernamen oder die IP-Adresse. In der Standardkonfiguration erlaubt Cups keinen Zugriff von außen auf das Webinterface. Daher muss anfangs der Browser auf dem System laufen, das Sie konfigurieren.

Die Erlaubnis für den Fernzugriff tragen Sie in der Datei etc/cups/cupsd.conf ein. Suchen Sie dort Abschnitte, die mit <Location /...> beginnen und mit </Location> enden (Abbildung 1). Die einleitenden Location-Tags enthalten Schlüsselwörter, über die Cups den Zugriff auf die jeweilige Seite der Weboberfläche regelt.

Abb. 1: Der Allow-Eintrag erlaubt dem Computer mit der Adresse 192.168.0.16 den Fernzugriff auf die Web-Schnittstelle von Cups.

Den Fernzugriff auf die Seite Administration schalten Sie in <Location /admin> frei. So gestattet die Zeile Allow From 192.168.0.16 dem Rechner mit dieser IP-Adresse auf die Benutzeroberfläche zuzugreifen. Vorsicht: Eine Fernverbindung ist ein Unsicherheitsfaktor, da die Passwörter im Klartext durchs Netz wandern.

Abb. 2: Die Weboberfläche des Cups-Daemon erscheint erst, wenn die Zugriffsrechte korrekt eingestellt sind. Dies ist in der Standardkonfiguration der Fall, bei der Cups lediglich den lokalen Zugriff erlaubt. Den Fernzugriff muss root explizit freigeben.

Die Browser-Oberfläche erlaubt es nicht nur Cups einzurichten und zu verwalten (Abbildung 2). Zudem listet sie die wartenden Druckaufträge auf. Letzteres leistet auf der Kommandozeile der Befehl lpstat. Sofern Sie einen Drucker über ein Konfigurationsprogramm Ihrer Distribution einrichten können, sollten Sie diesem Weg den Vorzug geben. Auf Suse Linux funktioniert dies mit Yast. Eine Alternative ist das Kommandozeilentool lpadmin, das zudem noch einige Optionen mehr bietet, als die bereits genannten Lösungen.

Wem alle diese Methoden nicht zusagen, wählt aus den Konfigurationsprogrammen von Drittanbietern. So bringen zum Beispiel alle neuen KDE-Versionen eine entsprechende Komponente mit. Diese befindet sich im Kontrollzentrum unter Angeschlossene Geräte | Drucker (Abbildung 3).

Abb. 3: Die Cups-Konfigurationsmaske im KDE-Kontrollzentrum enthält die meisten Standrdoptionen. Ein Rechtsklick auf die weiße Fläche fördert weitere nützliche Funktionen zu Tage, mit der sich der Cups-Daemon auch bequem neu starten lässt.

Dieser Workshop benutzt das Browser-Interface der Vorzug gegeben. Dort finden Sie unter dem Punkt Printers eine Liste mit allen Druckerwarteschlangen (Abbildung 4).

Abb. 4: Die Webseite "Printers" listet alle von Cups erkannten Druckerwarteschlangen zusammen mit dem Uniform Resource Identifier (unter Device URI) auf.

Jede Warteschlange besitzt einen Namen und individuelle Einstellungen. Sie können mehrere solcher Warteschlangen einem Drucker respektive einer Schnittstelle zuordnen. Die Schnittstelle, an die Dokumente einer Druckerwarteschlange gesendet werden, ist im Uniform Resource Identifiers (URI) Format angegeben. Die Notation ähnelt den Adressen von Internetseiten: So steht parallel:/dev/lp0 für den ersten Parallelport oder usb:/dev/usb/lp0 für den ersten USB-Drucker. Einen Überblick aller verfügbaren Schnittstellen liefert der Kommandozeilenbefehl lpinfo -v. Der URI wird später noch einmal eine Rolle spielen.

Drucker wollen Warteschlangen

Um eine neue Druckerwarteschlange anzulegen, wählen Sie im Browser den Link Administration und dort Add Printer. Im Feld Name geben Sie den Namen der Druckerwarteschlange ein. Dieser darf nicht länger als 127 Zeichen sein.

In den nächsten Schirmen folgen die Auswahl der Schnittstelle, an die der Drucker angeschlossen ist, das Druckermodell und schließlich der zugehörige Ghostscript-Filter (Kasten 1).

Die folgenden Schritte setzen voraus, dass Cups auf allen Computern korrekt eingerichtet ist, an denen ein Drucker hängt (Server). Sie prüfen dies, indem Sie eine Testseite ausgeben lassen. Diese drucken Sie aus dem Browser über Printers|Print Test Page.

Clients vorbereiten

Im zweiten Schritt konfigurieren Sie alle Computer, die auf diese Drucker zugreifen (Clients). Hierfür gibt es mehrere Wege. Der Cups-Daemon cupsd sollte bei allen im Hintergrund arbeiten. Einige Distributionen starten ihn beim Hochfahren des Systems nur dann automatisch, wenn auch tatsächlich ein Drucker eingerichtet wurde.

Suse Linux 9 enthält in Yast die Option, den Server nachträglich einzurichten. Wählen Sie dazu Ändern | Erweitert und dann CUPS als Server. Besitzen Sie eine Distribution, deren Konfigurationsprogramm dies nicht erlaubt, fertigen Sie für Cups ein Startskript an [4].

Drucker mit ihren Clients bekannt machen

Damit die Clients den neuen Netzwerkdrucker finden, tragen Sie diesen auf jedem Arbeits-PC ein. Dazu benutzen Sie die Webschnittstelle wie vorher beschrieben. Wählen Sie dort aber als Schnittstelle (Device) das Internet Printing Protocol (IPP). Geben Sie dann die URI zum entfernten Drucker an, zum Beispiel: ipp://meinserver/printers/meindrucker. Dabei tauschen Sie meinserver gegen den Namen oder die IP-Adresse des Druckerservers aus und meindrucker gegen den Namen der Druckerwarteschlange.

Die Konfigurationsprogramme der Distributionen enthalten ähnliche Optionen (die Abbildungen 5a und 5b zeigen Yast auf Suse Linux). Diese Prozedur wiederholen Sie für jede externe Druckerwarteschlange. Gerade bei vielen Druckern ist das aber ziemlich umständlich.

Abb. 5a: Entfernten Drucker auf Suse-Linux 8.2 einrichten: Zunächst teilen Sie Yast mit, dass es sich um einen entfernten Drucker handelt, der per IPP angesprochen wird ...

Abb. 5b: ... und dann tragen Sie den Rechnernamen sowie den Rest des Uniform Resource Identifiers (URI) ein. Ein Klick auf "Weiter" macht den Drucker erreichbar.

Sie konfigurieren Cups deshalb so, dass alle Aufträge immer einen entfernten Druckerserver verwenden. Dies ist die einzige Konfiguration, bei der kein Cups-Daemon auf den Clients laufen muss.

Um diese Weiterleitung einzurichten, öffnen Sie die Konfigurationsdatei /etc/cups/client.conf mit einem Texteditor. Dort gibt es eine Zeile, die mit ServerName beginnt. Eventuell müssen Sie die vorangestellte Raute entfernen. Nach dem Schlüsselwort ServerName tragen Sie, durch ein Leerzeichen getrennt, den Namen oder besser die IP-Adresse des Servers ein, der sämtliche Druckaufträge entgegen nehmen soll (Abbildung 6).

Abb. 6: Durch die aktivierte Weiterleitung verwendet der lokale Rechner nur noch das Drucksystem des Computers mit der IP-Adresse 192.168.0.20 - er reicht alle Druckaufträge einfach an diesen Druckserver durch.

Bequem zum Ziel per Broadcast

Die dritte Methode ist die wohl bequemste. Jeder Cups-Daemon sendet in einem bestimmten Intervall seine Konfiguration quer durchs Netzwerk (Broadcast). Die Clients empfangen das Signal und können die angebotenen Warteschlangen ab sofort nutzen. Der Vorteil dieser Variante liegt in der extrem einfachen Konfiguration: Einen neuen Drucker konfigurieren Sie lediglich an dem Rechner, an dem er angeschlossen ist. Schon können ihn alle Computer im Netzwerk verwenden.

Allerdings ist die Broadcast-Technik nicht die sicherste. Alle Rechner, die das Signal empfangen können, haben Zugriff auf die Drucker. Im Extremfall erlaubt man so dem gesamten Internet Ausdrucke zu erstellen. Daher ist dieses Browsing im Cups-Paket zwar eingeschaltet, neuere Cups-Versionen senden die Informationen jedoch standardmäßig nicht aus.

Abb. 7: Auf Suse Linux lässt sich das Broadcasting mit dem Adminwerkzeug Yast aktivieren. Hier versorgt der Cups-Server per Broadcast-Signal das Subnetz 192.168.0 mit allen Informationen zu den angeschlossenen Druckern.

Den Broadcast richten Sie mit Hilfe von Konfigurationsprogrammen ein: Auf Suse Linux nehmen Sie alle relevanten Einstellungen in Yast vor. Die dazu nötigen Optionen finden Sie im Menü Ändern | Erweitert | CUPS Servereinstellungen (Abbildung 7). Um den Broadcast eines Servers manuell einzurichten, bearbeiten Sie die Konfigurationsdatei /etc/cups/cupsd.conf.

Alle Zeilen, die mit einer Raute beginnen, stellen Kommentare dar, die Cups nicht ausgewertet. Jede Einstellung steht in einer eigenen Zeile und setzt sich aus einem Schlüsselwort und einem Wert zusammen. Die Bedeutung aller Werte ist in [2] aufgelistet, aber auch cupsd.conf enthält kurze Erläuterungen und Beispiele.

Für das Broadcasting sind alle Einträge interessant, die mit Browse beginnen. Der Wert hinter BrowseIntervall legt fest, in welchen Sekundenabständen der Server seine Konfiguration senden soll. Dem Schlüsselwort BrowseAdress folgt die Broadcast-Adresse, an die der Rundruf geht. So bewirkt beispielsweise der Eintrag BrowseAdress 192.168.0.255, dass Cupsd die Einstellungen an alle Rechner sendet, deren IP-Adresse mit 192.168.0 beginnt.

Alternativ zum Browsing verwenden Sie das Polling. Dabei holt der Client die Konfigurationsdaten selbständig vom Server ab. Setzen Sie in der Datei cupsd.conf des Clients das Schlüsselwort BrowsePoll auf den Namen oder die IP-Adresse des Servers. Es können mehrere BrowsePoll-Einträge vorhanden sein, sodass der Client bei mehreren Servern nach einer Konfiguration fragt. Ist BrowseRelay aktiviert, sendet der Rechner die per Polling erfragten Informationen an alle Computer in einem Subnetz weiter.

Cups reloaded

Nach einer Änderung an der Datei cupsd.conf ist immer ein Neustart des Cups-Daemons notwendig. Der hierzu erforderliche Befehl ist abhängig von Ihrer Distribution. Auf Suse Linux erledigt dies /etc/init.d/cups restart. Haben Sie mit Yast konfiguriert, hat dieses Programm bereits den Neustart für Sie vorgenommen. Fortan listet der Drucken-Dialog des KDE alle Drucker auf (Abbildung 8).

Sofern das Browsing nicht klappt, werfen Sie einen Blick auf die Konfiguration der Hostnamen. Sind diese nicht korrekt in /etc/hosts eingetragen, läuft der Broadcast ins Leere. Mit einem lokalen DNS-Server tritt solch ein Fehler nicht auf.

Abb. 8: Sobald die Konfiguration von Cups erfolgreich abgeschlossen ist, tauchen die entfernten Drucker zusammen mit ihren konfigurierbaren Eigenschaften im "Drucken"-Dialog von KDE auf.

Apple- und Microsoft-Systeme zum Drucken überreden

Sie können alle Betriebssysteme, die IPP unterstützen, so ins Drucknetzwerk integrieren. Hierzu zählt auch MacOS X ab Version 10.2. Dort reicht es aus, in den Systemeinstellungen unter Dienste die Option Printer Sharing zu markieren. Die Drucker tauchen dann im Drucken-Dialog unter Freigegebene Drucker auf.

Für alle alten MacOS-Versionen ist das Paket netatalk nötig. Die Konfigurationsdatei papd.conf ergänzen Sie um jeweils einen Eintrag pro Drucker. Genaue Angaben hierzu finden Sie auf [5]. Wichtig hierbei ist, dass Sie die zum Drucker passende PPD-Datei aus dem Verzeichnis /etc/cups/ppd verwenden:

Drucker Beschreibung:MyDrucker@MeinServer:\
:pr=|/usr/bin/lp -d MyDrucker:\
:op=daemon:\
:pd=/etc/cups/ppd/MyDrucker.ppd:

Windows-2000/XP-Systeme unterstützen IPP von Haus aus. Für alle anderen Windows-Versionen ist eine fehlerfreie Installation von Samba ab Version 2.0.6 nötig. Fügen Sie in der Konfigurationsdatei smb.conf im Abschnitt [Global] die beiden Zeilen printing = cups und printcap name = cups ein. Aktuelle Distributionen sind bereits entsprechend konfiguriert.

Der Windows-Client benötigt noch einen Druckertreiber, der Postscript erzeugt. Hierzu benutzen Sie den Treiber eines beliebigen Postscript-fähigen Druckers, etwa den Laserwriter von Apple. Möchten oder können Sie auf den originalen Druckertreiber nicht verzichten, richten Sie auf dem Cups-Server eine neue Druckerwarteschlange ein. Diese verwendet als Druckermodell das so genannte raw-Device. Cups leitet dann die eingehenden Daten direkt an den entsprechenden Ausgabeport durch. Beachten Sie hierbei, dass Daten von anderen Computern, auf denen nicht der Originaltreiber für diesen Drucker installiert ist, keine brauchbaren Ausgaben erzeugen.

Samba unterstützt Cups

Samba ab 2.2 exportiert die richtigen Druckertreiber automatisch, sobald ein Windows-Client druckt. Das im Folgenden zum Einsatz kommende cupsaddsmb kann dabei nur mit den Postscript-Treibern von Adobe [7] oder den von der eigenen Homepage umgehen.

Die Adobe-Treiber liegen als EXE-Datei vor, die Sie auf Windows mit einem Programm wie Winzip extrahieren müssen. Legen Sie alle Dateien des Treibers im Verzeichnis /usr/share/cups/drivers ab. Die Namen aller Dateien müssen durchgängig in Großbuchstaben geschrieben sein. Anschließend passen Sie die Samba-Konfiguration so an, dass der Fileserver die Druckertreiber exportiert. Genaue Informationen hierzu liefert die Samba-Dokumentation.

Ein cupsaddsmb -U root -a exportiert schließlich alle Drucker. Dies bedeutet, dass die Treiber auf dem Samba-Server hinterlegt werden. Beachten Sie, dass cupsaddsmb die Dateien dabei als Benutzer root mit dem Programm smbclient kopiert. Samba muss somit den Zugriff dieses Benutzers gestatten.

Das Samba-Paket bringt ein neues Cups-Backend smbspool mit. Dieses erlaubt auch von Linux auf einen Drucker an einem Windows-Rechner zuzugreifen. Normalerweise wird das Backend von der Distribution automatisch korrekt eingerichtet. Andernfalls führen Sie als Benutzer root in einem Terminalfenster das Kommando ln -s 'which smbspool' /usr/lib/cups/backend/smb aus.

Der Drucker lässt sich nun in Cups analog zu einem entfernten Drucker an einem Cups-Server einrichten. Statt der Adresse ipp://... verwenden Sie hier jedoch den Anschluss smb://arbeitsgruppe/server/sharename. Sofern der Drucker an einem Rechner der NT-Klasse hängt oder unter Windows-9x Passwörter aktiv sind, müssen Sie diese ebenfalls angeben: smb://benutzer:passwort@arbeitsgruppe/server/sharename.

Optionen für Profis

Dieser Artikel beschränkte sich auf die Konfiguration von Cups für Netzwerke. Ein nächster Schritt bestünde in einem Blick auf die Zugangs- und Sicherheitsfunktionen: So lassen sich Druckerkontingente (Quotas) vergeben und Passwörter verwenden. In einem Heimnetzwerk dürften diese nur bei einem teuren Farblaserdrucker interessant sein.

Interessant sind auch die Möglichkeiten, die so genannte Classes offerieren. Eine Klasse ist eine Menge von Druckern. Geht ein Druckauftrag an eine solche Klasse, druckt Cups die Daten auf dem ersten Drucker dieser Klasse, der sich im Leerlauf befindet. Letztere lassen sich bequem im Web-Interface anlegen (Menüpunkt Classes).

Bei Problemen hilft Ihnen ein Blick in das Benutzerhandbuch der Distribution oder in die ausführliche englische Online-Dokumentation [2]. Wertvolle Hinweise liefern zudem die Protokoll-Dateien unter /var/log/cups. (jre)


IPP: Das Internet Printing Protocol basiert auf HTTP 1.1. Allerdings lauscht die Software an Port 631 statt an Port 80. Die Verwandschaft der beiden Protokelle geht soweit, dass sich IPP-Implementierungen wie Cups direkt per HTTP ansprechen lassen. Für einen Drucker lautet die Adresse dann statt IPP://servername/... einfach HTTP://servernamen:631/....

Infos 
[1] CUPS-Projekt: http://www.cups.org
[2] CUPS-Dokumentation: http://localhost:631
[3] IPP: http://www.pwg.org/ipp/
[4] Runlevel-Skripts: Marc André Selig, "Wie Linux sich die Stiefel anzieht", LinuxUser 12/2002, http://www.linux-user.de/ausgabe/2002/12/026-init/
[5] Netatalk: http://netatalk.sourceforge.net
[6] Adobe: http://www.adobe.com

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.




Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2010 Linux New Media AG

[Linux-Magazin] [LinuxUser] [EasyLinux] [Linux-Community] [Ubuntu User] [Linux Technical Review] [Linux Magazine] [Linux Pro Magazine] [Ubuntu User]
[EasyLinux Poland] [Linux Magazine Poland] [Linux Magazine Brasil] [EasyLinux Brasil] [Linux Magazine Spain]