有没有办法让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