View previous topic :: View next topic |
Author |
Message |
opa
Joined: 03 Dec 2007 Posts: 8
|
Posted: Wed Mar 12, 2008 1:47 pm Post subject: Watermark and scanned documents |
|
|
Hello.
I'm trying to put watermark in a pdf document. After many tests, I have a problem with certain pdf documents. These documents are composed of pages with text, images and "scanned documents". In the pages that include "scanned documents" I recieve the "Unknown token 'QQ'" or "Unknown token 'DoQ'".
Can you help me?
Thanks for advance |
|
Back to top |
|
|
Thomas Hoevel
Joined: 16 Oct 2006 Posts: 387 Location: Cologne, Germany
|
Posted: Wed Mar 12, 2008 2:50 pm Post subject: |
|
|
Hi!
To replicate this problem we need a PDF file that causes this error.
I'll send you a PM with an e-mail address for file submission. _________________ Regards
Thomas Hoevel
PDFsharp Team |
|
Back to top |
|
|
Thomas Hoevel
Joined: 16 Oct 2006 Posts: 387 Location: Cologne, Germany
|
Posted: Thu Mar 13, 2008 8:06 am Post subject: |
|
|
Hello!
I can replicate the error, but other team members will have to fix it ...
I'll keep you informed. _________________ Regards
Thomas Hoevel
PDFsharp Team |
|
Back to top |
|
|
opa
Joined: 03 Dec 2007 Posts: 8
|
Posted: Thu Mar 13, 2008 9:57 am Post subject: Watermark and scanned documents |
|
|
Hi!
Thank you very much.
I'm trying to resolve it too.
Regards |
|
Back to top |
|
|
Thomas Hoevel
Joined: 16 Oct 2006 Posts: 387 Location: Cologne, Germany
|
Posted: Mon Mar 17, 2008 9:56 am Post subject: |
|
|
Hello!
We found a solution for your problem.
In PdfContent.cs (around line 124) change method
"internal void PreserveGraphicsState()"
like this:
Code: | internal void PreserveGraphicsState()
{
// If a content stream is touched by PDFsharp it is typically because graphical operations are
// prepended or appended. Some nasty PDF tools does not preserve the graphical state correctly.
// Therefore we try to relieve the problem by surrounding the content stream with push/restore
// graphic state operation.
if (this.Stream != null)
{
byte[] value = Stream.Value;
int length = value.Length;
if (length != 0 && ((value[0] != (byte)'q' || value[1] != (byte)'\n')))
{
byte[] newValue = new byte[length + 2 + 3];
newValue[0] = (byte)'q';
newValue[1] = (byte)'\n';
Array.Copy(value, 0, newValue, 2, length);
newValue[length + 2] = (byte)' ';
newValue[length + 3] = (byte)'Q';
newValue[length + 4] = (byte)'\n';
Stream.Value = newValue;
Elements.SetInteger("/Length", Stream.Length);
}
}
}
|
In file PdfContents.cs (around line 142) change method "void SetModified()" like this:
Code: | else if (count > 1)
{
// Surround content streams with q/Q operations
byte[] value;
int length;
PdfContent content = (PdfContent)((PdfReference)Elements[0]).Value;
if (content != null && content.Stream != null)
{
length = content.Stream.Length;
value = new byte[length + 2];
value[0] = (byte)'q';
value[1] = (byte)'\n';
Array.Copy(content.Stream.Value, 0, value, 2, length);
content.Stream.Value = value;
content.Elements.SetInteger("/Length", length + 2);
}
content = (PdfContent)((PdfReference)Elements[count - 1]).Value;
if (content != null && content.Stream != null)
{
length = content.Stream.Length;
value = new byte[length + 3];
Array.Copy(content.Stream.Value, 0, value, 0, length);
value[length] = (byte)' ';
value[length + 1] = (byte)'Q';
value[length + 2] = (byte)'\n';
content.Stream.Value = value;
content.Elements.SetInteger("/Length", length + 3);
}
}
|
_________________ Regards
Thomas Hoevel
PDFsharp Team |
|
Back to top |
|
|
opa
Joined: 03 Dec 2007 Posts: 8
|
Posted: Tue Mar 18, 2008 4:11 pm Post subject: |
|
|
Hello!
I have updated the code and works correctly. Have solved all my problems.
Thank you very much.
Regards. |
|
Back to top |
|
|
|