簡體   English   中英

用iTextSharp填充PDF后,表單無法保存/使用權被刪除

[英]After filling PDF with iTextSharp, form is not savable/ usage rights removed

我目前正在研究一個過程,該過程將使用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();
        }
    }
}

再次感謝您提供的任何建議或幫助。

答案在您自己的源代碼中被注釋掉了。

你需要:

var stamper = new PdfStamper(reader, new FileStream(...), '\0', true);

代替:

var stamper = new PdfStamper(reader, new FileStream(...));

您的問題是如何使用iTextSharp正確填寫XFA表單數據以允許在Acrobat XI中編輯和保存結果的重復,您可以在此處找到更詳細的答案。

另外:您抱怨使用權被刪除,但是如果這樣,為什么我會在您的代碼中看到這一行:

reader.RemoveUsageRights();

該行刪除了使用權利,因此在使用Adobe Reader時無法再在本地保存表單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM