Beispiel #1
0
 internal void AddDefaultColor(PdfName name, PdfObject obj)
 {
     if (obj == null || obj.IsNull())
     {
         colorDictionary.Remove(name);
     }
     else
     {
         colorDictionary.Put(name, obj);
     }
 }
Beispiel #2
0
 /**
  * Moves the field keys from <CODE>from</CODE> to <CODE>to</CODE>. The moved keys
  * are removed from <CODE>from</CODE>.
  * @param from the source
  * @param to the destination. It may be <CODE>null</CODE>
  */
 public static void MoveFields(PdfDictionary from, PdfDictionary to)
 {
     PdfName[] keys = new PdfName[from.Size];
     foreach (PdfName key in keys)
     {
         if (fieldKeys.ContainsKey(key))
         {
             if (to != null)
             {
                 to.Put(key, from.Get(key));
             }
             from.Remove(key);
         }
     }
 }
Beispiel #3
0
        protected PdfArray BranchForm(Hashtable level, PdfIndirectReference parent, String fname)
        {
            PdfArray arr = new PdfArray();

            foreach (DictionaryEntry entry in level)
            {
                String name = (String)entry.Key;
                Object obj  = entry.Value;
                PdfIndirectReference ind = PdfIndirectReference;
                PdfDictionary        dic = new PdfDictionary();
                if (parent != null)
                {
                    dic.Put(PdfName.PARENT, parent);
                }
                dic.Put(PdfName.T, new PdfString(name, PdfObject.TEXT_UNICODE));
                String fname2 = fname + "." + name;
                int    coidx  = calculationOrder.IndexOf(fname2);
                if (coidx >= 0)
                {
                    calculationOrderRefs[coidx] = ind;
                }
                if (obj is Hashtable)
                {
                    dic.Put(PdfName.KIDS, BranchForm((Hashtable)obj, ind, fname2));
                    arr.Add(ind);
                    AddToBody(dic, ind);
                }
                else
                {
                    ArrayList list = (ArrayList)obj;
                    dic.MergeDifferent((PdfDictionary)list[0]);
                    if (list.Count == 3)
                    {
                        dic.MergeDifferent((PdfDictionary)list[2]);
                        int           page    = (int)list[1];
                        PdfDictionary pageDic = (PdfDictionary)pageDics[page - 1];
                        PdfArray      annots  = pageDic.GetAsArray(PdfName.ANNOTS);
                        if (annots == null)
                        {
                            annots = new PdfArray();
                            pageDic.Put(PdfName.ANNOTS, annots);
                        }
                        PdfNumber nn = (PdfNumber)dic.Get(iTextTag);
                        dic.Remove(iTextTag);
                        AdjustTabOrder(annots, ind, nn);
                    }
                    else
                    {
                        PdfArray kids = new PdfArray();
                        for (int k = 1; k < list.Count; k += 2)
                        {
                            int           page    = (int)list[k];
                            PdfDictionary pageDic = (PdfDictionary)pageDics[page - 1];
                            PdfArray      annots  = pageDic.GetAsArray(PdfName.ANNOTS);
                            if (annots == null)
                            {
                                annots = new PdfArray();
                                pageDic.Put(PdfName.ANNOTS, annots);
                            }
                            PdfDictionary widget = new PdfDictionary();
                            widget.Merge((PdfDictionary)list[k + 1]);
                            widget.Put(PdfName.PARENT, ind);
                            PdfNumber nn = (PdfNumber)widget.Get(iTextTag);
                            widget.Remove(iTextTag);
                            PdfIndirectReference wref = AddToBody(widget).IndirectReference;
                            AdjustTabOrder(annots, wref, nn);
                            kids.Add(wref);
                            Propagate(widget, null, false);
                        }
                        dic.Put(PdfName.KIDS, kids);
                    }
                    arr.Add(ind);
                    AddToBody(dic, ind);
                    Propagate(dic, null, false);
                }
            }
            return(arr);
        }
