Esempio n. 1
0
    public static string GetExportValue(AcroFields.Item item)
    {
        var valueDict      = item.GetValue(0);
        var appearanceDict = valueDict.GetAsDict(PdfName.AP);

        if (appearanceDict != null)
        {
            var normalAppearances = appearanceDict.GetAsDict(PdfName.N);
            if (normalAppearances != null)
            {
                foreach (var curKey in normalAppearances.Keys)
                {
                    if (!PdfName.OFF.Equals(curKey))
                    {
                        return(curKey.ToString().Substring(1));
                    }
                }
            }
        }
        var curVal = valueDict.GetAsName(PdfName.AS);

        if (curVal != null)
        {
            return(curVal.ToString().Substring(1));
        }
        else
        {
            return(string.Empty);
        }
    }
Esempio n. 2
0
// ---------------------------------------------------------------------------

        /**
         * Manipulates a PDF file src with the file dest as result
         * @param src the original PDF
         */
        public byte[] ManipulatePdf(byte[] src)
        {
            PdfReader reader = new PdfReader(src);

            using (MemoryStream ms = new MemoryStream()) {
                using (PdfStamper stamper = new PdfStamper(reader, ms)) {
                    stamper.Writer.AddJavaScript(File.ReadAllText(RESOURCE));
                    AcroFields      form = stamper.AcroFields;
                    AcroFields.Item fd   = form.GetFieldItem("married");

                    PdfDictionary dictYes =
                        (PdfDictionary)PdfReader.GetPdfObject(fd.GetWidgetRef(0));
                    PdfDictionary yesAction = dictYes.GetAsDict(PdfName.AA);
                    if (yesAction == null)
                    {
                        yesAction = new PdfDictionary();
                    }
                    yesAction.Put(
                        new PdfName("Fo"),
                        PdfAction.JavaScript("ReadOnly = false);", stamper.Writer)
                        );
                    dictYes.Put(PdfName.AA, yesAction);

                    PdfDictionary dictNo =
                        (PdfDictionary)PdfReader.GetPdfObject(fd.GetWidgetRef(1));
                    PdfDictionary noAction = dictNo.GetAsDict(PdfName.AA);
                    if (noAction == null)
                    {
                        noAction = new PdfDictionary();
                    }
                    noAction.Put(
                        new PdfName("Fo"),
                        PdfAction.JavaScript("ReadOnly = true);", stamper.Writer)
                        );
                    dictNo.Put(PdfName.AA, noAction);

                    PdfWriter       writer = stamper.Writer;
                    PushbuttonField button = new PushbuttonField(
                        writer, new Rectangle(40, 690, 200, 710), "submit"
                        );
                    button.Text    = "validate and submit";
                    button.Options = PushbuttonField.VISIBLE_BUT_DOES_NOT_PRINT;
                    PdfFormField validateAndSubmit = button.Field;
                    validateAndSubmit.Action = PdfAction.JavaScript(
                        "validate();", stamper.Writer
                        );
                    stamper.AddAnnotation(validateAndSubmit, 1);
                }
                return(ms.ToArray());
            }
        }
Esempio n. 3
0
        public static TextProperties GetTextProperties(this AcroFields pdfForm, string acroFieldName)
        {
            AcroFields.Item acroField = pdfForm.GetFieldItem(acroFieldName);
            PdfDictionary   merged    = acroField.GetMerged(0);
            TextField       textField = new TextField(null, null, null);

            pdfForm.DecodeGenericDictionary(merged, textField);

            return(new TextProperties {
                FontName = textField.Font.With(x => x.FullFontName[0][3]),
                FontSize = textField.FontSize,
                Alignment = textField.Alignment
            });
        }
