如何在 iTextSharp 7 中设置 PdfFormField 图像并在使用后释放文件?
How can I set PdfFormField image in iTextSharp 7 and release the file after using it?
我在尝试设置 PdfFormField 图像并释放 itext 进程使用的文件时遇到了很多麻烦。这是我现在正在做的事情(设置图像本身工作得很好,但进程仍在使用该文件...):
public void SetImageField(string idFormField, string imagePath)
{
PdfButtonFormField pdfButtonFormField = (PdfButtonFormField)_pdfAcroForm
.GetField(idFormField);
if (pdfButtonFormField == null)
throw new InstanceNotFoundException("Não foi encontrado o campo de assinatura no pdf!");
pdfButtonFormField
.SetImage(imagePath);
pdfButtonFormField
.SetBorderWidth(0);
pdfButtonFormField.Flush();
pdfButtonFormField.Release();
}
如您所见,我正在通过 pdfButtonFormField.SetImage(imagePath) 设置 pdfButtonFormField 图像。 问题是,我需要删除这个文件 (imagePath)使用它之后,似乎 itext 进程仍在使用资源,即使我调用 pdfButtonFormField.Flush() 和 pdfButtonFormField.Release() 。
所以你可以说,"why don't you just open a filestream, and call fileStream.Dispose after using?"。因为文件本身不在我手上,由itext管理api.
所以拜托,我想知道是否有任何方法可以做到这一点。
查看 iText 7 源代码,PdfButtonFormField.SetImage 执行以下操作:
- 使用图像路径(它不会释放)打开 FileStream。
- 调用内部实用程序方法将 FileStream 读入字节数组。
- 调用Convert.ToBase64String将字节数组转换为字符串。
- 将结果字符串传递给 PdfButtonFormField.SetValue.
您可以自己完成前三个步骤,然后在 PdfButtonFormField.
上调用 SetValue
假设您已经编写了自己的方法 ReadFileToArray 来读取图像文件并且 return 它作为一个字节数组,这应该可以工作:
public void SetImage(PdfAcroForm pdfAcroForm, string idFormField, string imagePath)
{
var pdfButtonFormField = (PdfButtonFormField) pdfAcroForm.GetField(idFormField);
if (pdfButtonFormField == null)
throw new InstanceNotFoundException();
var imageBytes = ReadFileToArray(imagePath);
var imageStr = Convert.ToBase64String(imageBytes);
pdfButtonFormField.SetValue(imageStr);
pdfButtonFormField.SetBorderWidth(0);
}
这是 PdfButtonFormField 的源代码 link:
PdfButtonFormField.cs
我在尝试设置 PdfFormField 图像并释放 itext 进程使用的文件时遇到了很多麻烦。这是我现在正在做的事情(设置图像本身工作得很好,但进程仍在使用该文件...):
public void SetImageField(string idFormField, string imagePath)
{
PdfButtonFormField pdfButtonFormField = (PdfButtonFormField)_pdfAcroForm
.GetField(idFormField);
if (pdfButtonFormField == null)
throw new InstanceNotFoundException("Não foi encontrado o campo de assinatura no pdf!");
pdfButtonFormField
.SetImage(imagePath);
pdfButtonFormField
.SetBorderWidth(0);
pdfButtonFormField.Flush();
pdfButtonFormField.Release();
}
如您所见,我正在通过 pdfButtonFormField.SetImage(imagePath) 设置 pdfButtonFormField 图像。 问题是,我需要删除这个文件 (imagePath)使用它之后,似乎 itext 进程仍在使用资源,即使我调用 pdfButtonFormField.Flush() 和 pdfButtonFormField.Release() 。
所以你可以说,"why don't you just open a filestream, and call fileStream.Dispose after using?"。因为文件本身不在我手上,由itext管理api.
所以拜托,我想知道是否有任何方法可以做到这一点。
查看 iText 7 源代码,PdfButtonFormField.SetImage 执行以下操作:
- 使用图像路径(它不会释放)打开 FileStream。
- 调用内部实用程序方法将 FileStream 读入字节数组。
- 调用Convert.ToBase64String将字节数组转换为字符串。
- 将结果字符串传递给 PdfButtonFormField.SetValue.
您可以自己完成前三个步骤,然后在 PdfButtonFormField.
上调用 SetValue假设您已经编写了自己的方法 ReadFileToArray 来读取图像文件并且 return 它作为一个字节数组,这应该可以工作:
public void SetImage(PdfAcroForm pdfAcroForm, string idFormField, string imagePath)
{
var pdfButtonFormField = (PdfButtonFormField) pdfAcroForm.GetField(idFormField);
if (pdfButtonFormField == null)
throw new InstanceNotFoundException();
var imageBytes = ReadFileToArray(imagePath);
var imageStr = Convert.ToBase64String(imageBytes);
pdfButtonFormField.SetValue(imageStr);
pdfButtonFormField.SetBorderWidth(0);
}
这是 PdfButtonFormField 的源代码 link: PdfButtonFormField.cs