Append() public method

public Append ( ByteBuffer buf ) : ByteBuffer
buf ByteBuffer
return ByteBuffer
コード例 #1
0
 private void SerArray(PdfArray array, int level, ByteBuffer bb, Dictionary <RefKey, int> serialized)
 {
     bb.Append("$A");
     if (level <= 0)
     {
         return;
     }
     for (int k = 0; k < array.Size; ++k)
     {
         SerObject(array[k], level, bb, serialized);
     }
 }
コード例 #2
0
 private void SerArray(PdfArray array, int level, ByteBuffer bb)
 {
     bb.Append("$A");
     if (level <= 0)
     {
         return;
     }
     for (int k = 0; k < array.Size; ++k)
     {
         SerObject(array[k], level, bb);
     }
 }
コード例 #3
0
ファイル: PdfEncryption.cs プロジェクト: w16014936/itextsharp
        public static PdfObject CreateInfoId(byte[] id)
        {
            ByteBuffer buf = new ByteBuffer(90);

            buf.Append('[').Append('<');
            if (id.Length != 16)
            {
                id = CreateDocumentId();
            }
            for (int k = 0; k < 16; ++k)
            {
                buf.AppendHex(id[k]);
            }
            buf.Append('>').Append('<');
            id = CreateDocumentId();
            for (int k = 0; k < 16; ++k)
            {
                buf.AppendHex(id[k]);
            }
            buf.Append('>').Append(']');
            buf.Close();
            return(new PdfLiteral(buf.ToByteArray()));
        }
コード例 #4
0
 private void SerDic(PdfDictionary dic, int level, ByteBuffer bb)
 {
     bb.Append("$D");
     if (level <= 0)
     {
         return;
     }
     PdfName[] keys = new PdfName[dic.Size];
     dic.Keys.CopyTo(keys, 0);
     Array.Sort <PdfName>(keys);
     for (int k = 0; k < keys.Length; ++k)
     {
         SerObject(keys[k], level, bb);
         SerObject(dic.Get(keys[k]), level, bb);
     }
 }
コード例 #5
0
            private void SerObject(PdfObject obj, int level, ByteBuffer bb, HashSet2 <PdfObject> serialized)
            {
                if (level <= 0)
                {
                    return;
                }
                if (obj == null)
                {
                    bb.Append("$Lnull");
                    return;
                }

                if (obj.IsIndirect())
                {
                    if (serialized.Contains(obj))
                    {
                        return;
                    }
                    else
                    {
                        serialized.Add(obj);
                    }
                }
                obj = PdfReader.GetPdfObject(obj);
                if (obj.IsStream())
                {
                    bb.Append("$B");
                    SerDic((PdfDictionary)obj, level - 1, bb, serialized);
                    if (level > 0)
                    {
                        bb.Append(DigestAlgorithms.Digest("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj)));
                    }
                }
                else if (obj.IsDictionary())
                {
                    SerDic((PdfDictionary)obj, level - 1, bb, serialized);
                }
                else if (obj.IsArray())
                {
                    SerArray((PdfArray)obj, level - 1, bb, serialized);
                }
                else if (obj.IsString())
                {
                    bb.Append("$S").Append(obj.ToString());
                }
                else if (obj.IsName())
                {
                    bb.Append("$N").Append(obj.ToString());
                }
                else
                {
                    bb.Append("$L").Append(obj.ToString());
                }
            }
コード例 #6
0
            private void serDic(PdfDictionary dic, int level, ByteBuffer bb)
            {
                bb.Append("$D");
                if (level <= 0)
                {
                    return;
                }

                var keys = new object[dic.Size];

                dic.Keys.CopyTo(keys, 0);
                Array.Sort(keys);
                for (var k = 0; k < keys.Length; ++k)
                {
                    serObject((PdfObject)keys[k], level, bb);
                    serObject(dic.Get((PdfName)keys[k]), level, bb);
                }
            }
コード例 #7
0
 private void SerDic(PdfDictionary dic, int level, ByteBuffer bb, Dictionary <RefKey, int> serialized)
 {
     bb.Append("$D");
     if (level <= 0)
     {
         return;
     }
     PdfName[] keys = new PdfName[dic.Size];
     dic.Keys.CopyTo(keys, 0);
     Array.Sort(keys);
     for (int k = 0; k < keys.Length; ++k)
     {
         if (keys[k].Equals(PdfName.P) && (dic.Get(keys[k]).IsIndirect() || dic.Get(keys[k]).IsDictionary())) // ignore recursive call
         {
             continue;
         }
         SerObject(keys[k], level, bb, serialized);
         SerObject(dic.Get(keys[k]), level, bb, serialized);
     }
 }
コード例 #8
0
            private void serObject(PdfObject obj, int level, ByteBuffer bb)
            {
                if (level <= 0)
                {
                    return;
                }

                if (obj == null)
                {
                    bb.Append("$Lnull");
                    return;
                }
                obj = PdfReader.GetPdfObject(obj);
                if (obj.IsStream())
                {
                    bb.Append("$B");
                    serDic((PdfDictionary)obj, level - 1, bb);
                    if (level > 0)
                    {
                        using (var md5 = MD5.Create())
                        {
                            bb.Append(md5.ComputeHash(PdfReader.GetStreamBytesRaw((PrStream)obj)));
                        }
                    }
                }
                else if (obj.IsDictionary())
                {
                    serDic((PdfDictionary)obj, level - 1, bb);
                }
                else if (obj.IsArray())
                {
                    serArray((PdfArray)obj, level - 1, bb);
                }
                else if (obj.IsString())
                {
                    bb.Append("$S").Append(obj.ToString());
                }
                else if (obj.IsName())
                {
                    bb.Append("$N").Append(obj.ToString());
                }
                else
                {
                    bb.Append("$L").Append(obj.ToString());
                }
            }
コード例 #9
0
 private void SerObject(PdfObject obj, int level, ByteBuffer bb)
 {
     if (level <= 0)
     {
         return;
     }
     if (obj == null)
     {
         bb.Append("$Lnull");
         return;
     }
     obj = PdfReader.GetPdfObject(obj);
     if (obj.IsStream())
     {
         bb.Append("$B");
         SerDic((PdfDictionary)obj, level - 1, bb);
         if (level > 0)
         {
             bb.Append(PdfEncryption.DigestComputeHash("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj)));
         }
     }
     else if (obj.IsDictionary())
     {
         SerDic((PdfDictionary)obj, level - 1, bb);
     }
     else if (obj.IsArray())
     {
         SerArray((PdfArray)obj, level - 1, bb);
     }
     else if (obj.IsString())
     {
         bb.Append("$S").Append(obj.ToString());
     }
     else if (obj.IsName())
     {
         bb.Append("$N").Append(obj.ToString());
     }
     else
     {
         bb.Append("$L").Append(obj.ToString());
     }
 }
コード例 #10
0
 virtual internal protected void AlterContents() {
     foreach (PageStamp ps in pagesToContent.Values) {
         PdfDictionary pageN = ps.pageN;
         MarkUsed(pageN);
         PdfArray ar = null;
         PdfObject content = PdfReader.GetPdfObject(pageN.Get(PdfName.CONTENTS), pageN);
         if (content == null) {
             ar = new PdfArray();
             pageN.Put(PdfName.CONTENTS, ar);
         }
         else if (content.IsArray()) {
             ar = new PdfArray((PdfArray)content);
             pageN.Put(PdfName.CONTENTS, ar);
         }
         else if (content.IsStream()) {
             ar = new PdfArray();
             ar.Add(pageN.Get(PdfName.CONTENTS));
             pageN.Put(PdfName.CONTENTS, ar);
         }
         else {
             ar = new PdfArray();
             pageN.Put(PdfName.CONTENTS, ar);
         }
         ByteBuffer out_p = new ByteBuffer();
         if (ps.under != null) {
             out_p.Append(PdfContents.SAVESTATE);
             ApplyRotation(pageN, out_p);
             out_p.Append(ps.under.InternalBuffer);
             out_p.Append(PdfContents.RESTORESTATE);
         }
         if (ps.over != null)
             out_p.Append(PdfContents.SAVESTATE);
         PdfStream stream = new PdfStream(out_p.ToByteArray());
         stream.FlateCompress(compressionLevel);
         ar.AddFirst(AddToBody(stream).IndirectReference);
         out_p.Reset();
         if (ps.over != null) {
             out_p.Append(' ');
             out_p.Append(PdfContents.RESTORESTATE);
             ByteBuffer buf = ps.over.InternalBuffer;
             out_p.Append(buf.Buffer, 0, ps.replacePoint);
             out_p.Append(PdfContents.SAVESTATE);
             ApplyRotation(pageN, out_p);
             out_p.Append(buf.Buffer, ps.replacePoint, buf.Size - ps.replacePoint);
             out_p.Append(PdfContents.RESTORESTATE);
             stream = new PdfStream(out_p.ToByteArray());
             stream.FlateCompress(compressionLevel);
             ar.Add(AddToBody(stream).IndirectReference);
         }
         AlterResources(ps);
     }
 }
コード例 #11
0
ファイル: PdfSmartCopy.cs プロジェクト: jomamorales/createPDF
 private void SerObject(PdfObject obj, int level, ByteBuffer bb)
 {
     if (level <= 0)
         return;
     if (obj == null) {
         bb.Append("$Lnull");
         return;
     }
     obj = PdfReader.GetPdfObject(obj);
     if (obj.IsStream()) {
         bb.Append("$B");
         SerDic((PdfDictionary)obj, level - 1, bb);
         if (level > 0) {
             bb.Append(PdfEncryption.DigestComputeHash("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj)));
         }
     }
     else if (obj.IsDictionary()) {
         SerDic((PdfDictionary)obj, level - 1, bb);
     }
     else if (obj.IsArray()) {
         SerArray((PdfArray)obj, level - 1, bb);
     }
     else if (obj.IsString()) {
         bb.Append("$S").Append(obj.ToString());
     }
     else if (obj.IsName()) {
         bb.Append("$N").Append(obj.ToString());
     }
     else
         bb.Append("$L").Append(obj.ToString());
 }
コード例 #12
0
ファイル: PdfSmartCopy.cs プロジェクト: jomamorales/createPDF
 private void SerArray(PdfArray array, int level, ByteBuffer bb)
 {
     bb.Append("$A");
     if (level <= 0)
         return;
     for (int k = 0; k < array.Size; ++k) {
         SerObject(array[k], level, bb);
     }
 }
コード例 #13
0
 private static IList<Dictionary<String, Object>> BookmarkDepth(PdfReader reader, PdfDictionary outline, IntHashtable pages, bool processCurrentOutlineOnly) {
     List<Dictionary<String, Object>> list = new List<Dictionary<String, Object>>();
     while (outline != null) {
         Dictionary<String, Object> map = new Dictionary<string,object>();
         PdfString title = (PdfString)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.TITLE));
         map["Title"] = title.ToUnicodeString();
         PdfArray color = (PdfArray)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.C));
         if (color != null && color.Size == 3) {
             ByteBuffer outp = new ByteBuffer();
             outp.Append(color.GetAsNumber(0).FloatValue).Append(' ');
             outp.Append(color.GetAsNumber(1).FloatValue).Append(' ');
             outp.Append(color.GetAsNumber(2).FloatValue);
             map["Color"] = PdfEncodings.ConvertToString(outp.ToByteArray(), null);
         }
         PdfNumber style = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.F));
         if (style != null) {
             int f = style.IntValue;
             String s = "";
             if ((f & 1) != 0)
                 s += "italic ";
             if ((f & 2) != 0)
                 s += "bold ";
             s = s.Trim();
             if (s.Length != 0) 
                 map["Style"] = s;
         }
         PdfNumber count = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.COUNT));
         if (count != null && count.IntValue < 0)
             map["Open"] = "false";
         try {
             PdfObject dest = PdfReader.GetPdfObjectRelease(outline.Get(PdfName.DEST));
             if (dest != null) {
                 MapGotoBookmark(map, dest, pages); //changed by ujihara 2004-06-13
             }
             else {
                 PdfDictionary action = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.A));
                 if (action != null) {
                     if (PdfName.GOTO.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                         if (dest != null) {
                             MapGotoBookmark(map, dest, pages);
                         }
                     }
                     else if (PdfName.URI.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         map["Action"] = "URI";
                         map["URI"] = ((PdfString)PdfReader.GetPdfObjectRelease(action.Get(PdfName.URI))).ToUnicodeString();
                     }
                     else if (PdfName.JAVASCRIPT.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         map["Action"] = "JS";
                         map["Code"] = PdfReader.GetPdfObjectRelease(action.Get(PdfName.JS)).ToString();
                     }
                     else if (PdfName.GOTOR.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                         if (dest != null) {
                             if (dest.IsString())
                                 map["Named"] = dest.ToString();
                             else if (dest.IsName())
                                 map["NamedN"] = PdfName.DecodeName(dest.ToString());
                             else if (dest.IsArray()) {
                                 PdfArray arr = (PdfArray)dest;
                                 StringBuilder s = new StringBuilder();
                                 s.Append(arr[0].ToString());
                                 s.Append(' ').Append(arr[1].ToString());
                                 for (int k = 2; k < arr.Size; ++k)
                                     s.Append(' ').Append(arr[k].ToString());
                                 map["Page"] = s.ToString();
                             }
                         }
                         map["Action"] = "GoToR";
                         PdfObject file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                         if (file != null) {
                             if (file.IsString())
                                 map["File"] = ((PdfString)file).ToUnicodeString();
                             else if (file.IsDictionary()) {
                                 file = PdfReader.GetPdfObject(((PdfDictionary)file).Get(PdfName.F));
                                 if (file.IsString())
                                     map["File"] = ((PdfString)file).ToUnicodeString();
                             }
                         }
                         PdfObject newWindow = PdfReader.GetPdfObjectRelease(action.Get(PdfName.NEWWINDOW));
                         if (newWindow != null)
                             map["NewWindow"] = newWindow.ToString();
                     }
                     else if (PdfName.LAUNCH.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         map["Action"] = "Launch";
                         PdfObject file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                         if (file == null)
                             file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.WIN));
                         if (file != null) {
                             if (file.IsString())
                                 map["File"] = ((PdfString)file).ToUnicodeString();
                             else if (file.IsDictionary()) {
                                 file = PdfReader.GetPdfObjectRelease(((PdfDictionary)file).Get(PdfName.F));
                                 if (file.IsString())
                                     map["File"] = ((PdfString)file).ToUnicodeString();
                             }
                         }
                     }
                 }
             }
         }
         catch  {
             //empty on purpose
         }
         PdfDictionary first = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.FIRST));
         if (first != null) {
             map["Kids"] = BookmarkDepth(reader, first, pages, false);
         }
         list.Add(map);
         if (!processCurrentOutlineOnly)
             outline = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.NEXT));
         else
             outline = null;
     }
     return list;
 }
