modernize and cleanup documentation (#542)
* disable system packages on rtd * install pycups on rtd * enable cups binding in documentation * document CupsPrinter * fix formatting * revise methods and installation * revise user/printers * revise raspi section * further revise
This commit is contained in:
parent
4c2dcdfac6
commit
2b62c8e28d
|
@ -25,4 +25,4 @@ python:
|
|||
- requirements: doc/requirements.txt
|
||||
- method: pip
|
||||
path: .
|
||||
system_packages: true
|
||||
system_packages: false
|
||||
|
|
|
@ -1,23 +1,32 @@
|
|||
Contributing
|
||||
============
|
||||
|
||||
This project is open to any kind of contribution. You can help with improving the documentation, adding fixes to the
|
||||
code, providing test cases in code or as a description or just spreading the word. Please feel free to create an
|
||||
issue or pull request.
|
||||
In order to reduce the amount of work for everyone please try to adhere to good practice.
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
The pull requests and issues will be prefilled with templates. Please fill in your information where applicable.
|
||||
This project is open to any kind of contribution.
|
||||
You can help with improving the documentation, adding fixes to the
|
||||
code, providing test cases in code or as a description or just
|
||||
spreading the word.
|
||||
Please feel free to create an issue or pull request.
|
||||
In order to reduce the amount of work for everyone please try
|
||||
to adhere to good practice.
|
||||
|
||||
This project uses `semantic versioning <https://semver.org/>`_ and tries to adhere to the proposed rules as
|
||||
well as possible.
|
||||
The pull requests and issues will be prefilled with templates.
|
||||
Please fill in your information where applicable.
|
||||
|
||||
This project uses `semantic versioning <https://semver.org/>`_
|
||||
and tries to adhere to the proposed rules as well as possible.
|
||||
|
||||
Author-list
|
||||
-----------
|
||||
|
||||
This project keeps a list of authors. This can be auto-generated by calling `./doc/generate-authors.sh`.
|
||||
When contributing the first time, please include a commit with the output of this script in place.
|
||||
This project keeps a list of authors.
|
||||
This can be auto-generated by calling `./doc/generate-authors.sh`.
|
||||
When contributing the first time, please include a commit with
|
||||
the output of this script in place.
|
||||
|
||||
When you change your username or mail-address, please also update the `.mailmap` and the authors-list.
|
||||
When you change your username or mail-address, please also
|
||||
update the `.mailmap` and the authors-list.
|
||||
You can find a good documentation on the mapping-feature in the
|
||||
`documentation of git-shortlog <https://git-scm.com/docs/git-shortlog#_mapping_authors>`_.
|
||||
|
||||
|
@ -33,31 +42,42 @@ Please format your contributions with black, otherwise they will be rejected.
|
|||
|
||||
GIT
|
||||
^^^
|
||||
The master-branch contains the main development of the project. A release to PyPi is marked with a tag
|
||||
corresponding to the version. Issues are closed when they have been resolved by merging into the master-branch.
|
||||
When you have a change to make, begin by creating a new branch from the HEAD of `python-escpos/master`.
|
||||
The master-branch contains the main development of the project.
|
||||
A release to PyPi is marked with a tag corresponding to the version.
|
||||
Issues are closed when they have been resolved by merging
|
||||
into the master-branch.
|
||||
When you have a change to make, begin by creating a new branch
|
||||
from the HEAD of `python-escpos/master`.
|
||||
|
||||
Please try to group your commits into logical units. If you need to tidy up your branch, you can make use of a
|
||||
git feature called an 'interactive rebase' before making a pull request. A small, self-contained change-set is
|
||||
easier to review, and improves the chance of your code being merged.
|
||||
Please also make sure that before creating your PR, your branch is rebased on a recent commit or you merged a recent
|
||||
commit into your branch. This way you can ensure that your PR is without merge conflicts.
|
||||
Please try to group your commits into logical units.
|
||||
If you need to tidy up your branch, you can make use of a
|
||||
git feature called an 'interactive rebase' before making a pull request.
|
||||
A small, self-contained change-set is easier to review, and
|
||||
improves the chance of your code being merged.
|
||||
Please also make sure that before creating your PR, your branch
|
||||
is rebased on a recent commit or you merged a recent
|
||||
commit into your branch.
|
||||
This way you can ensure that your PR is without merge conflicts.
|
||||
|
||||
Docstrings
|
||||
^^^^^^^^^^
|
||||
This project tries to have a good documentation.
|
||||
Please add a docstring to every method and class. Have a look at existing methods and classes for the style.
|
||||
Please add a docstring to every method and class.
|
||||
Have a look at existing methods and classes for the style.
|
||||
We use basically standard rst-docstrings for Sphinx.
|
||||
|
||||
Test
|
||||
^^^^
|
||||
Try to write tests whenever possible. Our goal for the future is 100% coverage.
|
||||
You can copy the structure from other testcases. Please remember to adapt the docstrings.
|
||||
Try to write tests whenever possible.
|
||||
Our goal for the future is 100% coverage.
|
||||
You can copy the structure from other testcases.
|
||||
Please remember to adapt the docstrings.
|
||||
|
||||
Further reading
|
||||
^^^^^^^^^^^^^^^
|
||||
For further best practices and hints on contributing please see the
|
||||
`contribution-guide <https://www.contribution-guide.org/>`_. Should there be any contradictions between this guide
|
||||
`contribution-guide <https://www.contribution-guide.org/>`_.
|
||||
Should there be any contradictions between this guide
|
||||
and the linked one, please stick to this text.
|
||||
Aside from that feel free to create an issue or write an email if anything is unclear.
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
Release process
|
||||
===============
|
||||
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
* Update authors file
|
||||
* Update changelog
|
||||
* Set annotated tag for release and push to public github
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
TODO
|
||||
====
|
||||
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
Open points and issues of the project are tracked in the GitHub issues.
|
||||
Some annotations still remain in the code and should be moved over time
|
||||
into the issue tracker.
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
Available Encodings
|
||||
-------------------
|
||||
:Last Reviewed: 2023-07-29
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
If you find any issues with the described encodings,
|
||||
please open an issue in the
|
||||
`ESC/POS printer database <https://github.com/receipt-print-hq/escpos-printer-db>`_.
|
||||
The data shown here is directly taken from there.
|
||||
|
||||
.. datatemplate:json:: ../../capabilities-data/dist/capabilities.json
|
||||
:template: capabilities-template-encoding.jinja
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Available Profiles
|
||||
------------------
|
||||
:Last Reviewed: 2023-07-29
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
The following list describes which printer profiles are
|
||||
available in this release.
|
||||
|
@ -12,6 +12,7 @@ that this printer actually can be controlled by this library.
|
|||
If you find any issues with the described capabilities,
|
||||
please open an issue in the
|
||||
`ESC/POS printer database <https://github.com/receipt-print-hq/escpos-printer-db>`_.
|
||||
The data shown here is directly taken from there.
|
||||
|
||||
.. datatemplate:json:: ../../capabilities-data/dist/capabilities.json
|
||||
:template: capabilities-template.jinja
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Capabilities
|
||||
------------
|
||||
:Last Reviewed: 2023-07-29
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
Since the used command set often differs between printers,
|
||||
a model for supporting different printers is implemented.
|
||||
|
|
|
@ -11,3 +11,4 @@ python-barcode>=0.11.0,<1
|
|||
importlib-metadata
|
||||
importlib_resources
|
||||
sphinxcontrib.datatemplates
|
||||
pycups
|
||||
|
|
|
@ -1,19 +1,29 @@
|
|||
Printing Barcodes
|
||||
-----------------
|
||||
|
||||
:Last Reviewed: 2023-05-16
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
Many printers implement barcode printing natively.
|
||||
This hardware renderered barcodes are fast but the supported formats are limited by the printer itself and different between models.
|
||||
However, almost all printers support printing images, so barcode renderization can be performed externally by software and then sent to the printer as an image.
|
||||
As a drawback, this operation is much slower and the user needs to know and choose the image implementation method supported by the printer's commandset.
|
||||
This hardware renderered barcodes are fast but the supported
|
||||
formats are limited by the printer itself and different between models.
|
||||
However, almost all printers support printing images, so barcode
|
||||
rendering can be performed externally by software and then sent
|
||||
to the printer as an image.
|
||||
As a drawback, this operation is much slower and the user needs
|
||||
to know and choose the image implementation method supported by
|
||||
the printer's commandset.
|
||||
|
||||
barcode-method
|
||||
~~~~~~~~~~~~~~
|
||||
Since version 3.0, the ``barcode`` method unifies the previous ``barcode`` (hardware) and ``soft_barcode`` (software) methods.
|
||||
It is able to choose automatically the best printer implementation for barcode printing based on the capabilities of the printer and the type of barcode desired.
|
||||
To achieve this, it relies on the information contained in the escpos-printer-db profiles.
|
||||
The chosen profile needs to match the capabilities of the printer as closely as possible.
|
||||
Since version 3.0, the ``barcode`` method unifies the previous
|
||||
``barcode`` (hardware) and ``soft_barcode`` (software) methods.
|
||||
It is able to choose automatically the best printer implementation
|
||||
for barcode printing based on the capabilities of the printer
|
||||
and the type of barcode desired.
|
||||
To achieve this, it relies on the information contained in the
|
||||
escpos-printer-db profiles.
|
||||
The chosen profile needs to match the capabilities of the printer
|
||||
as closely as possible.
|
||||
|
||||
.. py:currentmodule:: escpos.escpos
|
||||
|
||||
|
@ -33,4 +43,5 @@ For alphanumeric CODE128 you have to preface your payload with `{B`.
|
|||
# print CODE128 012ABCDabcd
|
||||
p.barcode("{B012ABCDabcd", "CODE128", function_type="B")
|
||||
|
||||
A very good description on CODE128 is also on `Wikipedia <https://en.wikipedia.org/wiki/Code_128>`_.
|
||||
A very good description on CODE128 is also on
|
||||
`Wikipedia <https://en.wikipedia.org/wiki/Code_128>`_.
|
||||
|
|
|
@ -1,24 +1,31 @@
|
|||
.. _user_installation:
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
:Last Reviewed: 2016-07-23
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
Installation with PIP
|
||||
---------------------
|
||||
Installation should be rather straight-forward. python-escpos is on PyPi, so you can simply enter:
|
||||
Installation should be rather straight-forward. python-escpos is on PyPi,
|
||||
so you can simply enter:
|
||||
|
||||
::
|
||||
|
||||
pip install python-escpos
|
||||
|
||||
This should install all necessary dependencies. Apart from that python-escpos should also be
|
||||
available as a Debian package. If you want to always benefit from the newest stable releases you should probably
|
||||
install from PyPi.
|
||||
This should install all necessary dependencies. Apart from that
|
||||
python-escpos is for some versions also available as a Debian package.
|
||||
If you want to always benefit from the newest stable releases you should
|
||||
always install from PyPi.
|
||||
If you use the ``--pre`` parameter for ``pip``, you will get the latest
|
||||
pre-release.
|
||||
|
||||
Setup udev for USB-Printers
|
||||
---------------------------
|
||||
1. Get the *Product ID* and *Vendor ID* from the lsusb command
|
||||
``# lsusb Bus 002 Device 001: ID 1a2b:1a2b Device name``
|
||||
``# lsusb Bus 002 Device 001: ID 1a2b:1a2b Device name``.
|
||||
(Or whichever way your system supplies to get the PID and VID.)
|
||||
|
||||
2. Create a udev rule to let users belonging to *dialout* group use the
|
||||
printer. You can create the file
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
Methods
|
||||
=======
|
||||
|
||||
:Last Reviewed: 2017-01-25
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
Escpos class
|
||||
------------
|
||||
|
||||
The core part of this libraries API is the Escpos class.
|
||||
The core part of the API of this library is the Escpos class.
|
||||
You use it by instantiating a :doc:`printer <printers>` which is a child of Escpos.
|
||||
The following methods are available:
|
||||
|
||||
|
|
|
@ -1,15 +1,18 @@
|
|||
Printers
|
||||
========
|
||||
|
||||
:Last Reviewed: 2022-11-25
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
As of now there are 7 different type of printer implementations.
|
||||
As of now there are 8 different types of printer implementations.
|
||||
|
||||
USB
|
||||
---
|
||||
The USB-class uses pyusb and libusb to communicate with USB-based
|
||||
printers. Note that this driver is not suited for USB-to-Serial-adapters
|
||||
and similiar devices, but only for those implementing native USB.
|
||||
printers.
|
||||
|
||||
.. note::
|
||||
This driver is not suited for USB-to-Serial-adapters
|
||||
and similiar devices, but only for those implementing native USB.
|
||||
|
||||
.. autoclass:: escpos.printer.Usb
|
||||
:members:
|
||||
|
@ -44,20 +47,24 @@ This driver is based on the socket class.
|
|||
|
||||
Troubleshooting
|
||||
^^^^^^^^^^^^^^^
|
||||
Problems with a network-attached printer can have numerous causes. Make sure that your device has a proper IP address.
|
||||
Often you can check the IP address by triggering the self-test of the device. As a next step try to send text
|
||||
manually to the device. You could use for example:
|
||||
Problems with a network-attached printer can have numerous causes.
|
||||
Make sure that your device has a proper IP address.
|
||||
Often you can check the IP address by triggering the self-test of the device.
|
||||
As a next step try to send text manually to the device.
|
||||
You could use for example:
|
||||
|
||||
::
|
||||
|
||||
echo "OK\n" | nc IPADDRESS 9100
|
||||
# the port number is often 9100
|
||||
|
||||
As a last resort try to reset the interface of the printer. This should be described in its manual.
|
||||
As a last resort try to reset the interface of the printer.
|
||||
This should be described in its manual.
|
||||
|
||||
File
|
||||
----
|
||||
This printer "prints" just into a file-handle. Especially on \*nix-systems this comes very handy.
|
||||
This printer "prints" just into a file-handle.
|
||||
Especially on \*nix-systems this comes very handy.
|
||||
|
||||
.. autoclass:: escpos.printer.File
|
||||
:members:
|
||||
|
@ -67,8 +74,8 @@ This printer "prints" just into a file-handle. Especially on \*nix-systems this
|
|||
|
||||
Dummy
|
||||
-----
|
||||
The Dummy-printer is mainly for testing- and debugging-purposes. It stores
|
||||
all of the "output" as raw ESC/POS in a string and returns that.
|
||||
The Dummy-printer is mainly for testing- and debugging-purposes.
|
||||
It stores all of the "output" as raw ESC/POS in a string and returns that.
|
||||
|
||||
.. autoclass:: escpos.printer.Dummy
|
||||
:members:
|
||||
|
@ -82,7 +89,10 @@ Supports both local and remote CUPS printers and servers.
|
|||
The printer must be properly configured in CUPS administration.
|
||||
The connector generates a print job that is added to the CUPS queue.
|
||||
|
||||
.. todo:: fix import in documentation
|
||||
.. autoclass:: escpos.printer.CupsPrinter
|
||||
:members:
|
||||
:member-order: bysource
|
||||
:noindex:
|
||||
|
||||
LP
|
||||
----
|
||||
|
@ -91,10 +101,19 @@ Supports local and remote CUPS printers.
|
|||
The printer must be properly configured in CUPS administration.
|
||||
The connector spawns a new sub-process where the command lp is executed.
|
||||
|
||||
No dependencies required, but somehow the print queue will affect some print job such as barcode.
|
||||
No dependencies required, but somehow the print queue will affect some
|
||||
print job such as barcode.
|
||||
|
||||
.. autoclass:: escpos.printer.LP
|
||||
:members:
|
||||
:special-members:
|
||||
:member-order: bysource
|
||||
:noindex:
|
||||
|
||||
Win32Raw
|
||||
--------
|
||||
This driver uses a native WIN32 interface of Windows in order to print.
|
||||
Please refer to the code for documentation as this driver is currently
|
||||
not included in the documentation build.
|
||||
|
||||
.. todo:: Include Win32Raw in documentation build
|
||||
|
|
|
@ -1,41 +1,26 @@
|
|||
Raspberry Pi
|
||||
============
|
||||
|
||||
:Last Reviewed: 2017-01-05
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
This instructions were tested on Raspbian Jessie.
|
||||
|
||||
.. warning:: You should **never** directly connect an printer with RS232-interface (serial port) directly to
|
||||
a Raspberry PI or similar interface (e.g. those simple USB-sticks without encasing). Those interfaces are
|
||||
based on 5V- or 3,3V-logic (the latter in the case of Raspberry PI). Classical RS232 uses 12V-logic and would
|
||||
**thus destroy your interface**. Connect both systems with an appropriate *level shifter*.
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
First, install the packages available on Raspbian.
|
||||
|
||||
::
|
||||
|
||||
sudo apt-get install python3 python3-setuptools python3-pip libjpeg8-dev
|
||||
.. warning:: You should **never** directly connect an printer with RS232-interface
|
||||
(serial port) directly to a Raspberry PI or similar interface
|
||||
(e.g. those simple USB-sticks without encasing).
|
||||
Those interfaces are based on 5V- or 3,3V-logic
|
||||
(the latter in the case of Raspberry PI).
|
||||
Classical RS232 uses 12V-logic and would **thus destroy your interface**.
|
||||
Connect both systems with an appropriate *level shifter*.
|
||||
|
||||
Installation
|
||||
------------
|
||||
You can install by using pip3.
|
||||
|
||||
::
|
||||
|
||||
sudo pip3 install --upgrade pip
|
||||
sudo pip3 install python-escpos
|
||||
The installation should be performed as described in :ref:`user_installation`.
|
||||
|
||||
Run
|
||||
---
|
||||
You need sudo and python3 to run your program.
|
||||
You can run this software as on any other Linux system.
|
||||
|
||||
::
|
||||
|
||||
sudo python3 your-program.py
|
||||
|
||||
Now you can attach your printer and and test it with the example code in the project's set of examples.
|
||||
You can find that in the `project-repository <https://github.com/python-escpos/python-escpos>`__.
|
||||
Attach your printer and test it with the example code in the project's set of examples.
|
||||
You can find that in the
|
||||
`project-repository <https://github.com/python-escpos/python-escpos>`__.
|
||||
|
||||
For more details on this check the :doc:`installation-manual <installation>`.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Usage
|
||||
=====
|
||||
|
||||
:Last Reviewed: 2017-06-10
|
||||
:Last Reviewed: 2023-08-10
|
||||
|
||||
Define your printer
|
||||
-------------------
|
||||
|
|
|
@ -45,6 +45,8 @@ HW_RESET = ESC + b"\x3f\x0a\x00" # Reset printer hardware
|
|||
_CASH_DRAWER = (
|
||||
lambda m, t1="", t2="": ESC + b"p" + m + six.int2byte(t1) + six.int2byte(t2)
|
||||
)
|
||||
|
||||
#: decimal cash drawer kick sequence
|
||||
CD_KICK_DEC_SEQUENCE = (
|
||||
lambda esc, p, m, t1=50, t2=50: six.int2byte(esc)
|
||||
+ six.int2byte(p)
|
||||
|
@ -52,8 +54,10 @@ CD_KICK_DEC_SEQUENCE = (
|
|||
+ six.int2byte(t1)
|
||||
+ six.int2byte(t2)
|
||||
)
|
||||
CD_KICK_2 = _CASH_DRAWER(b"\x00", 50, 50) # Sends a pulse to pin 2 []
|
||||
CD_KICK_5 = _CASH_DRAWER(b"\x01", 50, 50) # Sends a pulse to pin 5 []
|
||||
#: Sends a pulse to pin 2 []
|
||||
CD_KICK_2 = _CASH_DRAWER(b"\x00", 50, 50)
|
||||
#: Sends a pulse to pin 5 []
|
||||
CD_KICK_5 = _CASH_DRAWER(b"\x01", 50, 50)
|
||||
|
||||
# Paper Cutter
|
||||
_CUT_PAPER = lambda m: GS + b"V" + m
|
||||
|
|
|
@ -1021,8 +1021,11 @@ class Escpos(object):
|
|||
def cashdraw(self, pin):
|
||||
"""Send pulse to kick the cash drawer
|
||||
|
||||
Kick cash drawer on pin 2 or pin 5 according to default parameter.
|
||||
For non default parameter send a decimal sequence i.e. [27,112,48] or [27,112,0,25,255]
|
||||
Kick cash drawer on pin 2 (:py:const:`~escpos.constants.CD_KICK_2`)
|
||||
or pin 5 (:py:const:`~escpos.constants.CD_KICK_5`)
|
||||
according to the default parameters.
|
||||
For non default parameters send a decimal sequence i.e.
|
||||
[27,112,48] or [27,112,0,25,255].
|
||||
|
||||
:param pin: pin number, 2 or 5 or list of decimals
|
||||
:raises: :py:exc:`~escpos.exceptions.CashDrawerError`
|
||||
|
@ -1094,7 +1097,7 @@ class Escpos(object):
|
|||
def print_and_feed(self, n=1):
|
||||
"""Print data in print buffer and feed *n* lines
|
||||
|
||||
if n not in range (0, 255) then ValueError will be raised
|
||||
If n not in range (0, 255) then a ValueError will be raised.
|
||||
|
||||
:param n: number of n to feed. 0 <= n <= 255. default: 1
|
||||
:raises ValueError: if not 0 <= n <= 255
|
||||
|
@ -1144,17 +1147,24 @@ class Escpos(object):
|
|||
def panel_buttons(self, enable=True):
|
||||
"""Controls the panel buttons on the printer (e.g. FEED)
|
||||
|
||||
When enable is set to False the panel buttons on the printer will be disabled. Calling the method with
|
||||
enable=True or without argument will enable the panel buttons.
|
||||
When enable is set to False the panel buttons on the printer
|
||||
will be disabled.
|
||||
Calling the method with `enable=True` or without argument
|
||||
will enable the panel buttons.
|
||||
|
||||
If panel buttons are enabled, the function of the panel button, such as feeding, will be executed upon pressing
|
||||
the button. If the panel buttons are disabled, pressing them will not have any effect.
|
||||
If panel buttons are enabled, the function of the panel button,
|
||||
such as feeding, will be executed upon pressing the button.
|
||||
If the panel buttons are disabled, pressing them will not have
|
||||
any effect.
|
||||
|
||||
This command is effective until the printer is initialized, reset or power-cycled. The default is enabled panel
|
||||
buttons.
|
||||
This command is effective until the printer is initialized,
|
||||
resetted or power-cycled.
|
||||
The default is enabled panel buttons.
|
||||
|
||||
Some panel buttons will always work, especially when printer is opened. See for more information the manual
|
||||
of your printer and the escpos-command-reference.
|
||||
Some panel buttons will always work, especially when the
|
||||
printer is opened.
|
||||
See for more information the manual of your printer and
|
||||
the escpos-command-reference.
|
||||
|
||||
:param enable: controls the panel buttons
|
||||
:rtype: None
|
||||
|
@ -1166,7 +1176,8 @@ class Escpos(object):
|
|||
|
||||
def query_status(self, mode):
|
||||
"""
|
||||
Queries the printer for its status, and returns an array of integers containing it.
|
||||
Queries the printer for its status, and returns an array
|
||||
of integers containing it.
|
||||
|
||||
:param mode: Integer that sets the status mode queried to the printer.
|
||||
- RT_STATUS_ONLINE: Printer status.
|
||||
|
|
|
@ -440,9 +440,11 @@ if _CUPSPRINT:
|
|||
"""Simple CUPS printer connector.
|
||||
|
||||
.. note::
|
||||
Requires _pycups_ which in turn needs the cups development library package:
|
||||
- Ubuntu/Debian: _libcups2-dev_
|
||||
- OpenSuse/Fedora: _cups-devel_
|
||||
|
||||
Requires ``pycups`` which in turn needs the cups development library package:
|
||||
- Ubuntu/Debian: ``libcups2-dev``
|
||||
- OpenSuse/Fedora: ``cups-devel``
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, printer_name=None, *args, **kwargs):
|
||||
|
|
Loading…
Reference in New Issue