Landscape printing

Ray Stacey ray.stacey at cgi.com
Tue Aug 2 05:24:22 PDT 2011


> Ray Stacey wrote:
>
> >> Ray Stacey wrote:
> >>
> >> >> Ray Stacey wrote:
> >> >>
> >> >> >> Ray Stacey wrote:
> >> >> >>
> >> >> >> >> Ray Stacey wrote:
> >> >> >> >>
> >> >> >> >> >> Ray Stacey wrote:
> >> >> >> >> >>
> >> >> >> >> >> > We are running cups 1.4.7 on Solaris 10. I'm trying to
> >> >> >> >> >> > print a postscript file from our application using the
> >> >> >> >> >> > command lp -o landscape -o PageSize=Legal -d treekill2
> >> >> >> >> >> > INV-R200.r01.17206.ps.
> >> >> >> >> >> >
> >> >> >> >> >> > The file prints on legal paper, however the first page is
> >> >> >> >> >> > landscape and each subsequent page is rotated 90 degrees.
> >> >> >> >> >> > So the first page is fine, the 5th page is fine, the 9th
> >> >> >> >> >> > page is fine ....
> >> >> >> >> >> >
> >> >> >> >> >> > Any ideas??
> >> >> >> >> >>
> >> >> >> >> >> What make and model is the printer?
> >> >> >> >> >> How is it configured?
> >> >> >> >> >> is there a *cupsFilter line in the printer's PPD?
> >> >> >> >> >> is there a *LandscapeOrientation: xxxx
> >> >> >> >> >> where xxxx is either Plus90 or Minus90 in the PPD?
> >> >> >> >> >>
> >> >> >> >> >> Helge
> >> >> >> >> >>
> >> >> >> >> > It's an HP 8100. It is configured using the ppd file from the
> >> >> >> >> > cups website. THere is no *cupsFilter and LandscapeOrientation
> >> >> >> >> > is Plus90.
> >> >> >> >> >
> >> >> >> >> > I tried the same command with a generic postscript sample file
> >> >> >> >> > and I'm not seeing the rotation problem. That means there is
> >> >> >> >> > something wrong with the postscript output from our
> >> >> >> >> > application. No idea what it could be, I don't know postscript
> >> >> >> >> > language at all.
> >> >> >> >>
> >> >> >> >> Then post (an URL to) a sample file and do the following:
> >> >> >> >> cupsctl --debug-logging
> >> >> >> >> print the sample file
> >> >> >> >> cupsctl --no-debug-logging
> >> >> >> >> post the portion of the /var/log/cups/error_log that contains
> >> >> >> >> the messages related to the test job.
> >> >> >> >>
> >> >> >> >> Helge
> >> >> >> >>
> >> >> >> > Here you go:
> >> >> >> >
> >> >> >> > http://home.sourcecable.net/~raystacey/test.ps
> >> >> >> >
> >> >> >>
> >> >> >> Ray,
> >> >> >>
> >> >> >> your PostScript job itself contains the necessary transformation
> >> >> >> for landscape printing, and the contents of each page - including
> >> >> >> the showpage execution - is enclosed in a save / restore pair.
> >> >> >> Thus, the transformation inserted by cups' pstops filter for
> >> >> >> landscape printing acts outside the page contents bracketed by save
> >> >> >> and restore what results in every page rotated by 90 degrees with
> >> >> >> respect to the previous.
> >> >> >>
> >> >> >> Please try printing without the "-o landscape" option; I'm pretty
> >> >> >> sure you'll get the right printout then.
> >> >> >>
> >> >> >> Helge
> >> >> >>
> >> >> > I see what you mean. However, if I print without "-o landscape" it
> >> >> > prints in portrait mode. The printout is on legal, but it is not
> >> >> > rotated.
> >> >>
> >> >> Well, can you modify your application to output a PostScript stream as
> >> >> indicated by the following context diff output?
> >> >>
> >> >>>
> >> >> If not, I'd suggest to set up a prefilter or similar that does the
> >> >> modification.
> >> >>
> >> >> Helge
> >> >>
> >> >>
> >> >
> >> > I made those changes to my test.ps and it printed properly. Can you
> >> > explain what the difference is, it's not clear to me?
> >>
> >> Well, fairly early in the setup section, there is the statement
> >>
> >> [ 582.0 1008.0 108.0 75.0 12.0 12.0 true 30.0 2.0 0.995000 false true
> >> [ false true true true ] init
> >>
> >> which, in essence, configures the page layout (or the page geometry,
> >> whatever you like). The last item in the array (the stuff between the
> >> brackets) defines if landscape transformation is to be done or not, and
> >> the last statement in the PostScript procedure which makes up the init
> >> operator just executes the transformation if specified for the first
> >> time, so that it will be active for the first page. For the subsequent
> >> pages this transformation is repeated within the newpage procedure.
> >>
> >> On the other hand, cups' pstops filter inserts the defaults from the PPD
> >> preferably just after the %%BeginSetup comment line (or around some other
> >> suitable comment line, if the %%BeginSetup is missing).
> >> Most of the statements inserted from the PPD defaults call the
> >> setpagedevice operator, which resets the graphic state to some extent,
> >> espeically reverts to the default coordinate system. That means, the
> >> landscape transformation executed by the init procedure preceding the
> >> call of setpagedevice is undone by the latter.
> >>
> >> My proposed modification ensures that the init call is the last statement
> >> in the setup section.
> >>
> >> Helge
> >>
> >> PS: Note that this modification is not (yet) totally bomb proof. It would
> >> be better to (1) delete the statement
> >> DoRotate { 0 Hpts translate -90 rotate } if
> >> from the init procedure, and
> >> (2) insert just after the line
> >> /Saveobj save def
> >> the statements
> >> DoRotate { 0 Hpts translate -90 rotate } if
> >> iYpos
> >>
> >>
> >> for the first (and only the first) page.
> >>
> >
> > I get it now. I will see about our code. I really appreciate your help.
> > Thanks!
>
> Here is a version that seems to be "bomp proof", as it even passes though
> my heavily modified pstops filter. See the diff:
>
> ---snip---
> *** test.ps	2011-07-28 23:41:40.000000000 +0200
> --- test-ok.ps	2011-07-29 23:56:31.000000000 +0200
> ***************
> *** 2,9 ****
> --- 2,11 ----
>   %%Title: (atend)
>   %%Creator: rstacey (Ray Stacey)
>   %%CreationDate: Wed Jul 20 08:07:38 2011
> + %%BoundingBox: 0 0 582 1008
>   %%Pages: 9
>   %%EndComments
> + %%BeginProlog
>   /psfdict 250 dict def
>   psfdict begin
>   /Psf save def
> ***************
> *** 189,194 ****
> --- 191,202 ----
>   		iYpos
>   		bTEMPLATE
>   		showpage
> + 		% DoRotate { 0 Hpts translate -90 rotate } if
> + 		% iYpos
> + 	}
> + 	bind def
> + /beginpage
> + 	{
>   		DoRotate { 0 Hpts translate -90 rotate } if
>   		iYpos
>   	}
> ***************
> *** 234,241 ****
>   		/MoPage			SoPage EoPage add 2 div def
>   		/MoLine			EoLine SoLine add 2 div def
>   		/NoStripes		Vpts SThick div round def
> ! 		DoRotate { 0 Hpts translate -90 rotate } if
> ! 		iYpos
>   	}
>   	bind def
>   /pageno_set				%stack: array => -
> --- 242,249 ----
>   		/MoPage			SoPage EoPage add 2 div def
>   		/MoLine			EoLine SoLine add 2 div def
>   		/NoStripes		Vpts SThick div round def
> ! 		% DoRotate { 0 Hpts translate -90 rotate } if
> ! 		% iYpos
>   	}
>   	bind def
>   /pageno_set				%stack: array => -
> ***************
> *** 419,424 ****
> --- 427,434 ----
>   stdtemplate
>   bHEADER
>   } bind def
> + %%EndProlog
> + %%BeginSetup
>   [ 582.0 1008.0 108.0 75.0 12.0 12.0 true 30.0 2.0 0.995000 false true false true true true ] init
>   /Helvetica findfont
>   dup length dict begin
> ***************
> *** 749,755 ****
>   399.0 12.0 dYpos l
>   0.0 aYpos
>   } bind def
> ! %%EndProlog
>   %%Page: 1 1
>   %%Key: INVENTORY=000000FA
>   %%Key: DEPARTMENT=OPS
> --- 759,765 ----
>   399.0 12.0 dYpos l
>   0.0 aYpos
>   } bind def
> ! %%EndSetup
>   %%Page: 1 1
>   %%Key: INVENTORY=000000FA
>   %%Key: DEPARTMENT=OPS
> ***************
> *** 757,762 ****
> --- 767,773 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /Bheader [
>   ()
> ***************
> *** 1637,1642 ****
> --- 1648,1654 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /bTEMPLATE {
>   stdtemplate
> ***************
> *** 2587,2592 ****
> --- 2599,2605 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /bTEMPLATE {
>   stdtemplate
> ***************
> *** 3537,3542 ****
> --- 3550,3556 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /bTEMPLATE {
>   stdtemplate
> ***************
> *** 4487,4492 ****
> --- 4501,4507 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /bTEMPLATE {
>   stdtemplate
> ***************
> *** 5437,5442 ****
> --- 5452,5458 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /bTEMPLATE {
>   stdtemplate
> ***************
> *** 6387,6392 ****
> --- 6403,6409 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /bTEMPLATE {
>   stdtemplate
> ***************
> *** 7337,7342 ****
> --- 7354,7360 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /bTEMPLATE {
>   stdtemplate
> ***************
> *** 8287,8292 ****
> --- 8305,8311 ----
>   %%Key: BUSINESS_UNIT=TOR
>   %%Key: INSTITUTION=LAT
>   /Saveobj save def
> + beginpage
>   /Title (Traders Inventory Valuation - Current) def
>   /bTEMPLATE {
>   stdtemplate
> ---snip---
>
> I have added a %%BoundingBox comment line which prevents the
> pstops filter from complaining about missing bounding box, but as long
> as you do not use options like number-up etc., this doesn't really matter.
>
> The main difference to the preceding version is that the landscape
> transformation is now executed by the new procedure beginpage.
>
> Helge
>
I was able to make these changes to our code and it works like a charm. I can use the various printer options, they all work. The generated postscript even prints fine with our existing Solaris printing subsystem (non-ppd). Again, thank you for all your help.




More information about the cups mailing list