コード例 #14
0
     // methods overriding some methods in PdfObject
 
     /**
      * Returns the PDF representation of this <CODE>PdfString</CODE>.
      *
      * @return        an array of <CODE>byte</CODE>s
      */
 
     public override void ToPdf(PdfWriter writer, Stream os) {
         PdfWriter.CheckPdfIsoConformance(writer, PdfIsoKeys.PDFISOKEY_OBJECT, this);
         byte[] b = GetBytes();
         PdfEncryption crypto = null;
         if (writer != null)
             crypto = writer.Encryption;
         if (crypto != null && !crypto.IsEmbeddedFilesOnly()) {
             b = crypto.EncryptByteArray(b);
         }
         if (hexWriting) {
             ByteBuffer buf = new ByteBuffer();
             buf.Append('<');
             int len = b.Length;
             for (int k = 0; k < len; ++k)
                 buf.AppendHex(b[k]);
             buf.Append('>');
             os.Write(buf.ToByteArray(), 0, buf.Size);
         }
         else {
             b = PdfContentByte.EscapeString(b);
             os.Write(b, 0, b.Length);
         }
     }
コード例 #15
0
ファイル: PdfSmartCopy.cs プロジェクト: jagruti23/itextsharp
            private void SerObject(PdfObject obj, int level, ByteBuffer bb, Dictionary<RefKey, int> serialized)
            {
                if (level <= 0)
                    return;
                if (obj == null) {
                    bb.Append("$Lnull");
                    return;
                }

                PdfIndirectReference refe = null;
                ByteBuffer savedBb = null;

                if (obj.IsIndirect()) {
                    refe = (PdfIndirectReference)obj;
                    RefKey key = new RefKey(refe);
                    if (serialized.ContainsKey(key)) {
                        bb.Append(serialized[key]);
                        return;
                    }
                    else {
                        savedBb = bb;
                        bb = new ByteBuffer();
                    }
                }
                obj = PdfReader.GetPdfObject(obj);
                if (obj.IsStream()) {
                    bb.Append("$B");
                    SerDic((PdfDictionary)obj, level - 1, bb, serialized);
                    if (level > 0) {
                        bb.Append(DigestAlgorithms.Digest("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj)));
                    }
                }
                else if (obj.IsDictionary()) {
                    SerDic((PdfDictionary)obj, level - 1, bb,serialized);
                }
                else if (obj.IsArray()) {
                    SerArray((PdfArray)obj, level - 1, bb,serialized);
                }
                else if (obj.IsString()) {
                    bb.Append("$S").Append(obj.ToString());
                }
                else if (obj.IsName()) {
                    bb.Append("$N").Append(obj.ToString());
                }
                else
                    bb.Append("$L").Append(obj.ToString());

                if (savedBb != null) {
                    RefKey key = new RefKey(refe);
                    if (!serialized.ContainsKey(key))
                        serialized[key] = CalculateHash(bb.Buffer);
                    savedBb.Append(bb);
                }
            }
コード例 #16
0
ファイル: PdfCopy.cs プロジェクト: boecko/iTextSharp
 public void AlterContents()
 {
     if (over == null && under == null)
         return;
     PdfArray ar = null;
     PdfObject content = PdfReader.GetPdfObject(pageN.Get(PdfName.CONTENTS), pageN);
     if (content == null) {
         ar = new PdfArray();
         pageN.Put(PdfName.CONTENTS, ar);
     }
     else if (content.IsArray()) {
         ar = (PdfArray)content;
     }
     else if (content.IsStream()) {
         ar = new PdfArray();
         ar.Add(pageN.Get(PdfName.CONTENTS));
         pageN.Put(PdfName.CONTENTS, ar);
     }
     else {
         ar = new PdfArray();
         pageN.Put(PdfName.CONTENTS, ar);
     }
     ByteBuffer out_p = new ByteBuffer();
     if (under != null) {
         out_p.Append(PdfContents.SAVESTATE);
         ApplyRotation(pageN, out_p);
         out_p.Append(under.InternalBuffer);
         out_p.Append(PdfContents.RESTORESTATE);
     }
     if (over != null)
         out_p.Append(PdfContents.SAVESTATE);
     PdfStream stream = new PdfStream(out_p.ToByteArray());
     stream.FlateCompress(cstp.CompressionLevel);
     PdfIndirectReference ref1 = cstp.AddToBody(stream).IndirectReference;
     ar.AddFirst(ref1);
     out_p.Reset();
     if (over != null) {
         out_p.Append(' ');
         out_p.Append(PdfContents.RESTORESTATE);
         out_p.Append(PdfContents.SAVESTATE);
         ApplyRotation(pageN, out_p);
         out_p.Append(over.InternalBuffer);
         out_p.Append(PdfContents.RESTORESTATE);
         stream = new PdfStream(out_p.ToByteArray());
         stream.FlateCompress(cstp.CompressionLevel);
         ar.Add(cstp.AddToBody(stream).IndirectReference);
     }
     pageN.Put(PdfName.RESOURCES, pageResources.Resources);
 }
コード例 #17
0
            private void applyRotation(PdfDictionary pageN, ByteBuffer outP)
            {
                if (!_cstp.RotateContents)
                {
                    return;
                }

                var page     = _reader.GetPageSizeWithRotation(pageN);
                var rotation = page.Rotation;

                switch (rotation)
                {
                case 90:
                    outP.Append(PdfContents.Rotate90);
                    outP.Append(page.Top);
                    outP.Append(' ').Append('0').Append(PdfContents.Rotatefinal);
                    break;

                case 180:
                    outP.Append(PdfContents.Rotate180);
                    outP.Append(page.Right);
                    outP.Append(' ');
                    outP.Append(page.Top);
                    outP.Append(PdfContents.Rotatefinal);
                    break;

                case 270:
                    outP.Append(PdfContents.Rotate270);
                    outP.Append('0').Append(' ');
                    outP.Append(page.Right);
                    outP.Append(PdfContents.Rotatefinal);
                    break;
                }
            }
コード例 #18
0
        /**
        * This is the first method to be called when using external signatures. The general sequence is:
        * PreClose(), GetDocumentBytes() and Close().
        * <p>
        * If calling PreClose() <B>dont't</B> call PdfStamper.Close().
        * <p>
        * If using an external signature <CODE>exclusionSizes</CODE> must contain at least
        * the <CODE>PdfName.CONTENTS</CODE> key with the size that it will take in the
        * document. Note that due to the hex string coding this size should be
        * byte_size*2+2.
        * @param exclusionSizes a <CODE>Hashtable</CODE> with names and sizes to be excluded in the signature
        * calculation. The key is a <CODE>PdfName</CODE> and the value an
        * <CODE>Integer</CODE>. At least the <CODE>PdfName.CONTENTS</CODE> must be present
        * @throws IOException on error
        * @throws DocumentException on error
        */    
        public void PreClose(Dictionary<PdfName, int> exclusionSizes) {
            if (preClosed)
                throw new DocumentException(MessageLocalization.GetComposedMessage("document.already.pre.closed"));
            stamper.MergeVerification();
            preClosed = true;
            AcroFields af = writer.AcroFields;
            String name = FieldName;
            bool fieldExists = !(IsInvisible() || IsNewField());
            PdfIndirectReference refSig = writer.PdfIndirectReference;
            writer.SigFlags = 3;
            if (fieldExists) {
                PdfDictionary widget = af.GetFieldItem(name).GetWidget(0);
                writer.MarkUsed(widget);
                widget.Put(PdfName.P, writer.GetPageReference(Page));
                widget.Put(PdfName.V, refSig);
                PdfObject obj = PdfReader.GetPdfObjectRelease(widget.Get(PdfName.F));
                int flags = 0;
                if (obj != null && obj.IsNumber())
                    flags = ((PdfNumber)obj).IntValue;
                flags |= PdfAnnotation.FLAGS_LOCKED;
                widget.Put(PdfName.F, new PdfNumber(flags));
                PdfDictionary ap = new PdfDictionary();
                ap.Put(PdfName.N, GetAppearance().IndirectReference);
                widget.Put(PdfName.AP, ap);
            }
            else {
                PdfFormField sigField = PdfFormField.CreateSignature(writer);
                sigField.FieldName = name;
                sigField.Put(PdfName.V, refSig);
                sigField.Flags = PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_LOCKED;

                int pagen = Page;
                if (!IsInvisible())
                    sigField.SetWidget(PageRect, null);
                else
                    sigField.SetWidget(new Rectangle(0, 0), null);
                sigField.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, GetAppearance());
                sigField.Page = pagen;
                writer.AddAnnotation(sigField, pagen);
            }

            exclusionLocations = new Dictionary<PdfName,PdfLiteral>();
            if (cryptoDictionary == null) {
                if (PdfName.ADOBE_PPKLITE.Equals(Filter))
                    sigStandard = new PdfSigGenericPKCS.PPKLite();
                else if (PdfName.ADOBE_PPKMS.Equals(Filter))
                    sigStandard = new PdfSigGenericPKCS.PPKMS();
                else if (PdfName.VERISIGN_PPKVS.Equals(Filter))
                    sigStandard = new PdfSigGenericPKCS.VeriSign();
                else
                    throw new ArgumentException(MessageLocalization.GetComposedMessage("unknown.filter.1", Filter));
                sigStandard.SetExternalDigest(externalDigest, externalRSAdata, digestEncryptionAlgorithm);
                if (Reason != null)
                    sigStandard.Reason = Reason;
                if (Location != null)
                    sigStandard.Location = Location;
                if (Contact != null)
                    sigStandard.Contact = Contact;
                sigStandard.Put(PdfName.M, new PdfDate(SignDate));
                sigStandard.SetSignInfo(PrivKey, CertChain, CrlList);
                PdfString contents = (PdfString)sigStandard.Get(PdfName.CONTENTS);
                PdfLiteral lit = new PdfLiteral((contents.ToString().Length + (PdfName.ADOBE_PPKLITE.Equals(Filter)?0:64)) * 2 + 2);
                exclusionLocations[PdfName.CONTENTS] = lit;
                sigStandard.Put(PdfName.CONTENTS, lit);
                lit = new PdfLiteral(80);
                exclusionLocations[PdfName.BYTERANGE] = lit;
                sigStandard.Put(PdfName.BYTERANGE, lit);
                if (certificationLevel > 0)
                    AddDocMDP(sigStandard);
                if (signatureEvent != null)
                    signatureEvent.GetSignatureDictionary(sigStandard);
                writer.AddToBody(sigStandard, refSig, false);
            }
            else {
                PdfLiteral lit = new PdfLiteral(80);
                exclusionLocations[PdfName.BYTERANGE] = lit;
                cryptoDictionary.Put(PdfName.BYTERANGE, lit);
                foreach (KeyValuePair<PdfName,int> entry in exclusionSizes) {
                    PdfName key = entry.Key;
                    int v = entry.Value;
                    lit = new PdfLiteral(v);
                    exclusionLocations[key] = lit;
                    cryptoDictionary.Put(key, lit);
                }
                if (certificationLevel > 0)
                    AddDocMDP(cryptoDictionary);
                if (signatureEvent != null)
                    signatureEvent.GetSignatureDictionary(cryptoDictionary);
                writer.AddToBody(cryptoDictionary, refSig, false);
            }
            if (certificationLevel > 0) {
                // add DocMDP entry to root
                PdfDictionary docmdp = new PdfDictionary();
                docmdp.Put(new PdfName("DocMDP"), refSig);
                writer.reader.Catalog.Put(new PdfName("Perms"), docmdp);
            }
            writer.Close(stamper.MoreInfo);
            
            range = new int[exclusionLocations.Count * 2];
            int byteRangePosition = exclusionLocations[PdfName.BYTERANGE].Position;
            exclusionLocations.Remove(PdfName.BYTERANGE);
            int idx = 1;
            foreach (PdfLiteral lit in exclusionLocations.Values) {
                int n = lit.Position;
                range[idx++] = n;
                range[idx++] = lit.PosLength + n;
            }
            Array.Sort(range, 1, range.Length - 2);
            for (int k = 3; k < range.Length - 2; k += 2)
                range[k] -= range[k - 1];
            
            if (tempFile == null) {
                bout = sigout.Buffer;
                boutLen = sigout.Size;
                range[range.Length - 1] = boutLen - range[range.Length - 2];
                ByteBuffer bf = new ByteBuffer();
                bf.Append('[');
                for (int k = 0; k < range.Length; ++k)
                    bf.Append(range[k]).Append(' ');
                bf.Append(']');
                Array.Copy(bf.Buffer, 0, bout, byteRangePosition, bf.Size);
            }
            else {
                try {
                    raf = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite);
                    int boutLen = (int)raf.Length;
                    range[range.Length - 1] = boutLen - range[range.Length - 2];
                    ByteBuffer bf = new ByteBuffer();
                    bf.Append('[');
                    for (int k = 0; k < range.Length; ++k)
                        bf.Append(range[k]).Append(' ');
                    bf.Append(']');
                    raf.Seek(byteRangePosition, SeekOrigin.Begin);
                    raf.Write(bf.Buffer, 0, bf.Size);
                }
                catch (IOException e) {
                    try{raf.Close();}catch{}
                    try{File.Delete(tempFile);}catch{}
                    throw e;
                }
            }
        }
