我正在使用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,但是具有实际的键列表是解决这个问题的最佳方法。有什么想法吗?