All of lore.kernel.org
 help / color / mirror / Atom feed
* [Printing-architecture] Two more PDF CUPS filters: pstopdf and cpdftocps ("PostScript driver")
@ 2008-08-04  8:35 Till Kamppeter
       [not found] ` <48971403.9090006@easysw.com>
  0 siblings, 1 reply; 4+ messages in thread
From: Till Kamppeter @ 2008-08-04  8:35 UTC (permalink / raw)
  To: printing-architecture@lists.linux-foundation.org, Printing-japan,
	Lars Uebernickel, Michael Sweet, OTANI Koji, Hin-Tak Leung,
	Tobias Hoffmann

Hi,

to complete the PDF printing workflow there are two more, rather simple
CUPS filters needed: pstopdf and cpdftocps.


pstopdf
-------

This filter kicks in if a legacy application emits its print jobs in
PostScript. I started about something very simple, like the pstoraster
and pstopxl wrapper scripts which come with Ghostscript, only that this
wrapper will use "pdfwrite" as output device. This will at least work
for apps which supply the options as job attributes (attributes for the
CUPS library function to submit a job, or command line options for the
"lpr" command).

It is possible and legal that applications supply the options embedded
in the PostScript data stream. For that options to work, the pstopdf
filter needs an extension: It must read the PostScript data stream
before feeding it into Ghostscript for conversion and whenever it finds
a line like

%%BeginFeature: <option>=<value>

to add the key value pair to a JCL header for the output:

pdftopdf jobInfo: <option>=<value>
<option2>=<value2>
...
%PDF-1.3
...

pdftopdf must read this JCL header and pass it through to the next
filter, perhaps interpret some options by itself, like PageSize. Driver
filters like pdftoraster, pdftopvp, pdftoijs, cpdftocps, and
foomatic-rip have to read out these option settings to control the
driver accordingly.

I think this is the only and easiest way in the CUPS architecture to
propagate options which are embedded in PostScript input.

This is a way to get a complete PDF printing workflow (page management 
always through pdftopdf, never through pstops) without regressions (like 
loss of option settings embedded in PostScript data stream). Problem is 
that many of the other filters (all with PDF or CUPS PDF as input 
format) will need to be changed to be able to read out and pass on the 
JCL header with the option settings.

Alternatively, the pstopdf filter can be left out and then PostScript 
input goes its old way through pstops, but these means that page 
management keeps unreliable for legacy applications with PostScript 
printing output and driver PPDs must be made in a way that both PDF and 
PostScript input is possible for a longer time.


cpdftocps
---------

This filter converts application/vnd.cups-pdf to
application/vnd.cups-postscript. It runs after the pdftopdf filter to
support manufacturer-supplied PostScript printer PPD files without
"cupsFilter" line or legacy PPDs which do not explicitly support the PDF
printing workflow (only one "cupsFilter" line with 
application/vnd.cups-postscript as input format). Therefore we call this 
filter "PostScript driver", as it allows to print on output devices 
which understand only PostScript.

The filter can be a wrapper script around other filters. At first 
pdftops is called with the same command line parameters as they were 
used for calling the cpdftocps script. After that the data is passed 
through pstops, but in the call of pstops we filter all CUPS options out 
of the fifth command line argument (we leave only the PPD options in the 
fifth argument) so that only the PPD options get embedded into the 
PostScript data stream but the page management will not get repeated. 
Otherwise we would get unwished effects like N-up getting N^2-up.

This filter will assure that any legacy PPD file/printer driver can be 
continued to be used with a PDF workflow. This keeps especially print 
queues working which existed before when updating from a 
PostScript-printing-based version of the OS to a PDF-printing-based version.


Anyone wants to code these filters? They are not too complicated scripts 
or they can also be made by rearranging some existing CUPS code.

    Till




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Printing-architecture] Two more PDF CUPS filters: pstopdf and cpdftocps ("PostScript driver")
       [not found] ` <48971403.9090006@easysw.com>
@ 2008-08-04 17:01   ` Till Kamppeter
  2008-08-12 10:06   ` Till Kamppeter
  1 sibling, 0 replies; 4+ messages in thread