コード例 #19
0
        /** 
         * Overriding standard PdfObject.ToPdf because we need sorted PdfDictionaries.
         */
        private static void ToPdf(PdfObject @object, PdfWriter writer, ByteBuffer os) {
            if (@object is PdfDictionary) {
                os.Append('<');
                os.Append('<');

                List<PdfName> keys = new List<PdfName>(((PdfDictionary) @object).Keys);
                keys.Sort();

                foreach (PdfName key in keys) {
                    ToPdf(key, writer, os);
                    PdfObject value = ((PdfDictionary) @object).Get(key);
                    int type = value.Type;

                    if (type != PdfObject.ARRAY && type != PdfObject.DICTIONARY && type != PdfObject.NAME &&
                            type != PdfObject.STRING) {
                        os.Append(' ');
                    }

                    ToPdf(value, writer, os);
                }

                os.Append('>');
                os.Append('>');
            } else {
                @object.ToPdf(writer, os);
            }
        }
コード例 #20
0
        private static ArrayList bookmarkDepth(PdfReader reader, PdfDictionary outline, IntHashtable pages)
        {
            var list = new ArrayList();

            while (outline != null)
            {
                var map   = new Hashtable();
                var title = (PdfString)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.Title));
                map["Title"] = title.ToUnicodeString();
                var color = (PdfArray)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.C));
                if (color != null && color.Size == 3)
                {
                    var outp = new ByteBuffer();
                    outp.Append(color.GetAsNumber(0).FloatValue).Append(' ');
                    outp.Append(color.GetAsNumber(1).FloatValue).Append(' ');
                    outp.Append(color.GetAsNumber(2).FloatValue);
                    map["Color"] = PdfEncodings.ConvertToString(outp.ToByteArray(), null);
                }
                var style = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.F));
                if (style != null)
                {
                    var f = style.IntValue;
                    var s = "";
                    if ((f & 1) != 0)
                    {
                        s += "italic ";
                    }

                    if ((f & 2) != 0)
                    {
                        s += "bold ";
                    }

                    s = s.Trim();
                    if (s.Length != 0)
                    {
                        map["Style"] = s;
                    }
                }
                var count = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.Count));
                if (count != null && count.IntValue < 0)
                {
                    map["Open"] = "false";
                }

                try
                {
                    var dest = PdfReader.GetPdfObjectRelease(outline.Get(PdfName.Dest));
                    if (dest != null)
                    {
                        mapGotoBookmark(map, dest, pages); //changed by ujihara 2004-06-13
                    }
                    else
                    {
                        var action = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.A));
                        if (action != null)
                        {
                            if (PdfName.Goto.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                                if (dest != null)
                                {
                                    mapGotoBookmark(map, dest, pages);
                                }
                            }
                            else if (PdfName.Uri.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                map["Action"] = "URI";
                                map["URI"]    = ((PdfString)PdfReader.GetPdfObjectRelease(action.Get(PdfName.Uri))).ToUnicodeString();
                            }
                            else if (PdfName.Gotor.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                                if (dest != null)
                                {
                                    if (dest.IsString())
                                    {
                                        map["Named"] = dest.ToString();
                                    }
                                    else if (dest.IsName())
                                    {
                                        map["NamedN"] = PdfName.DecodeName(dest.ToString());
                                    }
                                    else if (dest.IsArray())
                                    {
                                        var arr = (PdfArray)dest;
                                        var s   = new StringBuilder();
                                        s.Append(arr[0]);
                                        s.Append(' ').Append(arr[1]);
                                        for (var k = 2; k < arr.Size; ++k)
                                        {
                                            s.Append(' ').Append(arr[k]);
                                        }

                                        map["Page"] = s.ToString();
                                    }
                                }
                                map["Action"] = "GoToR";
                                var file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                                if (file != null)
                                {
                                    if (file.IsString())
                                    {
                                        map["File"] = ((PdfString)file).ToUnicodeString();
                                    }
                                    else if (file.IsDictionary())
                                    {
                                        file = PdfReader.GetPdfObject(((PdfDictionary)file).Get(PdfName.F));
                                        if (file.IsString())
                                        {
                                            map["File"] = ((PdfString)file).ToUnicodeString();
                                        }
                                    }
                                }
                                var newWindow = PdfReader.GetPdfObjectRelease(action.Get(PdfName.Newwindow));
                                if (newWindow != null)
                                {
                                    map["NewWindow"] = newWindow.ToString();
                                }
                            }
                            else if (PdfName.Launch.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                map["Action"] = "Launch";
                                var file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                                if (file == null)
                                {
                                    file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.Win));
                                }

                                if (file != null)
                                {
                                    if (file.IsString())
                                    {
                                        map["File"] = ((PdfString)file).ToUnicodeString();
                                    }
                                    else if (file.IsDictionary())
                                    {
                                        file = PdfReader.GetPdfObjectRelease(((PdfDictionary)file).Get(PdfName.F));
                                        if (file.IsString())
                                        {
                                            map["File"] = ((PdfString)file).ToUnicodeString();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch
                {
                    //empty on purpose
                }
                var first = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.First));
                if (first != null)
                {
                    map["Kids"] = bookmarkDepth(reader, first, pages);
                }
                list.Add(map);
                outline = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.Next));
            }
            return(list);
        }
