带有 Windows 10 通用应用程序的 iTextSharp
iTextSharp with a Windows 10 Universal App
有没有办法让 iTextSharp 与 Windows 10 通用应用程序一起使用?当我尝试通过 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 Store 应用程序中使用 iTextSharp 获取 PDF 模板,然后使用用户提供的数据填充字段。用户还提供模板,以便文档按照他们想要的方式进行格式化。为此,我们使用 iTextSharp 库中的 PDFStamper class 来执行此操作,如以下代码所示:
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 的策略——据我所知,在密码学方面它们是相互排斥的。如果您 Google 术语 "is not compatible with UAP"
,那么您可以阅读很多 well-known 库的类似问题,因此这不仅是 iTextSharp 的问题。
编辑
如果您确实需要快速的解决方案,那么您可以下载 iTextSharp 的源代码并将其 copy-paste 放入 Visual Studio 中的新 UWP Class 库项目中。编译错误的数量看起来令人生畏,但其中大约 80% 对我来说似乎微不足道。例如其中一半是对 Exception 类 的继承构造函数中的 Serializable 和 SerializationInfo 的引用,它们不再存在,因此可以(!)安全地删除它们。
另一种方法是等待 iTextSharp 的新版本,目前(2016 年 1 月 6 日)没有预定的发布日期。此外,需要说明的是,尚未决定是否以及如何在 iTextSharp 的下一个版本或任何后续版本中支持 UWP。
编辑 2
我最近写了一篇关于这个问题的博客 post,作为 iText 团队的官方声明。 http://itextpdf.com/blog/itextsharp-and-uwp
有没有办法让 iTextSharp 与 Windows 10 通用应用程序一起使用?当我尝试通过 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 Store 应用程序中使用 iTextSharp 获取 PDF 模板,然后使用用户提供的数据填充字段。用户还提供模板,以便文档按照他们想要的方式进行格式化。为此,我们使用 iTextSharp 库中的 PDFStamper class 来执行此操作,如以下代码所示:
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 的策略——据我所知,在密码学方面它们是相互排斥的。如果您 Google 术语 "is not compatible with UAP"
,那么您可以阅读很多 well-known 库的类似问题,因此这不仅是 iTextSharp 的问题。
编辑
如果您确实需要快速的解决方案,那么您可以下载 iTextSharp 的源代码并将其 copy-paste 放入 Visual Studio 中的新 UWP Class 库项目中。编译错误的数量看起来令人生畏,但其中大约 80% 对我来说似乎微不足道。例如其中一半是对 Exception 类 的继承构造函数中的 Serializable 和 SerializationInfo 的引用,它们不再存在,因此可以(!)安全地删除它们。
另一种方法是等待 iTextSharp 的新版本,目前(2016 年 1 月 6 日)没有预定的发布日期。此外,需要说明的是,尚未决定是否以及如何在 iTextSharp 的下一个版本或任何后续版本中支持 UWP。
编辑 2
我最近写了一篇关于这个问题的博客 post,作为 iText 团队的官方声明。 http://itextpdf.com/blog/itextsharp-and-uwp