Beispiel #4
0
 protected virtual void KidNode(PdfDictionary merged, String name)
 {
     PdfArray kids = merged.GetAsArray(PdfName.KIDS);
     if (kids == null || kids.Size == 0) {
         if (name.Length > 0)
             name = name.Substring(1);
         fields[name] = merged;
     }
     else {
         merged.Remove(PdfName.KIDS);
         for (int k = 0; k < kids.Size; ++k) {
             PdfDictionary dic = new PdfDictionary();
             dic.Merge(merged);
             PdfDictionary newDic = kids.GetAsDict(k);
             PdfString t = newDic.GetAsString(PdfName.T);
             String newName = name;
             if (t != null)
                 newName += "." + t.ToUnicodeString();
             dic.Merge(newDic);
             dic.Remove(PdfName.T);
             KidNode(dic, newName);
         }
     }
 }
 protected PdfArray BranchForm(Hashtable level, PdfIndirectReference parent, String fname)
 {
     PdfArray arr = new PdfArray();
     foreach (DictionaryEntry entry in level) {
         String name = (String)entry.Key;
         Object obj = entry.Value;
         PdfIndirectReference ind = PdfIndirectReference;
         PdfDictionary dic = new PdfDictionary();
         if (parent != null)
             dic.Put(PdfName.PARENT, parent);
         dic.Put(PdfName.T, new PdfString(name, PdfObject.TEXT_UNICODE));
         String fname2 = fname + "." + name;
         int coidx = calculationOrder.IndexOf(fname2);
         if (coidx >= 0)
             calculationOrderRefs[coidx] = ind;
         if (obj is Hashtable) {
             dic.Put(PdfName.KIDS, BranchForm((Hashtable)obj, ind, fname2));
             arr.Add(ind);
             AddToBody(dic, ind);
         }
         else {
             ArrayList list = (ArrayList)obj;
             dic.MergeDifferent((PdfDictionary)list[0]);
             if (list.Count == 3) {
                 dic.MergeDifferent((PdfDictionary)list[2]);
                 int page = (int)list[1];
                 PdfDictionary pageDic = (PdfDictionary)pageDics[page - 1];
                 PdfArray annots = pageDic.GetAsArray(PdfName.ANNOTS);
                 if (annots == null) {
                     annots = new PdfArray();
                     pageDic.Put(PdfName.ANNOTS, annots);
                 }
                 PdfNumber nn = (PdfNumber)dic.Get(iTextTag);
                 dic.Remove(iTextTag);
                 AdjustTabOrder(annots, ind, nn);
             }
             else {
                 PdfArray kids = new PdfArray();
                 for (int k = 1; k < list.Count; k += 2) {
                     int page = (int)list[k];
                     PdfDictionary pageDic = (PdfDictionary)pageDics[page - 1];
                     PdfArray annots = pageDic.GetAsArray(PdfName.ANNOTS);
                     if (annots == null) {
                         annots = new PdfArray();
                         pageDic.Put(PdfName.ANNOTS, annots);
                     }
                     PdfDictionary widget = new PdfDictionary();
                     widget.Merge((PdfDictionary)list[k + 1]);
                     widget.Put(PdfName.PARENT, ind);
                     PdfNumber nn = (PdfNumber)widget.Get(iTextTag);
                     widget.Remove(iTextTag);
                     PdfIndirectReference wref = AddToBody(widget).IndirectReference;
                     AdjustTabOrder(annots, wref, nn);
                     kids.Add(wref);
                     Propagate(widget, null, false);
                 }
                 dic.Put(PdfName.KIDS, kids);
             }
             arr.Add(ind);
             AddToBody(dic, ind);
             Propagate(dic, null, false);
         }
     }
     return arr;
 }
Beispiel #6
0
 /**
 * Moves the field keys from <CODE>from</CODE> to <CODE>to</CODE>. The moved keys
 * are removed from <CODE>from</CODE>.
 * @param from the source
 * @param to the destination. It may be <CODE>null</CODE>
 */
 public static void MoveFields(PdfDictionary from, PdfDictionary to)
 {
     PdfName[] keys = new PdfName[from.Size];
     foreach (PdfName key in keys) {
         if (fieldKeys.ContainsKey(key)) {
             if (to != null)
                 to.Put(key, from.Get(key));
             from.Remove(key);
         }
     }
 }
Beispiel #7
0
 internal void Close(Hashtable moreInfo)
 {
     if (closed)
         return;
     if (useVp) {
         reader.SetViewerPreferences(viewerPreferences);
         MarkUsed(reader.Trailer.Get(PdfName.ROOT));
     }
     if (flat)
         FlatFields();
     if (flatFreeText)
         FlatFreeTextFields();
     AddFieldResources();
     PdfDictionary catalog = reader.Catalog;
     PdfDictionary pages = (PdfDictionary)PdfReader.GetPdfObject(catalog.Get(PdfName.PAGES));
     pages.Put(PdfName.ITXT, new PdfString(Document.Release));
     MarkUsed(pages);
     PdfDictionary acroForm = (PdfDictionary)PdfReader.GetPdfObject(catalog.Get(PdfName.ACROFORM), reader.Catalog);
     if (acroFields != null && acroFields.Xfa.Changed) {
         MarkUsed(acroForm);
         if (!flat)
             acroFields.Xfa.SetXfa(this);
     }
     if (sigFlags != 0) {
         if (acroForm != null) {
             acroForm.Put(PdfName.SIGFLAGS, new PdfNumber(sigFlags));
             MarkUsed(acroForm);
             MarkUsed(catalog);
         }
     }
     closed = true;
     AddSharedObjectsToBody();
     SetOutlines();
     SetJavaScript();
     AddFileAttachments();
     if (openAction != null) {
         catalog.Put(PdfName.OPENACTION, openAction);
     }
     if (pdf.pageLabels != null)
         catalog.Put(PdfName.PAGELABELS, pdf.pageLabels.GetDictionary(this));
     // OCG
     if (documentOCG.Count > 0) {
         FillOCProperties(false);
         PdfDictionary ocdict = catalog.GetAsDict(PdfName.OCPROPERTIES);
         if (ocdict == null) {
             reader.Catalog.Put(PdfName.OCPROPERTIES, OCProperties);
         }
         else {
             ocdict.Put(PdfName.OCGS, OCProperties.Get(PdfName.OCGS));
             PdfDictionary ddict = ocdict.GetAsDict(PdfName.D);
             if (ddict == null) {
                 ddict = new PdfDictionary();
                 ocdict.Put(PdfName.D, ddict);
             }
             ddict.Put(PdfName.ORDER, OCProperties.GetAsDict(PdfName.D).Get(PdfName.ORDER));
             ddict.Put(PdfName.RBGROUPS, OCProperties.GetAsDict(PdfName.D).Get(PdfName.RBGROUPS));
             ddict.Put(PdfName.OFF, OCProperties.GetAsDict(PdfName.D).Get(PdfName.OFF));
             ddict.Put(PdfName.AS, OCProperties.GetAsDict(PdfName.D).Get(PdfName.AS));
         }
     }
     // metadata
     int skipInfo = -1;
     PRIndirectReference iInfo = (PRIndirectReference)reader.Trailer.Get(PdfName.INFO);
     PdfDictionary oldInfo = (PdfDictionary)PdfReader.GetPdfObject(iInfo);
     String producer = null;
     if (iInfo != null)
         skipInfo = iInfo.Number;
     if (oldInfo != null && oldInfo.Get(PdfName.PRODUCER) != null)
         producer = oldInfo.GetAsString(PdfName.PRODUCER).ToString();
     if (producer == null) {
         producer = Document.Version;
     }
     else if (producer.IndexOf(Document.Product) == -1) {
         StringBuilder buf = new StringBuilder(producer);
         buf.Append("; modified using ");
         buf.Append(Document.Version);
         producer = buf.ToString();
     }
     // XMP
     byte[] altMetadata = null;
     PdfObject xmpo = PdfReader.GetPdfObject(catalog.Get(PdfName.METADATA));
     if (xmpo != null && xmpo.IsStream()) {
         altMetadata = PdfReader.GetStreamBytesRaw((PRStream)xmpo);
         PdfReader.KillIndirect(catalog.Get(PdfName.METADATA));
     }
     if (xmpMetadata != null) {
         altMetadata = xmpMetadata;
     }
     // if there is XMP data to add: add it
     PdfDate date = new PdfDate();
     if (altMetadata != null) {
         PdfStream xmp;
         try {
             XmpReader xmpr = new XmpReader(altMetadata);
             if (!xmpr.Replace("http://ns.adobe.com/pdf/1.3/", "Producer", producer))
                 xmpr.Add("rdf:Description", "http://ns.adobe.com/pdf/1.3/", "pdf:Producer", producer);
             if (!xmpr.Replace("http://ns.adobe.com/xap/1.0/", "ModifyDate", date.GetW3CDate()))
                 xmpr.Add("rdf:Description", "http://ns.adobe.com/xap/1.0/", "xmp:ModifyDate", date.GetW3CDate());
             xmpr.Replace("http://ns.adobe.com/xap/1.0/", "MetadataDate", date.GetW3CDate());
             xmp = new PdfStream(xmpr.SerializeDoc());
         }
         catch {
             xmp = new PdfStream(altMetadata);
         }
         xmp.Put(PdfName.TYPE, PdfName.METADATA);
         xmp.Put(PdfName.SUBTYPE, PdfName.XML);
         if (crypto != null && !crypto.IsMetadataEncrypted()) {
             PdfArray ar = new PdfArray();
             ar.Add(PdfName.CRYPT);
             xmp.Put(PdfName.FILTER, ar);
         }
         if (append && xmpo != null) {
             body.Add(xmp, xmpo.IndRef);
         }
         else {
             catalog.Put(PdfName.METADATA, body.Add(xmp).IndirectReference);
             MarkUsed(catalog);
         }
     }
     try {
         file.ReOpen();
         AlterContents();
         int rootN = ((PRIndirectReference)reader.trailer.Get(PdfName.ROOT)).Number;
         if (append) {
             int[] keys = marked.GetKeys();
             for (int k = 0; k < keys.Length; ++k) {
                 int j = keys[k];
                 PdfObject obj = reader.GetPdfObjectRelease(j);
                 if (obj != null && skipInfo != j && j < initialXrefSize) {
                     AddToBody(obj, j, j != rootN);
                 }
             }
             for (int k = initialXrefSize; k < reader.XrefSize; ++k) {
                 PdfObject obj = reader.GetPdfObject(k);
                 if (obj != null) {
                     AddToBody(obj, GetNewObjectNumber(reader, k, 0));
                 }
             }
         }
         else {
             for (int k = 1; k < reader.XrefSize; ++k) {
                 PdfObject obj = reader.GetPdfObjectRelease(k);
                 if (obj != null && skipInfo != k) {
                     AddToBody(obj, GetNewObjectNumber(reader, k, 0), k != rootN);
                 }
             }
         }
     }
     finally {
         try {
             file.Close();
         }
         catch  {
             // empty on purpose
         }
     }
     PdfIndirectReference encryption = null;
     PdfObject fileID = null;
     if (crypto != null) {
         if (append) {
             encryption = reader.GetCryptoRef();
         }
         else {
             PdfIndirectObject encryptionObject = AddToBody(crypto.GetEncryptionDictionary(), false);
             encryption = encryptionObject.IndirectReference;
         }
         fileID = crypto.FileID;
     }
     else
         fileID = PdfEncryption.CreateInfoId(PdfEncryption.CreateDocumentId());
     PRIndirectReference iRoot = (PRIndirectReference)reader.trailer.Get(PdfName.ROOT);
     PdfIndirectReference root = new PdfIndirectReference(0, GetNewObjectNumber(reader, iRoot.Number, 0));
     PdfIndirectReference info = null;
     PdfDictionary newInfo = new PdfDictionary();
     if (oldInfo != null) {
         foreach (PdfName key in oldInfo.Keys) {
             PdfObject value = PdfReader.GetPdfObject(oldInfo.Get(key));
             newInfo.Put(key, value);
         }
     }
     if (moreInfo != null) {
         foreach (DictionaryEntry entry in moreInfo) {
             PdfName keyName = new PdfName((String)entry.Key);
             String value = (String)entry.Value;
             if (value == null)
                 newInfo.Remove(keyName);
             else
                 newInfo.Put(keyName, new PdfString(value, PdfObject.TEXT_UNICODE));
         }
     }
     newInfo.Put(PdfName.MODDATE, date);
     newInfo.Put(PdfName.PRODUCER, new PdfString(producer));
     if (append) {
         if (iInfo == null)
             info = AddToBody(newInfo, false).IndirectReference;
         else
             info = AddToBody(newInfo, iInfo.Number, false).IndirectReference;
     }
     else {
         info = AddToBody(newInfo, false).IndirectReference;
     }
     // write the cross-reference table of the body
     body.WriteCrossReferenceTable(os, root, info, encryption, fileID, prevxref);
     if (fullCompression) {
         byte[] tmp = GetISOBytes("startxref\n");
         os.Write(tmp, 0, tmp.Length);
         tmp = GetISOBytes(body.Offset.ToString());
         os.Write(tmp, 0, tmp.Length);
         tmp = GetISOBytes("\n%%EOF\n");
         os.Write(tmp, 0, tmp.Length);
     }
     else {
         PdfTrailer trailer = new PdfTrailer(body.Size,
         body.Offset,
         root,
         info,
         encryption,
         fileID, prevxref);
         trailer.ToPdf(this, os);
     }
     os.Flush();
     if (CloseStream)
         os.Close();
     reader.Close();
 }