Esempio n. 4
0
// ---------------------------------------------------------------------------

        /**
         * Manipulates a PDF file src with the file dest as result
         * @param src the original PDF
         */
        public byte[] ManipulatePdf(byte[] src)
        {
            PdfReader  reader = new PdfReader(src);
            AcroFields form   = reader.AcroFields;

            AcroFields.Item item   = form.GetFieldItem("post");
            PdfDictionary   field  = item.GetMerged(0);
            PdfDictionary   action = field.GetAsDict(PdfName.A);
            PdfDictionary   f      = action.GetAsDict(PdfName.F);

            f.Put(PdfName.F, new PdfString("http://NON-EXISTENT-DOMAIN.invalid/"));
            using (MemoryStream ms = new MemoryStream()) {
                using (PdfStamper stamper = new PdfStamper(reader, ms)) {
                }
                return(ms.ToArray());
            }
        }
        Queue <Tuple <string, string, string> > Fill109Rows(IEnumerable <MissionLog> logs, AcroFields fields, string fieldName)
        {
            AcroFields.Item item      = fields.GetFieldItem(fieldName);
            PdfDictionary   merged    = item.GetMerged(0);
            TextField       textField = new TextField(null, null, null);

            fields.DecodeGenericDictionary(merged, textField);

            var   collection = new Queue <Tuple <string, string, string> >();
            float fieldWidth = fields.GetFieldPositions(fieldName)[0].position.Width;
            float padRight   = textField.Font.GetWidthPoint("m", textField.FontSize);

            foreach (var log in logs)
            {
                if (log.Data == null)
                {
                    continue;
                }

                string formTime     = log.Time.ToString("HHmm");
                string formOperator = (log.Person ?? new Member()).LastName;

                foreach (var logMsg in log.Data.Replace("\r", "").Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    int left  = 0;
                    int right = logMsg.Length - 1;

                    while (left < right)
                    {
                        string part = logMsg.Substring(left, right - left + 1);
                        while (left < right && (textField.Font.GetWidthPoint(part, textField.FontSize) + padRight) > fieldWidth)
                        {
                            right = left + part.LastIndexOf(' ');
                            part  = logMsg.Substring(left, right - left);
                        }
                        collection.Enqueue(new Tuple <string, string, string>(formTime, part, formOperator));
                        formTime = "";
                        left     = right;
                        right    = logMsg.Length - 1;
                    }
                }
            }

            return(collection);
        }
Esempio n. 6
0
 /** Sets all the fields from this <CODE>AcroFields</CODE>
  * @param acro the <CODE>AcroFields</CODE>
  */
 public void SetFields(AcroFields af)
 {
     foreach (DictionaryEntry entry in af.Fields)
     {
         String          fn   = (String)entry.Key;
         AcroFields.Item item = (AcroFields.Item)entry.Value;
         PdfDictionary   dic  = item.GetMerged(0);
         PdfObject       v    = PdfReader.GetPdfObjectRelease(dic.Get(PdfName.V));
         if (v == null)
         {
             continue;
         }
         PdfObject ft = PdfReader.GetPdfObjectRelease(dic.Get(PdfName.FT));
         if (ft == null || PdfName.SIG.Equals(ft))
         {
             continue;
         }
         SetField(fn, v);
     }
 }
Esempio n. 7
0
        // See http://stackoverflow.com/questions/4491156/get-the-export-value-of-a-checkbox-using-itextsharp/
        public static string GetExportValue(AcroFields.Item item)
        {
            var valueDict      = item.GetValue(0);
            var appearanceDict = valueDict.GetAsDict(PdfName.AP);

            if (appearanceDict != null)
            {
                var normalAppearances = appearanceDict.GetAsDict(PdfName.N);
                // /D is for the "down" appearances.

                // if there are normal appearances, one key will be "Off", and the other
                // will be the export value... there should only be two.
                if (normalAppearances != null)
                {
                    foreach (var curKey in normalAppearances.Keys)
                    {
                        if (!PdfName.OFF.Equals(curKey))
                        {
                            return(curKey.ToString().Substring(1));
                        }
                    }
                    // string will have a leading '/' character, so remove it!
                }
            }

            // if that doesn't work, there might be an /AS key, whose value is a name with
            // the export value, again with a leading '/', so remove it!
            var curVal = valueDict.GetAsName(PdfName.AS);

            if (curVal != null)
            {
                return(curVal.ToString().Substring(1));
            }
            else
            {
                return(string.Empty);
            }
        }
