Verwenden Sie ein Skript als Drucker, um die Ausgabe (PDF) zu verarbeiten.

7

Ich möchte einen "virtuellen" Drucker hinzufügen, um problemlos PDF-Ausgaben von jeder Software zu senden. Der Drucker sollte ein Skript sein, das dann die PDF-Ausgabe verarbeitet. Anwendungsfall könnte "Print to Cloud Storage" oder "Print to Archive" usw. sein.

Die Möglichkeiten, die ich bisher entdeckt habe, sind:

  • CUPS-Pipe-Backend ( hier beschrieben ), das unter Ubuntu nicht verfügbar zu sein scheint.
  • tea4cups ( aus diesem Thread ), an den die Datei lpnach der Vorverarbeitung weitergeleitet wird. Aber ich möchte es nicht wirklich drucken.

Gibt es eine andere einfachere Möglichkeit, das PDF einfach in ein benutzerdefiniertes Bash-Skript zu übertragen?

Simon
quelle

Antworten:

5

Die Hinweise scheinen sich im ersten Link Ihrer Frage zu befinden. Untersuchungen zeigen, dass Backends nur Skripte sind. Sie können also einfach Ihre eigenen schreiben. Es scheint jedoch, dass das gesuchte Skript, das für OpenSuse verfügbar ist, in Ihrem ersten Link beschrieben wird.

Das openSUSE RPM-Paket cups-backends bietet das Bash-Skript / usr / lib / cups / backend / pipe, ein Wrapper-Backend zum Drucken in ein beliebiges Programm.

Das Auffinden dieses Skripts wird durch die Tatsache erschwert, dass OpenSuse jetzt .ymp One-Click-Installer verwendet und Sie etwas tiefer graben müssen, um die tatsächliche RPM zu finden, die das Skript enthält. Hier ist ein Beispiel direkt aus cups-backends-1.1-296.6.noarch.rpm, das hier verfügbar ist.

Das Öffnen des Pakets mit dem Dateiroller und das Navigieren /./usr/lib/cups/backend/innerhalb des Pakets sowie das Öffnen pipezeigt das folgende Skript:

#! /bin/bash
# CUPS wrapper backend "pipe" for printing to any program.
# It forwards the print job data like a pipe into another command.
# Author: Johannes Meixner <[email protected]>, 2009, 2014
# For basic information see "man 7 backend" and "man 7 filter".
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU GENERAL PUBLIC LICENSE Version 2
# as published by the Free Software Foundation.

# Activate the "set -x" line to get debugging info in /var/log/cups/error_log:
#set -x

# Output "Device Discovery" information on stdout:
if test "$#" = "0"
then
  echo 'direct pipe "Unknown" "Forward print job data like a pipe to another command"'
  exit 0
fi

# Output usage information in case of wrong number of parameters:
if test "$#" != "5" -a "$#" != "6"
then
  echo 'Usage: pipe job-id user title copies options [file]' 1>&2
  echo 'Queue setup example:' 1>&2
  echo 'lpadmin -p queue_name -v "pipe:/path/to/command?option1=value1&-option2&value2" -E' 1>&2
  echo 'The command is called with the specified options as:' 1>&2
  echo '/path/to/command option1=value1 -option2 value2' 1>&2
  echo 'The original command line parameters (... job-id user ...)' 1>&2
  echo 'are provided as environment variables PIPE_BACKEND_ARGV[0-6]' 1>&2
  exit 1
fi

# Keep the original command line parameters (... job-id user ...)
# in environment variables to make them available for the command:
export PIPE_BACKEND_ARGV0="$0"
export PIPE_BACKEND_ARGV1="$1"
export PIPE_BACKEND_ARGV2="$2"
export PIPE_BACKEND_ARGV3="$3"
export PIPE_BACKEND_ARGV4="$4"
export PIPE_BACKEND_ARGV5="$5"
export PIPE_BACKEND_ARGV6="$6"

# Have the input at fd0 (stdin) in any case:
if test -n "$6"
then
  exec <"$6"
fi

# To be on the safe side clip anything after the first space character
# because spaces are excluded characters in a URI (see RFC 2396):
URI=${DEVICE_URI%% *}
# Extract the command to which the job schould be sent from the URI.
# Clip the URI scheme (anything up to the first ':' character) and
# clip anything after the first '?' character
# because anything after the first '?' character are options:
COMMAND=${URI#*:}
COMMAND=${COMMAND%%\?*}
# Extract the options (e.g. from 'pipe:/path/to/command?option1=value1&-option2&value2'
# clip anything up to the first '?' character and
# replace the options separator '&' character by a space:
OPTIONS=${URI#*\?}
if test "$OPTIONS" = "$URI"
then
  OPTIONS=""
fi
OPTIONS=$( echo "$OPTIONS" | tr '&' ' ' )
# Options could have been specified in a wrong way
# as addendum to the DeviceURI separated by spaces
# (spaces are excluded characters in a URI, see RFC 2396)
# which works by luck at least for some CUPS versions
# see https://bugzilla.novell.com/show_bug.cgi?id=499735
# like 'pipe:/path/to/command option1=value1 -option2 value2'
# nevertheless use additionally those kind of options too:
MORE_OPTIONS=${DEVICE_URI#* }
if test "$MORE_OPTIONS" = "$DEVICE_URI"
then
  MORE_OPTIONS=""
fi
OPTIONS=$( echo "$OPTIONS" "$MORE_OPTIONS" | tr -s ' ' )

# Test if the command is executable:
if ! test -x "$COMMAND"
then
  echo "Cannot execute $COMMAND" 1>&2
  exit 1
fi

# Replace this wrapper with the actual command
# so that it exits with the exit code of the command
# and that the command gets any signals directly.
exec "$COMMAND" $OPTIONS

Da dies ein Bash-Skript ist, sollten Sie es mit jeder Version von 'nix einschließlich Ubuntu verwenden können, mit einer Bash-Shell, nicht nur mit Suse.

Um Cups ein Backend hinzuzufügen, müssen Sie es kopieren /usr/lib/cups/backendund die Berechtigungen und den Besitz entsprechend festlegen.

chown root:root /usr/lib/cups/backend/pipe

chmod 755 /usr/lib/cups/backend/pipe

Quellen:

https://www.cups.org/doc/man-backend.html

https://build.opensuse.org/package/view_file/Printing/cups-backends/cups-backends.spec?expand=1

Wie extrahiere ich eine RPM-Datei?

Elder Geek
quelle
1
@ pa4080 Danke für die schöne Bearbeitung! Damit war ich nicht vertraut.
Elder Geek
0

Ich suchte das Gleiche, fand aber nichts Leichtes. Ich werde hier schreiben, wie ich es gelöst habe, vielleicht finden andere die Lösung nützlich.

Mein Treiber ist für den manuellen Duplexdruck vorgesehen, aber anstelle des Duplexdrucks (in der Duplexdruckdatei) können Sie Ihren eigenen Code implementieren. Sie haben dort auch einen Installer ...

Der Quellcode befindet sich auf github: https://github.com/dentys03/manual_duplex_linux

Es sollte auf jedem HP Drucker funktionieren. Leicht für andere Drucker geeignet, denke ich.

Denis
quelle