Issues related to hardware problems
Posts: 5
Joined: 2014/12/05 09:40:10


Postby dha-cen » 2017/08/17 15:03:57


/X/ are footnotes

1 BUG-ID 8045

In I described in detail that as of CentOS 6.5 printing
with my Brother MFC-8420 Postscript Printer was no longer possible.

Until now the bug had not been handeled. As the MFC-8420 is a commonly used printer being in
the CUPS/Linux list I was disappointed to be left without printing overnight. I need printing
for my business. So I was forced to find a solution where CUPS (origin of the bug) was no longer

This is to share my investigations and my solution with CentOS/Linux users having similar
problems with printers.


Following the specs the MFC-8420 understands "PCL6" /A/ as well as "PostScript 3" /B/.

CentOS 6 / Gnome 2.28 generate "Postscript Level 2" files /C/ which I will call "" below.

So it was obvious trying to send directly to the printer assuming downward compatibility
for the printer. This was successful as described below.


CUPS and its libraries are processing at the same time incorporating PPD /D/ settings.
Finally this agglomeration of data is sent to the printer. You may look at these data using /E/.

The PPD may add features like addressing a second paper tray, duplex printing, stapling, ...

CUPS' Test Page is created artificially and says little about real life.

On top of CUPS you may install a package called "hpijs-pcl5e" which converts PostScript to PCL.
Of course this can only function if your printer understands PCL. I tried this and the results
for the MFC-8420 are totally unacceptable.


4.1 The printer will be connected to your computer with an USB cable. Upon connection CentOS
(version 6.9 in my case) allocates the device '/dev/usb/lp0'.

Now you can do 'cat > /dev/usb/lp0' and the printer will receive Do not
forget resetting the printer (off/on) when experimenting.

4.2 The printer is connected to a (residential) gateway, FritzBox in my case.
You do 'nc -w 2 192.***.***.*** 9100 <' to make your printer receive For 'nc'
see /E/. '192.***.***.*** 9100' is the same term CUPS would use : IP address of your
router + port 9100. Do not forget resetting the printer (off/on) when experimenting.


Between the '---' lines below my script is printed (personal data are *ed or .ed).
The script is now in "production" for more than one year.

The script should function on each Linux system where PostScript-Version-X files are
generated by a print dialog AND the printer's PostScript version is greater or equal X.

# DHA 12-AUG-2017 (last change)
# note that script is called with "bash /...full path .../"
# this is DHA's Print Service (replacing CUPS)
# postscript files $TEFI are automatically sent to the printer using nc (netcat)
# note that a PID is allocated for this script before this line is read !!!
FIPI=`pgrep -f "bash /...full path .../"` ; set -- $FIPI
if test $# -gt 1 ; then exit ; fi # do not start script again when logging off/logging on
shopt -s dotglob # include hidden files e.g. ".ps"
TEFI=/...full path .../*.ps
while true ; do
if test -f $TEFI ; then
sleep 0.2
nc -w 2 192.***.***.*** 9100 < $TEFI
zenity --window-icon=/home/...full path .../print.png --notification --timeout=2
rm -f $TEFI
sleep 0.5


this "service" is started at logon (or startup/autologon) via
"sys/pref/startup-appl" with "bash /...full path .../ <&- &>/dev/null";
calling a script with 'bash' has some advantages and is clearer than 1.line method

note that this is no genuine Linux service/daemon,
the script consumes 2 PIDs per second; I did not find any limitation to this end; patient
users may increase 0.5 s to whatever they like; killing the script may leave an orphan

the $TEFI directory is also my sceenshot place but you may define it as part of a RAM disk

the zenity statement presents a printer icon in the panel when transfer to printer is done

note that * is for possible different names of 1 file and NOT for a group of files

the "sleep 0.2" is for the case that the test is applied to an emerging file

note that test -f "$TEFI" results to FALSE in case more than 1 file *.ps would exist !
if, for any reasons, 2 files would exist nothing happens and the number of files not being
printed would increase; I did not experience such a case but it may need consideration

all being beyond the features of the normal Print-to-File menu would need scripting effort,
i.e.changing before it is sent to the printer

Of course the script shall not be run under elevated privileges.


/A/ PCL, HP's Printer Command Languge (versions 1...6) is the de facto industry standard;
PCL Technical Reference Manuals are available online

/B/ Brother says 'BR-S3' where 'BR-S3' is footnoted as 'PostScript 3 Emulations'.

"LanguageLevel 3" specs are published in a 897 pages Adobe document "PostScript Language
Reference third edition" of 1999 (available online)

/C/ having GEDIT open with "x.txt" do file/print/print to file/tick 'Postscript' (Name turns
to "")/set "Save in Folder"/(optionally change "Page Setup" or "Text Editor")/
hit "Print". Now you can open "/.../" in GEDIT and look at it. Of course you can
generate *.ps files from all applications having a print-to-file dialog with the
'Postscript' option. Do not be surprised about the sizes of *.ps files : Even if x.txt
would just contain the letter "a" then is likely more than 10 k caused by the
graphical representation. The header of these *.ps files contains "LanguageLevel: 2".

/D/ PPD = PostScript Printer Description File; specs are published in a 236 pages Adobe
document "PostScript Printer Description File Format Specification" Version 4.3 of
9 February 1996 (available online)

/E/ Follow CUPS instructions to create a printer 'TEST' using the PPD belonging to your printer
(normally published by the vendor) or any modified PPD. Tick "AppSocket/..." and enter
as connection : "socket://" Thus the destination is port 9100 of your own
computer and not a network place ! Use nc (=netcat=nc-1.84-24.el6.x86_64=basic repo)
from command line 'nc -l 9100 > info.txt'. Now print whatever you want using the printer
'TEST'. The raw data the printer would have received are now in info.txt.