Esempio n. 8
0
 internal void CreateWidgets(ArrayList list, AcroFields.Item item)
 {
     for (int k = 0; k < item.Size; ++k)
     {
         list.Add(item.GetPage(k));
         PdfDictionary merged = item.GetMerged(k);
         PdfObject     dr     = merged.Get(PdfName.DR);
         if (dr != null)
         {
             PdfFormField.MergeResources(resources, (PdfDictionary)PdfReader.GetPdfObject(dr));
         }
         PdfDictionary widget = new PdfDictionary();
         foreach (PdfName key in merged.Keys)
         {
             if (widgetKeys.ContainsKey(key))
             {
                 widget.Put(key, merged.Get(key));
             }
         }
         widget.Put(iTextTag, new PdfNumber(item.GetTabOrder(k) + 1));
         list.Add(widget);
     }
 }
Esempio n. 9
0
        internal void MergeField(String name, AcroFields.Item item)
        {
            Hashtable       map = fieldTree;
            StringTokenizer tk  = new StringTokenizer(name, ".");

            if (!tk.HasMoreTokens())
            {
                return;
            }
            while (true)
            {
                String s   = tk.NextToken();
                Object obj = map[s];
                if (tk.HasMoreTokens())
                {
                    if (obj == null)
                    {
                        obj    = new Hashtable();
                        map[s] = obj;
                        map    = (Hashtable)obj;
                        continue;
                    }
                    else if (obj is Hashtable)
                    {
                        map = (Hashtable)obj;
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    if (obj is Hashtable)
                    {
                        return;
                    }
                    PdfDictionary merged = item.GetMerged(0);
                    if (obj == null)
                    {
                        PdfDictionary field = new PdfDictionary();
                        if (PdfName.SIG.Equals(merged.Get(PdfName.FT)))
                        {
                            hasSignature = true;
                        }
                        foreach (PdfName key in merged.Keys)
                        {
                            if (fieldKeys.ContainsKey(key))
                            {
                                field.Put(key, merged.Get(key));
                            }
                        }
                        ArrayList list = new ArrayList();
                        list.Add(field);
                        CreateWidgets(list, item);
                        map[s] = list;
                    }
                    else
                    {
                        ArrayList     list  = (ArrayList)obj;
                        PdfDictionary field = (PdfDictionary)list[0];
                        PdfName       type1 = (PdfName)field.Get(PdfName.FT);
                        PdfName       type2 = (PdfName)merged.Get(PdfName.FT);
                        if (type1 == null || !type1.Equals(type2))
                        {
                            return;
                        }
                        int       flag1 = 0;
                        PdfObject f1    = field.Get(PdfName.FF);
                        if (f1 != null && f1.IsNumber())
                        {
                            flag1 = ((PdfNumber)f1).IntValue;
                        }
                        int       flag2 = 0;
                        PdfObject f2    = merged.Get(PdfName.FF);
                        if (f2 != null && f2.IsNumber())
                        {
                            flag2 = ((PdfNumber)f2).IntValue;
                        }
                        if (type1.Equals(PdfName.BTN))
                        {
                            if (((flag1 ^ flag2) & PdfFormField.FF_PUSHBUTTON) != 0)
                            {
                                return;
                            }
                            if ((flag1 & PdfFormField.FF_PUSHBUTTON) == 0 && ((flag1 ^ flag2) & PdfFormField.FF_RADIO) != 0)
                            {
                                return;
                            }
                        }
                        else if (type1.Equals(PdfName.CH))
                        {
                            if (((flag1 ^ flag2) & PdfFormField.FF_COMBO) != 0)
                            {
                                return;
                            }
                        }
                        CreateWidgets(list, item);
                    }
                    return;
                }
            }
        }
Esempio n. 10
0
        /// <summary>
        /// Handles the Click event of the BtnGenerateReport control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void BtnGenerateReport_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(txtPDFFile.Text))
            {
                _formFields.Clear();

                try
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (FileStream fs = File.OpenRead(txtPDFFile.Text))
                        {
                            fs.CopyTo(ms);
                        }

                        PdfReader.unethicalreading = true;
                        PdfReader  pdfReader     = new PdfReader(ms.ToArray());
                        AcroFields pdfFormFields = pdfReader.AcroFields;

                        foreach (KeyValuePair <string, AcroFields.Item> kvp in pdfFormFields.Fields)
                        {
                            FormField formField = new FormField
                            {
                                FieldName  = pdfFormFields.GetTranslatedFieldName(kvp.Key),
                                FieldValue = pdfFormFields.GetField(kvp.Key),
                                FieldType  = GetFormFieldType(pdfFormFields.GetFieldType(kvp.Key))
                            };

                            AcroFields.Item field  = pdfFormFields.GetFieldItem(kvp.Key);
                            PdfDictionary   merged = field.GetMerged(0);
                            TextField       fld    = new TextField(null, null, null);
                            pdfFormFields.DecodeGenericDictionary(merged, fld);

                            formField.FontName = GetFontName(fld.Font);
                            string fontSize = (fld.FontSize == 0.0f) ? "Auto" : fld.FontSize.ToString();
                            formField.FontSize = fontSize;

                            List <AcroFields.FieldPosition> fieldPositions = pdfFormFields.GetFieldPositions(kvp.Key).ToList();
                            float pageHeight = pdfReader.GetPageSizeWithRotation(fieldPositions[0].page).Height;
                            formField.FieldPositionTop    = (pageHeight - fieldPositions[0].position.Top);
                            formField.FieldPositionBottom = (pageHeight - fieldPositions[0].position.Bottom);
                            formField.FieldPositionLeft   = fieldPositions[0].position.Left;
                            formField.FieldPositionRight  = fieldPositions[0].position.Right;
                            formField.FieldHeight         = fieldPositions[0].position.Height;
                            formField.FieldWidth          = fieldPositions[0].position.Width;
                            formField.PageNumber          = fieldPositions[0].page;

                            _formFields.Add(formField);
                        }

                        GenerateTreeViewDisplay();
                        pnlSaveOptions.Enabled = true;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("There was an issue with processing the request. Message: \n\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    pnlSaveOptions.Enabled = pnlSaveOptions.Enabled ? true : false;
                }
            }
        }
        private void FillFields(AcroFields acroFields)
        {
            var fields = new LinkedDictionary <string, AcroFields.Item>();

            typeof(AcroFields).GetField("fields", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(acroFields, fields);

            PdfDictionary top = (PdfDictionary)GetPdfObjectRelease(Catalog.Get(PdfName.ACROFORM));

            if (top == null)
            {
                return;
            }
            PdfArray arrfds = (PdfArray)GetPdfObjectRelease(top.Get(PdfName.FIELDS));

            if (arrfds == null || arrfds.Size == 0)
            {
                return;
            }
            for (int k = 1; k <= NumberOfPages; ++k)
            {
                PdfDictionary page   = GetPageNRelease(k);
                PdfArray      annots = (PdfArray)GetPdfObjectRelease(page.Get(PdfName.ANNOTS), page);
                if (annots == null)
                {
                    continue;
                }
                for (int j = 0; j < annots.Size; ++j)
                {
                    PdfDictionary annot = annots.GetAsDict(j);
                    if (annot == null)
                    {
                        ReleaseLastXrefPartial(annots.GetAsIndirectObject(j));
                        continue;
                    }
                    if (!PdfName.WIDGET.Equals(annot.GetAsName(PdfName.SUBTYPE)))
                    {
                        ReleaseLastXrefPartial(annots.GetAsIndirectObject(j));
                        continue;
                    }
                    PdfDictionary widget = annot;
                    PdfDictionary dic    = new PdfDictionary();
                    dic.Merge(annot);
                    string        name  = string.Empty;
                    PdfDictionary value = null;
                    PdfObject     lastV = null;
                    while (annot != null)
                    {
                        dic.Merge(annot);
                        PdfString t = annot.GetAsString(PdfName.T);
                        if (t != null)
                        {
                            name = t.ToUnicodeString() + "." + name;
                        }
                        if (lastV == null && annot.Get(PdfName.V) != null)
                        {
                            lastV = GetPdfObjectRelease(annot.Get(PdfName.V));
                        }
                        if (value == null && t != null)
                        {
                            value = annot;
                            if (annot.Get(PdfName.V) == null && lastV != null)
                            {
                                value.Put(PdfName.V, lastV);
                            }
                        }
                        annot = annot.GetAsDict(PdfName.PARENT);
                    }
                    if (name.Length > 0)
                    {
                        name = name.Substring(0, name.Length - 1);
                    }
                    AcroFields.Item item;
                    if (!fields.TryGetValue(name, out item))
                    {
                        item         = new AcroFields.Item();
                        fields[name] = item;
                    }
                    var addValueMethod = item.GetType().GetMethod("AddValue", BindingFlags.Instance | BindingFlags.NonPublic);
                    if (value == null)
                    {
                        addValueMethod.Invoke(item, new object[] { widget });
                    }
                    else
                    {
                        addValueMethod.Invoke(item, new object[] { value });
                    }
                    item.GetType().GetMethod("AddWidget", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { widget });
                    item.GetType().GetMethod("AddWidgetRef", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { annots.GetAsIndirectObject(j) });                     // must be a reference
                    if (top != null)
                    {
                        dic.MergeDifferent(top);
                    }
                    item.GetType().GetMethod("AddMerged", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { dic });
                    item.GetType().GetMethod("AddPage", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { k });
                    item.GetType().GetMethod("AddTabOrder", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { j });
                }
            }
            // some tools produce invisible signatures without an entry in the page annotation array
            // look for a single level annotation
            PdfNumber sigFlags = top.GetAsNumber(PdfName.SIGFLAGS);

            if (sigFlags == null || (sigFlags.IntValue & 1) != 1)
            {
                return;
            }
            for (int j = 0; j < arrfds.Size; ++j)
            {
                PdfDictionary annot = arrfds.GetAsDict(j);
                if (annot == null)
                {
                    ReleaseLastXrefPartial(arrfds.GetAsIndirectObject(j));
                    continue;
                }
                if (!PdfName.WIDGET.Equals(annot.GetAsName(PdfName.SUBTYPE)))
                {
                    ReleaseLastXrefPartial(arrfds.GetAsIndirectObject(j));
                    continue;
                }
                PdfArray kids = (PdfArray)GetPdfObjectRelease(annot.Get(PdfName.KIDS));
                if (kids != null)
                {
                    continue;
                }
                PdfDictionary dic = new PdfDictionary();
                dic.Merge(annot);
                PdfString t = annot.GetAsString(PdfName.T);
                if (t == null)
                {
                    continue;
                }
                string name = t.ToUnicodeString();
                if (fields.ContainsKey(name))
                {
                    continue;
                }
                var item = new AcroFields.Item();
                fields[name] = item;
                item.GetType().GetMethod("AddValue", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { dic });
                item.GetType().GetMethod("AddWidget", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { dic });
                item.GetType().GetMethod("AddWidgetRef", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { arrfds.GetAsIndirectObject(j) });                 // must be a reference
                item.GetType().GetMethod("AddMerged", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { dic });
                item.GetType().GetMethod("AddPage", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { -1 });
                item.GetType().GetMethod("AddTabOrder", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(item, new object[] { -1 });
            }
        }