From: Till Kamppeter @ 2008-08-04 17:01 UTC (permalink / raw)
  To: Michael Sweet
  Cc: OTANI Koji, Chris Cheney, seb128, Tobias Hoffmann, Printing-japan,
	printing-architecture@lists.linux-foundation.org, Hin-Tak Leung

Michael Sweet wrote:
> Till Kamppeter wrote:
>> Hi,
>>
>> to complete the PDF printing workflow there are two more, rather simple
>> CUPS filters needed: pstopdf and cpdftocps.
> 
> Comments in-line.  In short, only pstopdf is needed.
> 
>> pstopdf
>> -------
>>
>> This filter kicks in if a legacy application emits its print jobs in
>> PostScript. I started about something very simple, like the pstoraster
> 
> Since this filter would need to be based on Ghostscript, limit the
> scope of the pstopdf filter to convert application/postscript to
> application/pdf, which can then be filtered through pdftopdf to
> support PDF printers.
> 
> PostScript printers would use pstops.
> 
> Raster printers would use pstoraster plus their raster filter.
> 
> As for getting options from the PostScript data stream, today we
> can embed page size and duplex mode in the PDF document.  Supporting
> other embedded features is not feasible, although applications can
> use the CUPS PS job ticket comments at the top of the file:
> 
>     %!PS-Adobe-3.0
>     %cupsJobTicket: option=value ... option=value
>     %cupsJobTicket: option=value ... option=value
>     %cupsJobTicket: option=value ... option=value
>     ... other PS comments
>     %%EndComments
> 
>> cpdftocps
>> ---------
>>
>> This filter converts application/vnd.cups-pdf to
>> application/vnd.cups-postscript. It runs after the pdftopdf filter to
>> support manufacturer-supplied PostScript printer PPD files without
>  > ...
> 
> This filter is NOT required.  We ALREADY have a pdftops filter that
> takes application/pdf and produces application/ps, which is then run
> through pstops for PostScript printers.  We DO NOT want to have a
> filter for every combination of file formats because it will be a
> maintenance nightmare.
> 

So this would mean that a real PDF workflow (always using the pdftopdf 
filter) would only happen if

- The printer is a PDF printer
- The printer/driver PPD takes exclusively CUPS PDF

In the following cases pdftopdf will be at least be used if the input is 
PDF, an image, or text:

- The printer/driver PPD takes CUPS raster (then we can go through
   pdftopdf + pdftoraster or pstops + pstoraster)
- The printer/driver PPD has cupsFilter lines for both PDF and
   PostScript input (Foomatic 4.0 or OpenPrinting Vector)

In case of PostScript input they would lead to pstops + pstoraster or 
pstops + foomatic-rip filter chain and so they are subject to page 
management problems caused by bad PostScript input.

If we can assume that the pdftops filter produces fully DSC-conforming 
PostScript (Is this the case?), then we solve all page management 
problems if all apps send jobs in PDF, as CUPS takes then care of clean 
PostScript by generating it with the pdftops filter. Then page 
management issues get even solved with current CUPS, without adding all 
the new PDF filters. In addition, apps producing PDF jobs can also not 
raise problems with embedded option settings. They HAVE to send option 
settings as job attributes.

So the most important step to benefit from PDF as standard print job 
format is to make all apps outputting print jobs in PDF instead of in 
PostScript. This solves at least all page management problems and 
reduces the job size. This also leads to a complete PDF workflow if the 
printer or driver understands PDF.

Printers and drivers which accept PDF make up a complete PDF workflow if 
the input data is PDF and so these can make use of the additional PDF 
benefits like more sophisticated graphical elements and color management.

The pstopdf filter should be handled with caution as it can lead to the 
loss of embedded option setting code. So it should have a high cost 
factor to make it only be used in the case that it is really needed, 
like if an application produces PostScript output and the output device 
is PDF-only (and in this case the PDF should not contain embeddable 
PostScript code).

So we will only add the simple Ghostscript-based pstopdf printer. One 
question: Does GhostScript embed the PageSize and Duplex settings 
correctly in the PDF file?