コード例 #21
0
        /// <summary>
        /// Outputs a  double  into a format suitable for the PDF.
        ///  buf  is  null . If  buf  is <B>not</B>  null ,
        /// then the double is appended directly to the buffer and this methods returns  null .
        /// </summary>
        /// <param name="d">a double</param>
        /// <param name="buf">a ByteBuffer</param>
        /// <returns>the  String  representation of the  double  if</returns>
        public static string FormatDouble(double d, ByteBuffer buf)
        {
            if (HighPrecision)
            {
                string sform = d.ToString("0.######", CultureInfo.InvariantCulture);
                if (buf == null)
                {
                    return(sform);
                }
                else
                {
                    buf.Append(sform);
                    return(null);
                }
            }
            bool negative = false;

            if (Math.Abs(d) < 0.000015)
            {
                if (buf != null)
                {
                    buf.Append(ZERO);
                    return(null);
                }
                else
                {
                    return("0");
                }
            }
            if (d < 0)
            {
                negative = true;
                d        = -d;
            }
            if (d < 1.0)
            {
                d += 0.000005;
                if (d >= 1)
                {
                    if (negative)
                    {
                        if (buf != null)
                        {
                            buf.Append((byte)'-');
                            buf.Append((byte)'1');
                            return(null);
                        }
                        else
                        {
                            return("-1");
                        }
                    }
                    else
                    {
                        if (buf != null)
                        {
                            buf.Append((byte)'1');
                            return(null);
                        }
                        else
                        {
                            return("1");
                        }
                    }
                }
                if (buf != null)
                {
                    int v = (int)(d * 100000);

                    if (negative)
                    {
                        buf.Append((byte)'-');
                    }
                    buf.Append((byte)'0');
                    buf.Append((byte)'.');

                    buf.Append((byte)(v / 10000 + ZERO));
                    if (v % 10000 != 0)
                    {
                        buf.Append((byte)((v / 1000) % 10 + ZERO));
                        if (v % 1000 != 0)
                        {
                            buf.Append((byte)((v / 100) % 10 + ZERO));
                            if (v % 100 != 0)
                            {
                                buf.Append((byte)((v / 10) % 10 + ZERO));
                                if (v % 10 != 0)
                                {
                                    buf.Append((byte)((v) % 10 + ZERO));
                                }
                            }
                        }
                    }
                    return(null);
                }
                else
                {
                    int x = 100000;
                    int v = (int)(d * x);

                    StringBuilder res = new StringBuilder();
                    if (negative)
                    {
                        res.Append('-');
                    }
                    res.Append("0.");

                    while (v < x / 10)
                    {
                        res.Append('0');
                        x /= 10;
                    }
                    res.Append(v);
                    int cut = res.Length - 1;
                    while (res[cut] == '0')
                    {
                        --cut;
                    }
                    res.Length = cut + 1;
                    return(res.ToString());
                }
            }
            else if (d <= 32767)
            {
                d += 0.005;
                int v = (int)(d * 100);

                if (v < _byteCacheSize && _byteCache[v] != null)
                {
                    if (buf != null)
                    {
                        if (negative)
                        {
                            buf.Append((byte)'-');
                        }
                        buf.Append(_byteCache[v]);
                        return(null);
                    }
                    else
                    {
                        string tmp = PdfEncodings.ConvertToString(_byteCache[v], null);
                        if (negative)
                        {
                            tmp = "-" + tmp;
                        }
                        return(tmp);
                    }
                }
                if (buf != null)
                {
                    if (v < _byteCacheSize)
                    {
                        //create the cachebyte[]
                        byte[] cache;
                        int    size = 0;
                        if (v >= 1000000)
                        {
                            //the original number is >=10000, we need 5 more bytes
                            size += 5;
                        }
                        else if (v >= 100000)
                        {
                            //the original number is >=1000, we need 4 more bytes
                            size += 4;
                        }
                        else if (v >= 10000)
                        {
                            //the original number is >=100, we need 3 more bytes
                            size += 3;
                        }
                        else if (v >= 1000)
                        {
                            //the original number is >=10, we need 2 more bytes
                            size += 2;
                        }
                        else if (v >= 100)
                        {
                            //the original number is >=1, we need 1 more bytes
                            size += 1;
                        }

                        //now we must check if we have a decimal number
                        if (v % 100 != 0)
                        {
                            //yes, do not forget the "."
                            size += 2;
                        }
                        if (v % 10 != 0)
                        {
                            size++;
                        }
                        cache = new byte[size];
                        int add = 0;
                        if (v >= 1000000)
                        {
                            cache[add++] = _bytes[(v / 1000000)];
                        }
                        if (v >= 100000)
                        {
                            cache[add++] = _bytes[(v / 100000) % 10];
                        }
                        if (v >= 10000)
                        {
                            cache[add++] = _bytes[(v / 10000) % 10];
                        }
                        if (v >= 1000)
                        {
                            cache[add++] = _bytes[(v / 1000) % 10];
                        }
                        if (v >= 100)
                        {
                            cache[add++] = _bytes[(v / 100) % 10];
                        }

                        if (v % 100 != 0)
                        {
                            cache[add++] = (byte)'.';
                            cache[add++] = _bytes[(v / 10) % 10];
                            if (v % 10 != 0)
                            {
                                cache[add++] = _bytes[v % 10];
                            }
                        }
                        _byteCache[v] = cache;
                    }

                    if (negative)
                    {
                        buf.Append((byte)'-');
                    }
                    if (v >= 1000000)
                    {
                        buf.Append(_bytes[(v / 1000000)]);
                    }
                    if (v >= 100000)
                    {
                        buf.Append(_bytes[(v / 100000) % 10]);
                    }
                    if (v >= 10000)
                    {
                        buf.Append(_bytes[(v / 10000) % 10]);
                    }
                    if (v >= 1000)
                    {
                        buf.Append(_bytes[(v / 1000) % 10]);
                    }
                    if (v >= 100)
                    {
                        buf.Append(_bytes[(v / 100) % 10]);
                    }

                    if (v % 100 != 0)
                    {
                        buf.Append((byte)'.');
                        buf.Append(_bytes[(v / 10) % 10]);
                        if (v % 10 != 0)
                        {
                            buf.Append(_bytes[v % 10]);
                        }
                    }
                    return(null);
                }
                else
                {
                    StringBuilder res = new StringBuilder();
                    if (negative)
                    {
                        res.Append('-');
                    }
                    if (v >= 1000000)
                    {
                        res.Append(_chars[(v / 1000000)]);
                    }
                    if (v >= 100000)
                    {
                        res.Append(_chars[(v / 100000) % 10]);
                    }
                    if (v >= 10000)
                    {
                        res.Append(_chars[(v / 10000) % 10]);
                    }
                    if (v >= 1000)
                    {
                        res.Append(_chars[(v / 1000) % 10]);
                    }
                    if (v >= 100)
                    {
                        res.Append(_chars[(v / 100) % 10]);
                    }

                    if (v % 100 != 0)
                    {
                        res.Append('.');
                        res.Append(_chars[(v / 10) % 10]);
                        if (v % 10 != 0)
                        {
                            res.Append(_chars[v % 10]);
                        }
                    }
                    return(res.ToString());
                }
            }
            else
            {
                StringBuilder res = new StringBuilder();
                if (negative)
                {
                    res.Append('-');
                }
                d += 0.5;
                long v = (long)d;
                return(res.Append(v).ToString());
            }
        }
