Как мне установить ExportValue флажка с помощью iTextSharp? - PullRequest
1 голос
/ 19 июля 2011

Я использую VS 2008 Pro & iTextsharp (версия 5.1.1).

У меня есть набор из примерно 30 PDF.Мне удалось использовать iTextSharp, чтобы перебрать все из них и получить значения экспорта для флажков в различных формах.Некоторые имеют значение экспорта Вкл, в то время как другие имеют значение экспорта Да.Я пытаюсь найти способ программно установить значение экспорта флажков на «Вкл», чтобы они все были синхронизированы.Это все для другого приложения, которое экспортирует PDF-файлы, и иногда нужно будет пометить флажок как отмеченный.Это приложение на самом деле использует программное обеспечение CeTe Dynamic Pdf, и компания имеет некоторые права на форумах и говорит, что их программное обеспечение не может получить значение экспорта радиокнопки или chexkbox.В программном обеспечении CeTe вы отмечаете флажок как установленный, устанавливая значение флажков в значение экспорта.Это довольно большой улов;однако, если я могу использовать iTextSharp для нормализации значения экспорта для всех chexkboxes, я могу обойти эту проблему.

У кого-нибудь есть какие-нибудь мысли?

Кстати, вот код, который я использую дляполучить 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 Вот еще одна странность ... Я просматриваю использование кода в этомquestion: Получите ExportValue, используя iTextSharp , и попытались использовать его в надежде найти ответ на этот вопрос.Код, используемый в этом вопросе, имеет несколько объявленных типов PdfDictionary.Это также в Java, но это не имеет большого значения.Проблема в том, что в классе PdfDictionary отсутствует свойство Keys для кода, который я использую.Я проверил класс PdfDictionary в исходном проекте на наличие itextsharp-src-core-5.1.1, и в этом классе явно есть открытое свойство Keys.Intellisense и компилятор, кажется, этого не видят, и я понятия не имею, почему.

Очевидно, что цель в том, чтобы я пытался перебрать словарь и получить значения для различных ключей, но я немного озадачен тем, как это сделать, не имея доступа к ключам всловарь используется.Конечно, я проверил pdf ссылку на связанный вопрос и нашел его довольно информативным.Скорее всего, имена ключей будут выглядеть примерно так: PdfName.D, PdfName.Yes, PdfName.N, но фактический список ключей - лучший способ выяснить это.Есть мысли?

...