如何使用iTextSharp设置复选框的ExportValue?

时间:2011-07-19 15:25:19

标签: c# pdf pdf-generation itextsharp

我正在使用VS 2008 Pro& iTextsharp(版本5.1.1)。

我有一套约30个pdf的。我已设法使用iTextSharp迭代所有这些并获取各种表单上的复选框的导出值。有些导出值为On,而其他导出值为Yes。我正在尝试找到一种方法,以编程方式将复选框的导出值设置为“打开”,以便它们全部同步。这是为了另一个导出pdf的应用程序,有时需要将复选框标记为已选中。该应用程序实际上是使用CeTe的Dynamic Pdf软件,该公司在论坛上有一些权利,并表示他们的软件无法获得单选按钮或chexkbox的导出值。使用CeTe的软件,通过将复选框值设置为导出值,将复选框标记为已选中。这是一个相当大的问题;但是,如果我可以使用iTextSharp规范所有chexkbox的出口值,我可以支持这个问题。

有人有任何想法吗?

顺便说一下,这是我用来获取ExportValue的代码。它可能不是很好,但它的功能和打算作为一个一次性的程序。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using iTextSharp.text.pdf;

    namespace iTextSharpTesting1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("App Path: " + LogUtil.logFile);

                DirectoryInfo formsFolder = new DirectoryInfo(@"C:\Development\Forms");
                string path = string.Empty;
                int onCount = 0;
                int yesCount = 0;
                StringBuilder lines = new StringBuilder(); 

                if( formsFolder != null && formsFolder.Exists )
                    foreach (FileInfo fi in formsFolder.GetFiles("*.pdf"))
                    {
                        lines.AppendLine(" File Name: " + fi.Name );

                        PdfReader reader = new PdfReader(fi.FullName);
                        int counter = 0;
                        using (FileStream fs = new FileStream("Test Out.pdf", FileMode.Create))
                        {
                            PdfStamper stamper = new PdfStamper(reader, fs);
                            AcroFields fields = stamper.AcroFields;

                            foreach (string key in fields.Fields.Keys)
                            {
                                //iTextSharp.text.pdf.AcroFields.Item i = fields.Fields[key];
                                //bool x = fields.SetFieldProperty("CheckBox1", "exportvalue", "On", null);                            
                                string[] states = fields.GetAppearanceStates(key);
                                if (states.Count() > 0)
                                {
                                    lines.Append(" Field: " + key + "\t" + " State Values: ");
                                    foreach (string s in states)
                                    {
                                        if("on".Equals(s.ToLower() ))
                                            onCount +=1;
                                        else if( "yes".Equals(s.ToLower() ))
                                            yesCount += 1;

                                        lines.Append(s + ",");
                                    }
                                    lines.Append("\n");
                                }

                            }
                            //fields.RenameField("oldFieldName", "newFieldName");
                            stamper.Close();
                            LogUtil.Write("Static Void Main", lines.ToString());
                            lines = null;
                            lines = new StringBuilder();
                        }
                    }

                //Added after I noted all ExportValues for the checkboxes seem to be either Yes or On.
                LogUtil.Write("Static Void Main" , "Yes Count: " + yesCount.ToString() + " On Count: " + onCount.ToString());
            } // end static void main
        } // end class

        public class LogUtil
        {
            public static string logFile = @"C:\Development\iTextSharpTest1\iTextSharpTest1\Log\iTextSharpTestingLog.txt";

            public LogUtil()
            {

            }

            public static void WriteBreak()
            {            
                using (StreamWriter writer = File.AppendText(logFile))
                {
                    writer.WriteLine("\n*****************************************************************************\n");
                }
            }

            public static void Write(String methodCall, String msg)
            {
                using (StreamWriter writer = File.AppendText(logFile))
                {
                    writer.WriteLine("\n" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + "\n\t Method: " + methodCall + "\n\t Message:  " + msg);
                }
            }

            public static void WriteException(String methodCall, Exception e)
            {
                string message = string.Empty;

                if (e == null) return;

                try
                {
                    message = e.Message;
                    int ctr = 1;
                    while (e != null && e.InnerException != null)
                    {
                        e = e.InnerException;
                        message += " Inner Error #" + ctr.ToString() + ": " + e.Message;
                        ctr += 1;
                    }

                    using (StreamWriter writer = File.AppendText(logFile))
                    {
                        writer.WriteLine("\n************************   BEGIN EXCEPTION LOGGED!!!!     ***********************\n");
                        if (!string.IsNullOrEmpty(methodCall))
                        {
                            writer.WriteLine("\n" + DateTime.Now.ToShortDateString() + " " +
                                DateTime.Now.ToLongTimeString() + "\n\t Method: " + methodCall +
                                "\n\t Message:  " + message +
                                "\n\t stack trace: " + e.StackTrace);
                        }
                        else
                        {
                            writer.WriteLine("\n" + DateTime.Now.ToShortDateString() + " " +
                                DateTime.Now.ToLongTimeString() +
                                "\n\t Message:  " + message +
                                "\n\t stack trace: " + e.StackTrace);
                        }
                        writer.WriteLine("\n************************   END EXCEPTION LOGGED!!!!     ***********************\n");
                    }
                }
                catch (Exception ex)
                {
                    try
                    {
                        LogUtil.Write("", "An attempt to write an exception to the log has failed.");
                    }
                    catch (Exception snuffIt)
                    {
                        //snuffing this exception
                    }
                }

            }

            public static void WriteException(Exception e)
            {
                LogUtil.WriteException(null, e);
            }

        }

    } //end namespace

编辑2 这是另一个奇怪的...我正在查看这个问题中的代码用法: Get ExportValue using iTextSharp并尝试使用它以期找出这个问题的答案。该问题中使用的代码声明了几个PdfDictionary类型。它也适用于java,但这不是什么大问题。问题是PdfDictionary类没有关于我正在使用的代码的Keys属性。我已经在源项目中检查了itextsharp-src-core-5.1.1中的PdfDictionary类,并且这个类中有一个名为Keys的公共属性。智能感知&编译器似乎没有看到它,我不知道为什么。

显然,这里的目标是我试图迭代字典并获取各种键的值,但是如果没有访问所使用的字典中的键,我有点难以理解。当然,我已经检查了pdf参考链接的问题并发现它相当翔实。更有可能的是,键名称将是PdfName.D,PdfName.Yes,PdfName.N,但是具有实际的键列表是解决这个问题的最佳方法。有什么想法吗?

0 个答案:

没有答案