我如何在iTextSharp 7中设置PdfFormField图像并在使用后释放文件?

问题描述 投票:0回答:1

我有很多麻烦,试图设置一个 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管理的。

所以,我想知道是否有什么方法可以做到这一点。

c# itext
1个回答
1
投票

看着iText 7源码。PdfButtonFormField.SetImage 执行以下操作。

  1. 打开一个 文件流 使用图像路径(它不会释放)。
  2. 调用一个内部实用方法来读取 文件流 变成一个字节数组。
  3. 调用 转换.ToBase64String 将字节数组转换为字符串。
  4. 将得到的字符串传递给 PdfButtonFormField.SetValue(设置值).

你可以自己做前三步,然后打电话给我。设置值 在...上 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.

© www.soinside.com 2019 - 2024. All rights reserved.