コード例 #22
0
 public static PdfObject CreateInfoId(byte[] id, bool modified) {
     ByteBuffer buf = new ByteBuffer(90);
     buf.Append('[').Append('<');
     if(id.Length != 16)
         id = CreateDocumentId();
     for (int k = 0; k < 16; ++k)
         buf.AppendHex(id[k]);
     buf.Append('>').Append('<');
     if (modified)
         id = CreateDocumentId();
     for (int k = 0; k < 16; ++k)
         buf.AppendHex(id[k]);
     buf.Append('>').Append(']');
     buf.Close();
     return new PdfLiteral(buf.ToByteArray());
 }
コード例 #23
0
        /**
         * This is the first method to be called when using external signatures. The general sequence is:
         * preClose(), getDocumentBytes() and close().
         * <p>
         * If calling preClose() <B>dont't</B> call PdfStamper.close().
         * <p>
         * <CODE>exclusionSizes</CODE> must contain at least
         * the <CODE>PdfName.CONTENTS</CODE> key with the size that it will take in the
         * document. Note that due to the hex string coding this size should be
         * byte_size*2+2.
         * @param exclusionSizes a <CODE>HashMap</CODE> with names and sizes to be excluded in the signature
         * calculation. The key is a <CODE>PdfName</CODE> and the value an
         * <CODE>Integer</CODE>. At least the <CODE>PdfName.CONTENTS</CODE> must be present
         * @throws IOException on error
         * @throws DocumentException on error
         */
        public void PreClose(Dictionary<PdfName, int> exclusionSizes) {
            if (preClosed)
                throw new DocumentException(MessageLocalization.GetComposedMessage("document.already.pre.closed"));
            stamper.MergeVerification();
            preClosed = true;
            AcroFields af = writer.GetAcroFields();
            String name = FieldName;
            bool fieldExists = !(IsInvisible() || IsNewField());
            PdfIndirectReference refSig = writer.PdfIndirectReference;
            writer.SigFlags = 3;
            PdfDictionary fieldLock = null;
            if (fieldExists) {
                PdfDictionary widget = af.GetFieldItem(name).GetWidget(0);
                writer.MarkUsed(widget);
                fieldLock = widget.GetAsDict(PdfName.LOCK);
                widget.Put(PdfName.P, writer.GetPageReference(Page));
                widget.Put(PdfName.V, refSig);
                PdfObject obj = PdfReader.GetPdfObjectRelease(widget.Get(PdfName.F));
                int flags = 0;
                if (obj != null && obj.IsNumber())
                    flags = ((PdfNumber)obj).IntValue;
                flags |= PdfAnnotation.FLAGS_LOCKED;
                widget.Put(PdfName.F, new PdfNumber(flags));
                PdfDictionary ap = new PdfDictionary();
                ap.Put(PdfName.N, GetAppearance().IndirectReference);
                widget.Put(PdfName.AP, ap);
            }
            else {
                PdfFormField sigField = PdfFormField.CreateSignature(writer);
                sigField.FieldName = name;
                sigField.Put(PdfName.V, refSig);
                sigField.Flags = PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_LOCKED;

                int pagen = Page;
                if (!IsInvisible())
                    sigField.SetWidget(PageRect, null);
                else
                    sigField.SetWidget(new Rectangle(0, 0), null);
                sigField.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, GetAppearance());
                sigField.Page = pagen;
                writer.AddAnnotation(sigField, pagen);
            }

            exclusionLocations = new Dictionary<PdfName,PdfLiteral>();
            if (cryptoDictionary == null) {
                throw new DocumentException("No crypto dictionary defined.");
            }
            else {
                PdfLiteral lit = new PdfLiteral(80);
                exclusionLocations[PdfName.BYTERANGE] = lit;
                cryptoDictionary.Put(PdfName.BYTERANGE, lit);
                foreach (KeyValuePair<PdfName,int> entry in exclusionSizes) {
                    PdfName key = entry.Key;
                    int v = entry.Value;
                    lit = new PdfLiteral(v);
                    exclusionLocations[key] = lit;
                    cryptoDictionary.Put(key, lit);
                }
                if (certificationLevel > 0)
                    AddDocMDP(cryptoDictionary);
                if (fieldLock != null)
                    AddFieldMDP(cryptoDictionary, fieldLock);
                if (signatureEvent != null)
                    signatureEvent.GetSignatureDictionary(cryptoDictionary);
                writer.AddToBody(cryptoDictionary, refSig, false);
            }
            if (certificationLevel > 0) {
                // add DocMDP entry to root
                PdfDictionary docmdp = new PdfDictionary();
                docmdp.Put(new PdfName("DocMDP"), refSig);
                writer.reader.Catalog.Put(new PdfName("Perms"), docmdp);
            }
            writer.Close(stamper.MoreInfo);
            
            range = new long[exclusionLocations.Count * 2];
            long byteRangePosition = exclusionLocations[PdfName.BYTERANGE].Position;
            exclusionLocations.Remove(PdfName.BYTERANGE);
            int idx = 1;
            foreach (PdfLiteral lit in exclusionLocations.Values) {
                long n = lit.Position;
                range[idx++] = n;
                range[idx++] = lit.PosLength + n;
            }
            Array.Sort(range, 1, range.Length - 2);
            for (int k = 3; k < range.Length - 2; k += 2)
                range[k] -= range[k - 1];
            
            if (tempFile == null) {
                bout = sigout.Buffer;
                boutLen = sigout.Size;
                range[range.Length - 1] = boutLen - range[range.Length - 2];
                ByteBuffer bf = new ByteBuffer();
                bf.Append('[');
                for (int k = 0; k < range.Length; ++k)
                    bf.Append(range[k]).Append(' ');
                bf.Append(']');
                Array.Copy(bf.Buffer, 0, bout, byteRangePosition, bf.Size);
            }
            else {
                try {
                    raf = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite);
                    long len = raf.Length;
                    range[range.Length - 1] = len - range[range.Length - 2];
                    ByteBuffer bf = new ByteBuffer();
                    bf.Append('[');
                    for (int k = 0; k < range.Length; ++k)
                        bf.Append(range[k]).Append(' ');
                    bf.Append(']');
                    raf.Seek(byteRangePosition, SeekOrigin.Begin);
                    raf.Write(bf.Buffer, 0, bf.Size);
                }
                catch (IOException e) {
                    try{raf.Close();}catch{}
                    try{File.Delete(tempFile);}catch{}
                    throw e;
                }
            }
        }