Most important for completing the workflow is that all desktop 
developers, application developers and maintainers of appropriate parts 
in distributions make sure that all applications produce PDF output when 
sending print jobs.

    Till

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Printing-architecture] Two more PDF CUPS filters: pstopdf and cpdftocps ("PostScript driver")
       [not found] ` <48971403.9090006@easysw.com>
  2008-08-04 17:01   ` Till Kamppeter
@ 2008-08-12 10:06   ` Till Kamppeter
       [not found]     ` <48A1B133.4050408@easysw.com>
  1 sibling, 1 reply; 4+ messages in thread
From: Till Kamppeter @ 2008-08-12 10:06 UTC (permalink / raw)
  To: Michael Sweet
  Cc: OTANI Koji, Tobias Hoffmann, Printing-japan,
	printing-architecture@lists.linux-foundation.org, Hin-Tak Leung

Michael Sweet wrote:
> As for getting options from the PostScript data stream, today we
> can embed page size and duplex mode in the PDF document.  Supporting
> other embedded features is not feasible, although applications can
> use the CUPS PS job ticket comments at the top of the file:
> 
>     %!PS-Adobe-3.0
>     %cupsJobTicket: option=value ... option=value
>     %cupsJobTicket: option=value ... option=value
>     %cupsJobTicket: option=value ... option=value
>     ... other PS comments
>     %%EndComments
> 

What does CUPS exactly do when it encounters these %cupsJobTicket: 
comments? Which part of CUPS is handling them? How can one benefit from 
them in a PDF printing workflow (PostScript -> PDF -> pdftopdf -> 
pdftoraster ...)? Do they have to be in the beginning of the PS file or 
can they be anywhere?

    Till


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Printing-architecture] Two more PDF CUPS filters: pstopdf and cpdftocps ("PostScript driver")
       [not found]     ` <48A1B133.4050408@easysw.com>
@ 2008-08-12 19:29       ` Till Kamppeter
  0 siblings, 0 replies; 4+ messages in thread
From: Till Kamppeter @ 2008-08-12 19:29 UTC (permalink / raw)
  To: Michael Sweet
  Cc: OTANI Koji, Tobias Hoffmann, Printing-japan,
	printing-architecture@lists.linux-foundation.org, Hin-Tak Leung

Michael Sweet wrote:
> Till Kamppeter wrote:
>> Michael Sweet wrote:
>>> As for getting options from the PostScript data stream, today we
>>> can embed page size and duplex mode in the PDF document.  Supporting
>>> other embedded features is not feasible, although applications can
>>> use the CUPS PS job ticket comments at the top of the file:
>>>
>>>     %!PS-Adobe-3.0
>>>     %cupsJobTicket: option=value ... option=value
>>>     %cupsJobTicket: option=value ... option=value
>>>     %cupsJobTicket: option=value ... option=value
>>>     ... other PS comments
>>>     %%EndComments
>>>
>>
>> What does CUPS exactly do when it encounters these %cupsJobTicket: 
>> comments?
> 
> It adds them as job template attributes (options) for the job.
> 
>  > Which part of CUPS is handling them?
> 
> The scheduler (cupsd) scans application/postscript files for these
> comments.
> 
>  > How can one benefit from
>> them in a PDF printing workflow (PostScript -> PDF -> pdftopdf -> 
>> pdftoraster ...)?
> 
> We could update cupsd to do the same scan for application/pdf;
> PDF supports comments just like PostScript.
>

Good idea, please do it.

>  > Do they have to be in the beginning of the PS file or
>> can they be anywhere?
> 
> They have to be in the initial comment block, after the "%!PS-Adobe"
> line.  The scheduler stops on the first line that does not begin
> with a "%".
> 

Thank you for the info. Did not find anything about that in the 
documentation.

    Till

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-08-12 19:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-04  8:35 [Printing-architecture] Two more PDF CUPS filters: pstopdf and cpdftocps ("PostScript driver") Till Kamppeter
     [not found] ` <48971403.9090006@easysw.com>
2008-08-04 17:01   ` Till Kamppeter
2008-08-12 10:06   ` Till Kamppeter
     [not found]     ` <48A1B133.4050408@easysw.com>
2008-08-12 19:29       ` Till Kamppeter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.