我有很多麻烦,试图设置一个 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图像 pdfButtonFormField.SetImage(imagePath)。 问题是,我需要在使用完这个文件(imagePath)后将其删除,而且即使我调用了 pdfButtonFormField.Flush() 并 pdfButtonFormField.Release().
所以你可能会说,"为什么不直接打开一个文件流,用完后再调用fileStream.Dispose?"。因为文件本身不在我手里,它是由itext api管理的。
所以,我想知道是否有什么方法可以做到这一点。
看着iText 7源码。PdfButtonFormField.SetImage 执行以下操作。
你可以自己做前三步,然后打电话给我。设置值 在...上 PdfButtonFormField.
假设你已经写了自己的方法 读取文件到数组 读取图像文件并将其作为一个字节数组返回,这应该是可行的。
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的源代码链接。PdfButtonFormField.cs.