Я использую 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, но фактический список ключей - лучший способ выяснить это.Есть мысли?