c# – 使用Windows 10 Universal App的iTextSharp

有没有办法让iTextSharp与Windows 10 Universal应用程序一起使用?当我尝试通过NuGet包管理器添加iTextSharp版本5.5.8时,我收到以下错误:iTextSharp 5.5.8 is not compatible with UAP, Version=v10.0(win10-XXX)S...

有没有办法让iTextSharp与Windows 10 Universal应用程序一起使用?当我尝试通过NuGet包管理器添加iTextSharp版本5.5.8时,我收到以下错误:

iTextSharp 5.5.8 is not compatible with UAP, Version=v10.0(win10-XXX)
Some packages are not compatible ith UAP,Version=v10.0(win10-XXX)

其中XXX是x64或x86等平台.
我们在Windows 8商店应用程序中使用iTextSharp来获取PDF模板,然后使用用户提供的数据填充字段.用户还提供模板,以便按照他们想要的方式格式化文档.为此,我们使用iTextSharp库中的PDFStamper类来执行此操作,如以下代码所示:

    public async Task<byte[]> fillPDF(string templatePath, FormData mergeDataItems)
        {


            StorageFile file = await StorageFile.GetFileFromPathAsync(templatePath);
            var buf = await FileIO.ReadBufferAsync(file);


            var reader = new PdfReader(buf.ToArray());
            var outStream = new MemoryStream();
            var stamper = new PdfStamper(reader, outStream);

            var form = stamper.AcroFields;
            form.GenerateAppearances = true; //Added this line, fixed my problem
            var fieldKeys = form.Fields.Keys;

            foreach (KeyValuePair<String, String> pair in mergeDataItems.MergeFieldValues)
            {
                if (fieldKeys.Any(f => f == pair.Key))
                {
                    form.SetField(pair.Key, pair.Value);
                }
            }
            stamper.Close();
            reader.Close();

            return flattenPdf(outStream.ToArray());
        }

和这里

    private static byte[] flattenPdf(byte[] pdf)
        {
            var reader = new PdfReader(pdf);

            var outStream = new MemoryStream();
            var stamper = new PdfStamper(reader, outStream);

            stamper.FormFlattening = true;

            stamper.Close();
            reader.Close();

            return outStream.ToArray();
        }

任何有关使iTextSharp与Windows 10应用程序一起使用的帮助或任何关于如何从没有iTextSharp的模板生成PDF文档的建议将非常感激.
谢谢,

解决方法:

UWP框架是.NET生态系统的一个明显重大更新,特别是在安全性和加密方面.例如,在UWP中,散列算法类位于命名空间Windows.Security.Cryptography.Core中,而直到.NET 4.x它们位于System.Security.Cryptography中.某些类也已重命名.

对于iTextSharp,以及它的安全依赖性BouncyCastle,这是一个重大变化,因为System.Security.Cryptography程序集用于数字签名. NuGet或UWP本身显然知道所使用的.NET程序集,并拒绝添加无法在UWP中编译的依赖项 – 无论您是否使用与数字签名相关的任何iTextSharp功能.

仅供参考我是iText的员工,几周前我们就发现了这个问题.调查仍在进行中,因此我可能无法在此解释中做到一切正确.我们还在制定支持UWP和.NET 4.x的策略 – 据我所知,这在加密方面是互斥的.如果谷歌的术语“与UAP不兼容”,那么你可以阅读许多知名库的类似问题,因此这不仅是iTextSharp的问题.

编辑

如果您确实需要快速解决方案,那么您可以下载iTextSharp的源代码并将其复制粘贴到Visual Studio中的新UWP类库项目中.编译错误的数量看起来令人生畏,但其中大约80%对我来说似乎微不足道.例如其中一半是对Exception类的继承构造函数中的Serializable和SerializationInfo的引用,它们不再存在,因此可以安全地删除它们(!).

另一种方法是等待iTextSharp的新版本,目前(2016年1月6日)没有预定的发布日期.此外,为了清楚起见,还没有决定是否以及如何通过下一版本或iTextSharp中的任何后续版本支持UWP.

编辑2

我最近写了一篇关于这个问题的博客文章,作为iText团队的官方声明. http://itextpdf.com/blog/itextsharp-and-uwp

本文标题为:c# – 使用Windows 10 Universal App的iTextSharp

基础教程推荐