コード例 #24
0
            private void SerObject(PdfObject obj, int level, ByteBuffer bb, Dictionary <RefKey, int> serialized)
            {
                if (level <= 0)
                {
                    return;
                }
                if (obj == null)
                {
                    bb.Append("$Lnull");
                    return;
                }

                PdfIndirectReference refe    = null;
                ByteBuffer           savedBb = null;

                if (obj.IsIndirect())
                {
                    refe = (PdfIndirectReference)obj;
                    RefKey key = new RefKey(refe);
                    if (serialized.ContainsKey(key))
                    {
                        bb.Append(serialized[key]);
                        return;
                    }
                    else
                    {
                        savedBb = bb;
                        bb      = new ByteBuffer();
                    }
                }
                obj = PdfReader.GetPdfObject(obj);
                if (obj.IsStream())
                {
                    bb.Append("$B");
                    SerDic((PdfDictionary)obj, level - 1, bb, serialized);
                    if (level > 0)
                    {
                        bb.Append(DigestAlgorithms.Digest("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj)));
                    }
                }
                else if (obj.IsDictionary())
                {
                    SerDic((PdfDictionary)obj, level - 1, bb, serialized);
                }
                else if (obj.IsArray())
                {
                    SerArray((PdfArray)obj, level - 1, bb, serialized);
                }
                else if (obj.IsString())
                {
                    bb.Append("$S").Append(obj.ToString());
                }
                else if (obj.IsName())
                {
                    bb.Append("$N").Append(obj.ToString());
                }
                else
                {
                    bb.Append("$L").Append(obj.ToString());
                }

                if (savedBb != null)
                {
                    RefKey key = new RefKey(refe);
                    if (!serialized.ContainsKey(key))
                    {
                        serialized[key] = CalculateHash(bb.Buffer);
                    }
                    savedBb.Append(bb);
                }
            }
コード例 #25
0
ファイル: PdfSmartCopy.cs プロジェクト: jagruti23/itextsharp
 private void SerArray(PdfArray array, int level, ByteBuffer bb, Dictionary<RefKey, int> serialized)
 {
     bb.Append("$A");
     if (level <= 0)
         return;
     for (int k = 0; k < array.Size; ++k) {
         SerObject(array[k], level, bb, serialized);
     }
 }
コード例 #26
0
 private void SerObject(PdfObject obj, int level, ByteBuffer bb) {
     if (level <= 0)
         return;
     if (obj == null) {
         bb.Append("$Lnull");
         return;
     }
     if (obj.IsIndirect()) {
         if (serialized.Contains(obj))
             return;
         else
             serialized.Add(obj);
     }
     obj = PdfReader.GetPdfObject(obj);
     if (obj.IsStream()) {
         bb.Append("$B");
         SerDic((PdfDictionary)obj, level - 1, bb);
         if (level > 0) {
             bb.Append(DigestAlgorithms.Digest("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj)));
         }
     }
     else if (obj.IsDictionary()) {
         SerDic((PdfDictionary)obj, level - 1, bb);
     }
     else if (obj.IsArray()) {
         SerArray((PdfArray)obj, level - 1, bb);
     }
     else if (obj.IsString()) {
         bb.Append("$S").Append(obj.ToString());
     }
     else if (obj.IsName()) {
         bb.Append("$N").Append(obj.ToString());
     }
     else
         bb.Append("$L").Append(obj.ToString());
 }
コード例 #27
0
ファイル: PdfName.cs プロジェクト: pusp/o2platform
 /**
 * Encodes a plain name given in the unescaped form "AB CD" into "/AB#20CD".
 *
 * @param name the name to encode
 * @return the encoded name
 * @since	2.1.5
 */
 public static byte[] EncodeName(String name) {
     int length = name.Length;
     // every special character has to be substituted
     ByteBuffer pdfName = new ByteBuffer(length + 20);
     pdfName.Append('/');
     char[] chars = name.ToCharArray();
     char character;
     // loop over all the characters
     foreach (char cc in chars) {
         character = (char)(cc & 0xff);
         // special characters are escaped (reference manual p.39)
         switch (character) {
             case ' ':
             case '%':
             case '(':
             case ')':
             case '<':
             case '>':
             case '[':
             case ']':
             case '{':
             case '}':
             case '/':
             case '#':
                 pdfName.Append('#');
                 pdfName.Append(System.Convert.ToString(character, 16));
                 break;
             default:
                 if (character > 126 || character < 32) {
                     pdfName.Append('#');
                     if (character < 16)
                         pdfName.Append('0');
                     pdfName.Append(System.Convert.ToString(character, 16));
                 }
                 else
                     pdfName.Append(character);
                 break;
         }
     }
     return pdfName.ToByteArray();
 }
コード例 #28
0
ファイル: PdfName.cs プロジェクト: hjgode/iTextSharpCF
 /**
 * Constructs a new <CODE>PdfName</CODE>.
 * @param name the new name
 * @param lengthCheck if <CODE>true</CODE> check the lenght validity, if <CODE>false</CODE> the name can
 * have any length
 */
 public PdfName(string name, bool lengthCheck)
     : base(PdfObject.NAME)
 {
     // The minimum number of characters in a name is 0, the maximum is 127 (the '/' not included)
     int length = name.Length;
     if (lengthCheck && length > 127) {
         throw new ArgumentException("The name '" + name + "' is too long (" + length + " characters).");
     }
     // every special character has to be substituted
     ByteBuffer pdfName = new ByteBuffer(length + 20);
     pdfName.Append('/');
     char[] chars = name.ToCharArray();
     char character;
     // loop over all the characters
     foreach (char cc in chars) {
         character = (char)(cc & 0xff);
         // special characters are escaped (reference manual p.39)
         switch (character) {
             case ' ':
             case '%':
             case '(':
             case ')':
             case '<':
             case '>':
             case '[':
             case ']':
             case '{':
             case '}':
             case '/':
             case '#':
                 pdfName.Append('#');
                 pdfName.Append(System.Convert.ToString(character, 16));
                 break;
             default:
                 if (character > 126 || character < 32) {
                     pdfName.Append('#');
                     if (character < 16)
                         pdfName.Append('0');
                     pdfName.Append(System.Convert.ToString(character, 16));
                 }
                 else
                     pdfName.Append(character);
                 break;
         }
     }
     bytes = pdfName.ToByteArray();
 }
コード例 #29
0
 /**
  * Escapes a <CODE>byte</CODE> array according to the PDF conventions.
  *
  * @param b the <CODE>byte</CODE> array to escape
  */
 internal static void EscapeString(byte[] b, ByteBuffer content)
 {
     content.Append_i('(');
     for (int k = 0; k < b.Length; ++k) {
         byte c = b[k];
         switch ((int)c) {
             case '\r':
                 content.Append("\\r");
                 break;
             case '\n':
                 content.Append("\\n");
                 break;
             case '\t':
                 content.Append("\\t");
                 break;
             case '\b':
                 content.Append("\\b");
                 break;
             case '\f':
                 content.Append("\\f");
                 break;
             case '(':
             case ')':
             case '\\':
                 content.Append_i('\\').Append_i(c);
                 break;
             default:
                 content.Append_i(c);
                 break;
         }
     }
     content.Append(')');
 }
コード例 #30
0
        private static ArrayList BookmarkDepth(PdfReader reader, PdfDictionary outline, IntHashtable pages)
        {
            ArrayList list = new ArrayList();

            while (outline != null)
            {
                Hashtable map   = new Hashtable();
                PdfString title = (PdfString)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.TITLE));
                map["Title"] = title.ToUnicodeString();
                PdfArray color = (PdfArray)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.C));
                if (color != null && color.ArrayList.Count == 3)
                {
                    ByteBuffer outp = new ByteBuffer();
                    ArrayList  arr  = color.ArrayList;
                    outp.Append(((PdfNumber)arr[0]).FloatValue).Append(' ');
                    outp.Append(((PdfNumber)arr[1]).FloatValue).Append(' ');
                    outp.Append(((PdfNumber)arr[2]).FloatValue);
                    map["Color"] = PdfEncodings.ConvertToString(outp.ToByteArray(), null);
                }
                PdfNumber style = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.F));
                if (style != null)
                {
                    int    f = style.IntValue;
                    String s = "";
                    if ((f & 1) != 0)
                    {
                        s += "italic ";
                    }
                    if ((f & 2) != 0)
                    {
                        s += "bold ";
                    }
                    s = s.Trim();
                    if (s.Length != 0)
                    {
                        map["Style"] = s;
                    }
                }
                PdfNumber count = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.COUNT));
                if (count != null && count.IntValue < 0)
                {
                    map["Open"] = "false";
                }
                try {
                    PdfObject dest = PdfReader.GetPdfObjectRelease(outline.Get(PdfName.DEST));
                    if (dest != null)
                    {
                        MapGotoBookmark(map, dest, pages); //changed by ujihara 2004-06-13
                    }
                    else
                    {
                        PdfDictionary action = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.A));
                        if (action != null)
                        {
                            if (PdfName.GOTO.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                                if (dest != null)
                                {
                                    MapGotoBookmark(map, dest, pages);
                                }
                            }
                            else if (PdfName.URI.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                map["Action"] = "URI";
                                map["URI"]    = ((PdfString)PdfReader.GetPdfObjectRelease(action.Get(PdfName.URI))).ToUnicodeString();
                            }
                            else if (PdfName.GOTOR.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                                if (dest != null)
                                {
                                    if (dest.IsString())
                                    {
                                        map["Named"] = dest.ToString();
                                    }
                                    else if (dest.IsName())
                                    {
                                        map["NamedN"] = PdfName.DecodeName(dest.ToString());
                                    }
                                    else if (dest.IsArray())
                                    {
                                        ArrayList     arr = ((PdfArray)dest).ArrayList;
                                        StringBuilder s   = new StringBuilder();
                                        s.Append(arr[0].ToString());
                                        s.Append(' ').Append(arr[1].ToString());
                                        for (int k = 2; k < arr.Count; ++k)
                                        {
                                            s.Append(' ').Append(arr[k].ToString());
                                        }
                                        map["Page"] = s.ToString();
                                    }
                                }
                                map["Action"] = "GoToR";
                                PdfObject file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                                if (file != null)
                                {
                                    if (file.IsString())
                                    {
                                        map["File"] = ((PdfString)file).ToUnicodeString();
                                    }
                                    else if (file.IsDictionary())
                                    {
                                        file = PdfReader.GetPdfObject(((PdfDictionary)file).Get(PdfName.F));
                                        if (file.IsString())
                                        {
                                            map["File"] = ((PdfString)file).ToUnicodeString();
                                        }
                                    }
                                }
                                PdfObject newWindow = PdfReader.GetPdfObjectRelease(action.Get(PdfName.NEWWINDOW));
                                if (newWindow != null)
                                {
                                    map["NewWindow"] = newWindow.ToString();
                                }
                            }
                            else if (PdfName.LAUNCH.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                map["Action"] = "Launch";
                                PdfObject file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                                if (file == null)
                                {
                                    file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.WIN));
                                }
                                if (file != null)
                                {
                                    if (file.IsString())
                                    {
                                        map["File"] = ((PdfString)file).ToUnicodeString();
                                    }
                                    else if (file.IsDictionary())
                                    {
                                        file = PdfReader.GetPdfObjectRelease(((PdfDictionary)file).Get(PdfName.F));
                                        if (file.IsString())
                                        {
                                            map["File"] = ((PdfString)file).ToUnicodeString();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch  {
                    //empty on purpose
                }
                PdfDictionary first = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.FIRST));
                if (first != null)
                {
                    map["Kids"] = BookmarkDepth(reader, first, pages);
                }
                list.Add(map);
                outline = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.NEXT));
            }
            return(list);
        }
