Re: Fix bug 687035, indirect objects in PDF
Ray Johnston <[email protected]>
| Newsgroups | gmane.comp.printing.ghostscript.patches |
|---|---|
| Organization | Artifex Software Inc. |
| Message-ID | <[email protected]> |
Alex,
While testing an alternative, I've encountered some files that had
other problems.
While your patch only "plugs the dike" for these cases, the more
general solution did not pan out. Clearly we will continue to see
files that use indirect reference where the PDF interpreter did
not expect it and will have to deal with them as they occur (or
we will have to re-implement the PDF parser).
Please go ahead and commit your patch.
Regards,
Ray
____________________________________________________________________
Alex Cherepanov wrote:
> Apply oforce to every element of MediaBox and CropBox arrays.
> Fix bug 687035 from customer 831
>
> There are many other array objects in PDF whose elements are
> not yet dereferenced. Should I open another (internal) bug to
> track this ?
>
> oforce_array procedure can use less
> memory (but more time) by checking whether there are any
> indirect references in the array first.
>
>
> ------------------------------------------------------------------------
>
> Index: gs/lib/pdf_base.ps
> ===================================================================
> RCS file: /cvs/ghostscript/gs/lib/pdf_base.ps,v
> retrieving revision 1.38
> diff -b -u -r1.38 pdf_base.ps
> --- gs/lib/pdf_base.ps 29 May 2003 19:02:00 -0000 1.38
> +++ gs/lib/pdf_base.ps 22 Oct 2003 21:52:44 -0000
> @@ -325,6 +325,12 @@
> % PDF linearization, we no longer do this.
> get oforce
> } bind def
> +/oforce_array { % <array> oforce_array <array>
> + [ exch { oforce } forall ]
> +} bind def
> +/oforce_elems { % <array> oforce_elems <first> ... <last>
> + { oforce } forall
> +} bind def
> % A null value in a dictionary is equivalent to an omitted key;
> % we must check for this specially.
> /knownoget { % <dict> <key> knownoget <value> true
> Index: gs/lib/pdf_main.ps
> ===================================================================
> RCS file: /cvs/ghostscript/gs/lib/pdf_main.ps,v
> retrieving revision 1.77
> diff -b -u -r1.77 pdf_main.ps
> --- gs/lib/pdf_main.ps 18 Aug 2003 20:43:05 -0000 1.77
> +++ gs/lib/pdf_main.ps 22 Oct 2003 21:52:45 -0000
> @@ -126,7 +126,7 @@
> pdfdict begin
> pdfopen begin
> Trailer /Root oget /Pages oget /CropBox knownoget
> - { mark /CropBox 3 -1 roll /PAGES pdfmark
> + { oforce_array mark /CropBox 3 -1 roll /PAGES pdfmark
> }
> if
> /FirstPage where
> @@ -609,8 +609,8 @@
> } bind def
>
> % Display a given page.
> -/boxrect % [<llx> <lly> <urx> <ury>] boxrect <x> <y> <w> <h>
> - { aload pop exch 3 index sub exch 2 index sub
> +/boxrect % <llx> <lly> <urx> <ury> boxrect <x> <y> <w> <h>
> + { exch 3 index sub exch 2 index sub
> } bind def
> /resolvedest { % <name|string|other> resolvedest <other|null>
> dup type /nametype eq {
> @@ -731,7 +731,7 @@
> dup /MediaBox pget pop % There has to be a MediaBox
> } ifelse
> % stack: [<prevproc>] <pagedict> <Crop|Media Box>
> - exch pop % done with the pagedict
> + exch pop oforce_array % done with the pagedict
> systemdict /PDFFitPage known {
> PDFDEBUG { (Fiting PDF to imageable area of the page.) = flush } if
> currentpagedevice /.HWMargins get aload pop
> @@ -765,12 +765,12 @@
> % Stack: pagedict currentpagedict
> 1 index /CropBox pget dup {exch pop} if systemdict /UseCropBox known and {
> % Set the page size.
> - 1 index /CropBox pget pop
> + 1 index /CropBox pget pop oforce_elems
> boxrect 2 array astore /PageSize exch def pop pop
> } {
> 1 index /MediaBox pget {
> % Set the page size.
> - boxrect 2 array astore /PageSize exch def pop pop
> + oforce_elems boxrect 2 array astore /PageSize exch def pop pop
> } if
> } ifelse
> % Don't change the page size if we are going to fit the PDF to the page
> @@ -808,6 +808,7 @@
>
> % Copy the crop box.
> dup /CropBox knownoget {
> + oforce_array
> % If the page has been rotated, rotate the CropBox.
> mark /CropBox 3 -1 roll
> 3 index /Rotate pget {
> @@ -838,7 +839,7 @@
> /TRDefault currenttransfer def
> matrix currentmatrix 2 dict
> 2 index /CropBox knownoget {
> - boxrect 4 array astore 1 index /ClipRect 3 -1 roll put
> + oforce_elems boxrect 4 array astore 1 index /ClipRect 3 -1 roll put
> } if
> dictbeginpage setmatrix
> /DefaultQstate qstate store
> @@ -855,7 +856,7 @@
> dup /Group knownoget {
> 1 index /CropBox knownoget not {
> 1 index /MediaBox oget
> - } if .beginformgroup {
> + } if oforce_array .beginformgroup {
> showpagecontents
> } .internalstopped {
> .discardtransparencygroup stop
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> gs-code-review mailing list
> [email protected]
> http://www.ghostscript.com/mailman/listinfo/gs-code-review
--
Ray Johnston
Director of Engineering Tel: (714) 484-0376
Artifex Software Inc. Fax: (714) 220-1022
______________________________________________________________________