我目前正在开发一个使用iTextSharp来部分填充PDF表单的流程。然后将该表格通过电子邮件发送给用户,用户将完成表格。然后通过电子邮件将表单提交回我们的电子邮件帐户,然后进行处理。
我的问题是,一旦将PDF发送给用户,当用户打开表单并且无法保存数据时。用作模板的原始PDF可以填写保存。不知何故,在使用iTextSharp的过程中,表单正在失去其使用权。有没有办法在使用iTextSharp时保留使用权?
我希望这里有人可以指出出了什么问题,或者指出我正确的方向。感谢您的时间和帮助。
以下是代码:
using Dapper;
using iTextSharp.text.pdf;
using NLog;
using PilotDispatch.Domain.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data.OleDb;
using System.IO;
using System.Linq;
namespace eTicketPdfFactory
{
class Program
{
const string TemplateItextPdfPath = @"C:\PDF\Factory\eTicketFormPortrait.pdf";
const string OutputItextPdfPath = @"C:\PDF\Factory\eTicketFormPortraitOut.pdf";
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
var logid = string.Empty;
if (args.Length > 0)
{
logid = args[0];
}
else
{
Logger.Error("No LogId supplied");
return;
}
var rundownQuery =
string.Format(
"SELECT * FROM Rundown_Table LEFT JOIN Vessels ON Vessels.CallSign = Rundown_Table.Call_Sign WHERE Rundown_Table.Log_ID = '{0}'",
logid);
ETicketPdf ticket;
IEnumerable<PilotTransportation> pilotTransportations = null;
using (var cn = new OleDbConnection(ConfigurationManager.ConnectionStrings["PervasiveConnection"].ConnectionString))
{
cn.Open();
// ticket = cn.Query<ETicketPdf>(PervasiveQueryString, new { Log_ID = logid }).FirstOrDefault(); // not working with Pervasive
ticket = cn.Query<ETicketPdf>(rundownQuery).FirstOrDefault();
if (ticket != null)
{
var transportationQuery =
string.Format(
"SELECT * FROM PilotTransportation WHERE PilotCode = '{0}'",
ticket.Pilot_Code);
pilotTransportations = cn.Query<PilotTransportation>(transportationQuery);
}
cn.Close();
}
if (ticket == null)
{
Logger.Error("No records found for given LogId");
return;
}
var pilotOptions = pilotTransportations.Select(opt => string.Format("{0} - {1}", opt.VendorID, opt.Name)).ToArray();
var reader = new PdfReader(TemplateItextPdfPath);
var stamper = new PdfStamper(reader, new FileStream(OutputItextPdfPath, FileMode.Open));
//var stamper = new PdfStamper(reader, new FileStream(OutputItextPdfPath, FileMode.CreateNew, FileAccess.Write), '\0', true);
var formFields = stamper.AcroFields;
formFields.SetListOption("Form[0].Page1[0].VendorIdFrom1[0]", null, pilotOptions);
formFields.SetListOption("Form[0].Page1[0].VendorIdTo1[0]", null, pilotOptions);
formFields.SetListOption("Form[0].Page1[0].VendorIdFrom2[0]", null, pilotOptions);
formFields.SetListOption("Form[0].Page1[0].VendorIdTo2[0]", null, pilotOptions);
var properties = ticket.GetType().GetProperties();
foreach (var prop in properties)
{
var name = prop.Name;
var propval = prop.GetValue(ticket, null);
if (propval != null)
{
if (name == "Order_Date")
{
if(Convert.ToDateTime(propval).Year < 1902)continue;
}
formFields.SetField(name, propval.ToString());
}
}
reader.RemoveUsageRights();
stamper.Close();
reader.Close();
File.Copy(OutputItextPdfPath, Path.GetDirectoryName(OutputItextPdfPath) + "/" + logid + ".pdf");
Console.WriteLine("finished");
Console.ReadLine();
}
}
}
再次感谢您提供给我的任何指示或帮助。
答案 0 :(得分:1)
答案已在您自己的源代码中注释掉。
你需要:
var stamper = new PdfStamper(reader, new FileStream(...), '\0', true);
而不是:
var stamper = new PdfStamper(reader, new FileStream(...));
您的问题与How to correctly fill in XFA form data using iTextSharp to allow editing and saving result in Acrobat XI重复 你可以找到更精细的答案here。
另外:您抱怨删除了使用权,但如果是这样,为什么我会在您的代码中看到这一行:
reader.RemoveUsageRights();
该行删除了使用权限,因此在使用Adobe Reader时无法再在本地保存表单。