コード例 #31
0
ファイル: PdfSmartCopy.cs プロジェクト: jomamorales/createPDF
 private void SerDic(PdfDictionary dic, int level, ByteBuffer bb)
 {
     bb.Append("$D");
     if (level <= 0)
         return;
     PdfName[] keys = new PdfName[dic.Size];
     dic.Keys.CopyTo(keys, 0);
     Array.Sort<PdfName>(keys);
     for (int k = 0; k < keys.Length; ++k) {
         SerObject(keys[k], level, bb);
         SerObject(dic.Get(keys[k]), level, bb);
     }
 }
コード例 #32
0
 /**
 * Outputs a <CODE>double</CODE> into a format suitable for the PDF.
 * @param d a double
 * @param buf a ByteBuffer
 * @return the <CODE>String</CODE> representation of the <CODE>double</CODE> if
 * <CODE>buf</CODE> is <CODE>null</CODE>. If <CODE>buf</CODE> is <B>not</B> <CODE>null</CODE>,
 * then the double is appended directly to the buffer and this methods returns <CODE>null</CODE>.
 */
 public static string FormatDouble(double d, ByteBuffer buf) {
     if (HIGH_PRECISION) {
         String sform = d.ToString("0.######", CultureInfo.InvariantCulture);
         if (buf == null)
             return sform;
         else {
             buf.Append(sform);
             return null;
         }
     }
     bool negative = false;
     if (Math.Abs(d) < 0.000015) {
         if (buf != null) {
             buf.Append(ZERO);
             return null;
         } else {
             return "0";
         }
     }
     if (d < 0) {
         negative = true;
         d = -d;
     }
     if (d < 1.0) {
         d += 0.000005;
         if (d >= 1) {
             if (negative) {
                 if (buf != null) {
                     buf.Append((byte)'-');
                     buf.Append((byte)'1');
                     return null;
                 } else {
                     return "-1";
                 }
             } else {
                 if (buf != null) {
                     buf.Append((byte)'1');
                     return null;
                 } else {
                     return "1";
                 }
             }
         }
         if (buf != null) {
             int v = (int) (d * 100000);
         
             if (negative) buf.Append((byte)'-');
             buf.Append((byte)'0');
             buf.Append((byte)'.');
         
             buf.Append( (byte)(v / 10000 + ZERO) );
             if (v % 10000 != 0) {
                 buf.Append( (byte)((v / 1000) % 10 + ZERO) );
                 if (v % 1000 != 0) {
                     buf.Append( (byte)((v / 100) % 10 + ZERO) );
                     if (v % 100 != 0) {
                         buf.Append((byte)((v / 10) % 10 + ZERO) );
                         if (v % 10 != 0) {
                             buf.Append((byte)((v) % 10 + ZERO) );
                         }
                     }
                 }
             }
             return null;
         } else {
             int x = 100000;
             int v = (int) (d * x);
         
             StringBuilder res = new StringBuilder();
             if (negative) res.Append('-');
             res.Append("0.");
         
             while ( v < x/10 ) {
                 res.Append('0');
                 x /= 10;
             }
             res.Append(v);
             int cut = res.Length - 1;
             while (res[cut] == '0') {
                 --cut;
             }
             res.Length = cut + 1;
             return res.ToString();
         }
     } else if (d <= 32767) {
         d += 0.005;
         int v = (int) (d * 100);
     
         if (v < byteCacheSize && byteCache[v] != null) {
             if (buf != null) {
                 if (negative) buf.Append((byte)'-');
                 buf.Append(byteCache[v]);
                 return null;
             } else {
                 string tmp = PdfEncodings.ConvertToString(byteCache[v], null);
                 if (negative) tmp = "-" + tmp;
                 return tmp;
             }
         }
         if (buf != null) {
             if (v < byteCacheSize) {
                 //create the cachebyte[]
                 byte[] cache;
                 int size = 0;
                 if (v >= 1000000) {
                     //the original number is >=10000, we need 5 more bytes
                     size += 5;
                 } else if (v >= 100000) {
                     //the original number is >=1000, we need 4 more bytes
                     size += 4;
                 } else if (v >= 10000) {
                     //the original number is >=100, we need 3 more bytes
                     size += 3;
                 } else if (v >= 1000) {
                     //the original number is >=10, we need 2 more bytes
                     size += 2;
                 } else if (v >= 100) {
                     //the original number is >=1, we need 1 more bytes
                     size += 1;
                 }
             
                 //now we must check if we have a decimal number
                 if (v % 100 != 0) {
                     //yes, do not forget the "."
                     size += 2;
                 }
                 if (v % 10 != 0) {
                     size++;
                 }
                 cache = new byte[size];
                 int add = 0;
                 if (v >= 1000000) {
                     cache[add++] = bytes[(v / 1000000)];
                 }
                 if (v >= 100000) {
                     cache[add++] = bytes[(v / 100000) % 10];
                 }
                 if (v >= 10000) {
                     cache[add++] = bytes[(v / 10000) % 10];
                 }
                 if (v >= 1000) {
                     cache[add++] = bytes[(v / 1000) % 10];
                 }
                 if (v >= 100) {
                     cache[add++] = bytes[(v / 100) % 10];
                 }
             
                 if (v % 100 != 0) {
                     cache[add++] = (byte)'.';
                     cache[add++] = bytes[(v / 10) % 10];
                     if (v % 10 != 0) {
                         cache[add++] = bytes[v % 10];
                     }
                 }
                 byteCache[v] = cache;
             }
         
             if (negative) buf.Append((byte)'-');
             if (v >= 1000000) {
                 buf.Append( bytes[(v / 1000000)] );
             }
             if (v >= 100000) {
                 buf.Append( bytes[(v / 100000) % 10] );
             }
             if (v >= 10000) {
                 buf.Append( bytes[(v / 10000) % 10] );
             }
             if (v >= 1000) {
                 buf.Append( bytes[(v / 1000) % 10] );
             }
             if (v >= 100) {
                 buf.Append( bytes[(v / 100) % 10] );
             }
         
             if (v % 100 != 0) {
                 buf.Append((byte)'.');
                 buf.Append( bytes[(v / 10) % 10] );
                 if (v % 10 != 0) {
                     buf.Append( bytes[v % 10] );
                 }
             }
             return null;
         } else {
             StringBuilder res = new StringBuilder();
             if (negative) res.Append('-');
             if (v >= 1000000) {
                 res.Append( chars[(v / 1000000)] );
             }
             if (v >= 100000) {
                 res.Append( chars[(v / 100000) % 10] );
             }
             if (v >= 10000) {
                 res.Append( chars[(v / 10000) % 10] );
             }
             if (v >= 1000) {
                 res.Append( chars[(v / 1000) % 10] );
             }
             if (v >= 100) {
                 res.Append( chars[(v / 100) % 10] );
             }
         
             if (v % 100 != 0) {
                 res.Append('.');
                 res.Append( chars[(v / 10) % 10] );
                 if (v % 10 != 0) {
                     res.Append( chars[v % 10] );
                 }
             }
             return res.ToString();
         }
     } else {
         d += 0.5;
         long v = (long) d;
         if (negative) 
             return "-" + v.ToString(CultureInfo.InvariantCulture);
         else
             return v.ToString(CultureInfo.InvariantCulture);
     }
 }