Beispiel #8
0
 private static void MoveRectangle(PdfDictionary dic2, PdfReader r, int pageImported, PdfName key, String name)
 {
     Rectangle m = r.GetBoxSize(pageImported, name);
     if (m == null)
         dic2.Remove(key);
     else
         dic2.Put(key, new PdfRectangle(m));
 }
        /**
        * Adds the viewer preferences defined in the preferences parameter to a
        * PdfDictionary (more specifically the root or catalog of a PDF file).
        *
        * @param catalog
        */
        public void AddToCatalog(PdfDictionary catalog)
        {
            // Page Layout
            catalog.Remove(PdfName.PAGELAYOUT);
            if ((pageLayoutAndMode & PdfWriter.PageLayoutSinglePage) != 0)
                catalog.Put(PdfName.PAGELAYOUT, PdfName.SINGLEPAGE);
            else if ((pageLayoutAndMode & PdfWriter.PageLayoutOneColumn) != 0)
                catalog.Put(PdfName.PAGELAYOUT, PdfName.ONECOLUMN);
            else if ((pageLayoutAndMode & PdfWriter.PageLayoutTwoColumnLeft) != 0)
                catalog.Put(PdfName.PAGELAYOUT, PdfName.TWOCOLUMNLEFT);
            else if ((pageLayoutAndMode & PdfWriter.PageLayoutTwoColumnRight) != 0)
                catalog.Put(PdfName.PAGELAYOUT, PdfName.TWOCOLUMNRIGHT);
            else if ((pageLayoutAndMode & PdfWriter.PageLayoutTwoPageLeft) != 0)
                catalog.Put(PdfName.PAGELAYOUT, PdfName.TWOPAGELEFT);
            else if ((pageLayoutAndMode & PdfWriter.PageLayoutTwoPageRight) != 0)
                catalog.Put(PdfName.PAGELAYOUT, PdfName.TWOPAGERIGHT);

            // Page Mode
            catalog.Remove(PdfName.PAGEMODE);
            if ((pageLayoutAndMode & PdfWriter.PageModeUseNone) != 0)
                catalog.Put(PdfName.PAGEMODE, PdfName.USENONE);
            else if ((pageLayoutAndMode & PdfWriter.PageModeUseOutlines) != 0)
                catalog.Put(PdfName.PAGEMODE, PdfName.USEOUTLINES);
            else if ((pageLayoutAndMode & PdfWriter.PageModeUseThumbs) != 0)
                catalog.Put(PdfName.PAGEMODE, PdfName.USETHUMBS);
            else if ((pageLayoutAndMode & PdfWriter.PageModeFullScreen) != 0)
                catalog.Put(PdfName.PAGEMODE, PdfName.FULLSCREEN);
            else if ((pageLayoutAndMode & PdfWriter.PageModeUseOC) != 0)
                catalog.Put(PdfName.PAGEMODE, PdfName.USEOC);
            else if ((pageLayoutAndMode & PdfWriter.PageModeUseAttachments) != 0)
                catalog.Put(PdfName.PAGEMODE, PdfName.USEATTACHMENTS);

            // viewer preferences (Table 8.1 of the PDF Reference)
            catalog.Remove(PdfName.VIEWERPREFERENCES);
            if (viewerPreferences.Size > 0) {
                catalog.Put(PdfName.VIEWERPREFERENCES, viewerPreferences);
            }
        }