Hi,

Am 26.10.2010 19:44, schrieb José Rodolfo Carrijo de Freitas:

Hi Andreas,
I read on session 8.4.2 of the pdf 1.7 spec (page 124) that:

-----------------------------
The stack is a LIFO (last in, first out) data structure in which the contents 
of the graphics state may be saved and later restored using the following 
operators:
•The q operator shall push a copy of the entire graphics state onto the stack.
•The Q operator shall restore the entire graphics state to its former value by 
popping it from the stack.

NOTE: These operators can be used to encapsulate a graphical element so that it 
can modify parameters of the graphics state and later restore them to their 
previous values.
**Occurrences of the q and Q operators shall be balanced within a given content 
stream** (or within the sequence of streams specified in a page dictionary’s 
Contents array).
-----------------------------
Correct and I didn't say anything else.

I thought that ctm and others gs would be restored as stated in the second item 
above.
But if it's not the case how can I restore The transformation matrix?

If the **Occurrences of the q and Q operators shall be balanced within a given 
content stream** shouldn’t        I extract them within the extracted image?

Imagine the following example:


original pdf:
=============

1 0 0 1 100 0 cm
....
q -> (put a copy of gs to the stack, the ctm is still the same 1 0 0 1 100 0)

1 0 0 1 100 0 cm
(the new ctm is concatenated to the ctm from the gs -> ctm = 1 0 0 1 200 0)
/Im0 Do (draw the image translated by 200)

Q -> restore the gs ctm = 1 0 0 1 100 0
....
1 0 0 1 200 0 cm
(the new ctm is concatenated to the ctm from the gs -> ctm = 1 0 0 1 300 0)
....


modified pdf as mentioned in your posted example:
=================================================

1 0 0 1 100 0 cm
....
q -> (put a copy of gs to the stack, the ctm is still the same 1 0 0 1 100 0)

1 0 0 1 100 0 cm
(the ctm from the gs and the new one are concatenated -> ctm = 1 0 0 1 200 0)

....
Q -> restore the gs ctm = 1 0 0 1 100 0
....
1 0 0 1 200 0 cm
(the new ctm is concatenated to the ctm from the gs -> ctm = 1 0 0 1 300 0)
....

q -> (put a copy of gs to the stack, the ctm is still the same 1 0 0 1 300 0)
1 0 0 1 100 0 cm
(the new ctm is concatenated to the ctm from the gs -> ctm = 1 0 0 1 400 0)
/Im0 Do (draw the image translated by 400 !!)
Q


Because of the concatenated ctms the image is drawn in the wrong place (translated by 400 instead of 200).

BR
Andreas Lehmkühler




-----Mensagem original-----
De: Andreas Lehmkuehler [mailto:[email protected]]
Enviada em: terça-feira, 26 de outubro de 2010 15:23
Para: [email protected]
Assunto: Re: copy entire stream of a page ignoring images

Hi,

Am 26.10.2010 18:59, schrieb José Rodolfo Carrijo de Freitas:
Hi Andreas,



I guess that I couldn’t express me very well. when I said:

“I was wondering if the remaining operators which identifies image graphical 
states would

affect fonts and texts operators.” I want to mean that if that set of graphical 
state could affect another operators outside the q-Q stack.



I understand that ‘q’ saves the graphics state and ‘Q’ restore the gs saved by 
q.
Correct.

So if a set of operators are between q and Q, it would not affect anything 
outside this block.
Correct.

The thing is that I’m not removing any q/Q operators, and it seems to affect 
other parts of the stream.



One thing I noticed is that when I redraw the image, it creates another stream, 
a new one just to the new image.

At this case, I have 2 streams and my content stream is actually an array of 
substreams as show in the figure:
Still correct.

http://b.imagehost.org/view/0482/comparing-pdfs-in-pdfdebugger



Is it possible that a gs of stream 1 affects an operator of stream 0 ?
The streams will be concatenated. So there is no difference between 2 single
streams and 1 stream combining two single streams.
But you are probably missing one detail. Saving a gs doesn't mean that
everything will be set to their initial value, especially the ctm will be still
the same after a "q" command. In your example the ctm may have another value at
the end of stream 0/the beginning of stream 1 than the value somewhere in
between the stream from where you copied the command sequence.


BR
Andreas Lehmkühler


Reply via email to