コード例 #33
0
ファイル: PdfCopy.cs プロジェクト: mohsenmetn/itextsharp
            public void AlterContents()
            {
                if (over == null && under == null)
                {
                    return;
                }
                PdfArray  ar      = null;
                PdfObject content = PdfReader.GetPdfObject(pageN.Get(PdfName.CONTENTS), pageN);

                if (content == null)
                {
                    ar = new PdfArray();
                    pageN.Put(PdfName.CONTENTS, ar);
                }
                else if (content.IsArray())
                {
                    ar = (PdfArray)content;
                }
                else if (content.IsStream())
                {
                    ar = new PdfArray();
                    ar.Add(pageN.Get(PdfName.CONTENTS));
                    pageN.Put(PdfName.CONTENTS, ar);
                }
                else
                {
                    ar = new PdfArray();
                    pageN.Put(PdfName.CONTENTS, ar);
                }
                ByteBuffer out_p = new ByteBuffer();

                if (under != null)
                {
                    out_p.Append(PdfContents.SAVESTATE);
                    ApplyRotation(pageN, out_p);
                    out_p.Append(under.InternalBuffer);
                    out_p.Append(PdfContents.RESTORESTATE);
                }
                if (over != null)
                {
                    out_p.Append(PdfContents.SAVESTATE);
                }
                PdfStream stream = new PdfStream(out_p.ToByteArray());

                stream.FlateCompress(cstp.CompressionLevel);
                PdfIndirectReference ref1 = cstp.AddToBody(stream).IndirectReference;

                ar.AddFirst(ref1);
                out_p.Reset();
                if (over != null)
                {
                    out_p.Append(' ');
                    out_p.Append(PdfContents.RESTORESTATE);
                    out_p.Append(PdfContents.SAVESTATE);
                    ApplyRotation(pageN, out_p);
                    out_p.Append(over.InternalBuffer);
                    out_p.Append(PdfContents.RESTORESTATE);
                    stream = new PdfStream(out_p.ToByteArray());
                    stream.FlateCompress(cstp.CompressionLevel);
                    ar.Add(cstp.AddToBody(stream).IndirectReference);
                }
                pageN.Put(PdfName.RESOURCES, pageResources.Resources);
            }
コード例 #34
0
ファイル: PdfCopy.cs プロジェクト: mohsenmetn/itextsharp
            void ApplyRotation(PdfDictionary pageN, ByteBuffer out_p)
            {
                if (!cstp.rotateContents)
                {
                    return;
                }
                Rectangle page     = reader.GetPageSizeWithRotation(pageN);
                int       rotation = page.Rotation;

                switch (rotation)
                {
                case 90:
                    out_p.Append(PdfContents.ROTATE90);
                    out_p.Append(page.Top);
                    out_p.Append(' ').Append('0').Append(PdfContents.ROTATEFINAL);
                    break;

                case 180:
                    out_p.Append(PdfContents.ROTATE180);
                    out_p.Append(page.Right);
                    out_p.Append(' ');
                    out_p.Append(page.Top);
                    out_p.Append(PdfContents.ROTATEFINAL);
                    break;

                case 270:
                    out_p.Append(PdfContents.ROTATE270);
                    out_p.Append('0').Append(' ');
                    out_p.Append(page.Right);
                    out_p.Append(PdfContents.ROTATEFINAL);
                    break;
                }
            }
コード例 #35
0
 internal void ApplyRotation(PdfDictionary pageN, ByteBuffer out_p) {
     if (!rotateContents)
         return;
     Rectangle page = reader.GetPageSizeWithRotation(pageN);
     int rotation = page.Rotation;
     switch (rotation) {
         case 90:
             out_p.Append(PdfContents.ROTATE90);
             out_p.Append(page.Top);
             out_p.Append(' ').Append('0').Append(PdfContents.ROTATEFINAL);
             break;
         case 180:
             out_p.Append(PdfContents.ROTATE180);
             out_p.Append(page.Right);
             out_p.Append(' ');
             out_p.Append(page.Top);
             out_p.Append(PdfContents.ROTATEFINAL);
             break;
         case 270:
             out_p.Append(PdfContents.ROTATE270);
             out_p.Append('0').Append(' ');
             out_p.Append(page.Right);
             out_p.Append(PdfContents.ROTATEFINAL);
             break;
     }
 }
コード例 #36
0
            public void AlterContents()
            {
                if (_over == null && _under == null)
                {
                    return;
                }

                PdfArray ar      = null;
                var      content = PdfReader.GetPdfObject(_pageN.Get(PdfName.Contents), _pageN);

                if (content == null)
                {
                    ar = new PdfArray();
                    _pageN.Put(PdfName.Contents, ar);
                }
                else if (content.IsArray())
                {
                    ar = (PdfArray)content;
                }
                else if (content.IsStream())
                {
                    ar = new PdfArray();
                    ar.Add(_pageN.Get(PdfName.Contents));
                    _pageN.Put(PdfName.Contents, ar);
                }
                else
                {
                    ar = new PdfArray();
                    _pageN.Put(PdfName.Contents, ar);
                }
                var outP = new ByteBuffer();

                if (_under != null)
                {
                    outP.Append(PdfContents.Savestate);
                    applyRotation(_pageN, outP);
                    outP.Append(_under.InternalBuffer);
                    outP.Append(PdfContents.Restorestate);
                }
                if (_over != null)
                {
                    outP.Append(PdfContents.Savestate);
                }

                var stream = new PdfStream(outP.ToByteArray());

                stream.FlateCompress(_cstp.CompressionLevel);
                var ref1 = _cstp.AddToBody(stream).IndirectReference;

                ar.AddFirst(ref1);
                outP.Reset();
                if (_over != null)
                {
                    outP.Append(' ');
                    outP.Append(PdfContents.Restorestate);
                    outP.Append(PdfContents.Savestate);
                    applyRotation(_pageN, outP);
                    outP.Append(_over.InternalBuffer);
                    outP.Append(PdfContents.Restorestate);
                    stream = new PdfStream(outP.ToByteArray());
                    stream.FlateCompress(_cstp.CompressionLevel);
                    ar.Add(_cstp.AddToBody(stream).IndirectReference);
                }
                _pageN.Put(PdfName.Resources, _pageResources.Resources);
            }
コード例 #37
0
 /**
 * Returns the PDF representation of this <CODE>PdfObject</CODE>.
 * @param os
 * @throws IOException
 */
 
 public void ToPdf(Stream os) {
     String s1 = offset.ToString().PadLeft(10, '0');
     String s2 = generation.ToString().PadLeft(5, '0');
     ByteBuffer buf = new ByteBuffer(40);
     if (generation == GENERATION_MAX) {
         buf.Append(s1).Append(' ').Append(s2).Append(" f \n");
     }
     else {
         buf.Append(s1).Append(' ').Append(s2).Append(" n \n");
     }
     os.Write(buf.Buffer, 0, buf.Size);
 }
コード例 #38
0
 private void SerDic(PdfDictionary dic, int level,  ByteBuffer bb, Dictionary<RefKey, int> serialized)
 {
     bb.Append("$D");
     if (level <= 0)
         return;
     PdfName[] keys = new PdfName[dic.Size];
     dic.Keys.CopyTo(keys, 0);
     Array.Sort(keys);
     for (int k = 0; k < keys.Length; ++k) {
         if (keys[k].Equals(PdfName.P) && (dic.Get(keys[k]).IsIndirect() || dic.Get(keys[k]).IsDictionary())) // ignore recursive call
             continue;
             SerObject(keys[k], level, bb, serialized);
             SerObject(dic.Get(keys[k]), level, bb, serialized);
         
     }
 }