gstoraster: Ghostscript runs to long while converting djvu files to Xerox`s 3210 format

Bug #1920730 reported by Valentyna
12
This bug affects 2 people
Affects Status Importance Assigned to Milestone
cups-filters (Ubuntu)
Fix Released
Undecided
Unassigned

Bug Description

My OS:
Description: Ubuntu 20.04.2 LTS
Release: 20.04

Package version: cups-filters version 1.27.4-1

When I try to print djvu files on my Xerox WorkCentre 3210 gstoraster filter, which calls ghostscript inside runs to long while converting djvu files to Xerox`s 3210 format.
E.x.: For 155 pages of djvu files, it runs more then 15 minutes.

I found a solution by adding -dDEVICEWIDTHPOINTS -dDEVICEHEIGHTPOINTS params to ghostscript command inside gstoraster filter. Now the time of converting the same file is about 30 seconds.
I`ve made patch which solves this problem.

--- a/filter/gstoraster.c
+++ b/filter/gstoraster.c
@@ -733,8 +733,17 @@
     char output[31] = "";
     int pagecount;
     size_t bytes;
- snprintf(gscommand, 65536, "%s -q -dNOPAUSE -dBATCH -sDEVICE=bbox %s 2>&1 | grep -c HiResBoundingBox",
- CUPS_GHOSTSCRIPT, filename);
+ // Ghostscript runs to long while converting djvu files to Xerox`s 3210 format
+ // Using -dDEVICEWIDTHPOINTS -dDEVICEHEIGHTPOINTS params solves the problem
+ if (ppd) {
+ cupsRasterInterpretPPD(&h,ppd,num_options,options,0);
+ snprintf(gscommand, 65536, "%s -q -dNOPAUSE -dBATCH -dDEVICEWIDTHPOINTS=%d -dDEVICEHEIGHTPOINTS=%d -sDEVICE=bbox %s 2>&1 | grep -c HiResBoundingBox",
+ CUPS_GHOSTSCRIPT, h.PageSize[0], h.PageSize[1], filename);
+ }
+ else {
+ snprintf(gscommand, 65536, "%s -q -dNOPAUSE -dBATCH -sDEVICE=bbox %s 2>&1 | grep -c HiResBoundingBox",
+ CUPS_GHOSTSCRIPT, filename);
+ }

     FILE *pd = popen(gscommand, "r");
     if (!pd) {

Revision history for this message
Valentyna (valia0906) wrote :
Revision history for this message
Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in cups-filters (Ubuntu):
status: New → Confirmed
Revision history for this message
Till Kamppeter (till-kamppeter) wrote :

Valentyna, and anyone else affected, could you attach a sample djvu file and also instructions how you print the djvu file, so that we can reproduce the problem and perhaps improve the patch somewhat? This is especially important as we want to carry on the CUPS filters when CUPS will not use PPD files any more.

As the Ghostscript call you are modifying does not more than counting the pages (there is another one for the actual rasterization) could you also try to modify the patch by not calling cupsRasterInterpretPPD() for extracting the default page size from the PPD and instead, simply insert arbitrary height and width, like "-dDEVICEWIDTHPOINTS=612 -dDEVICEHEIGHTPOINTS=792"? This would allow you to remove the "if (ppd)" and so your fix would also work for using the filter without PPD.

Could you try this out? Do you still get fast execution and correct page counts (= filter outputs all pages)?

Changed in cups-filters (Ubuntu):
status: Confirmed → Incomplete
Revision history for this message
Valentyna (valia0906) wrote :

I open evince (simple document viewer on Ubuntu), than I press Ctrl+P and Print. My djvu file has 158 pages. Gstoraster converts it to 3210 format more than 15 minutes. It does not matter which djvu file to print.
My patch still solves the problem, execution is very fast.
I try to put "-dDEVICEWIDTHPOINTS=612 -dDEVICEHEIGHTPOINTS=792" and it also works, but I don`t want to "hardcode" this values. I want to take this values dynamically."if (ppd)" is still present in your code, I just put it as you did.

Revision history for this message
Valentyna (valia0906) wrote :

Example file to test.

Revision history for this message
Till Kamppeter (till-kamppeter) wrote :

Thank you very much for the sample file.

I have printed it into a PDF file from evince to be able to do further tests manually on the command line.

This way I have done some tests and found out that adding "-dDEVICEWIDTHPOINTS=XXX -dDEVICEHEIGHTPOINTS=YYY" with any non-zero values for width and height works (giving the correct page count), small values make it even faster. So for now the best command line is

gs -q -dNOPAUSE -dBATCH -sDEVICE=bbox -dDEVICEWIDTHPOINTS=1 -dDEVICEHEIGHTPOINTS=1 sample2.pdf 2>&1 | grep -c HiResBoundingBox

and this command line is independent of the PPD file.

Revision history for this message
Till Kamppeter (till-kamppeter) wrote :

Fixed upstream.

Valentyna, thank you for the sample file and the proposed patch. I have modified the patch to simplify it and to make it working also without PPD files.

Suraj also thanks to you for taking it upstream and posting your pull request.

Changed in cups-filters (Ubuntu):
status: Incomplete → In Progress
Revision history for this message
Till Kamppeter (till-kamppeter) wrote :
Revision history for this message
Till Kamppeter (till-kamppeter) wrote :

After that long time the upstream fix is already in Ubuntu. Closing ...

Changed in cups-filters (Ubuntu):
status: In Progress → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.