使用 iText7 将 SVG 图像添加到 PdfSignatureAppearance

问题描述

我想将 SVG 图像添加到 PdfSignatureAppearance。方法 setSignatureGraphic 现在在 iText7 中有一个 ImageData 参数。我找不到从 SVG 创建 imageData 的方法,因为 ImageDataFactory 不支持这种格式。

你能指导我怎么做吗?

请注意,使用 iText5,我可以在将其转换为 PDF 并将其导入 PDFTemplate 后添加 svg,然后在实例化 PDFTemplate 后创建图像。 setSignatureGraphic 接受 com.itextpdf.text.Image 作为参数

解决方法

您的问题可以分为两个更精确和简单的问题:

  1. 如何使用 iText 处理 SVG?
  2. 如何根据第 1 点的结果创建 ImageData 实例?

至于问题 1:可以使用 SvgConverter 类(iTextCore 的 svg 模块的一部分)。不幸的是,那里只有与 PDF 相关的方法:SVG 可以转换为 Imagelayout 模块的类),或 PdfFormXObject(再次与 PDF 相关)或 PDF文件。

// to PDF
SvgConverter.convertToImage(new FileInputStream(sourceFolder + "your_svg.svg"),signer.getDocument()); // the mentioned `signer` is the instance of PdfSigner which you use to sign the document

// to Image
SvgConverter.convertToImage(new FileInputStream(sourceFolder + "your_svg.svg"),new File(destinationFolder + "svgAsPdf.pdf"));

对于问题 2,有几个答案:

a) 假设您想将此 Image 用作 PdfSignatureAppearance 的图形数据。目前该类不提供方便的设置器,但是,您可以使用一些低级方法 - getLayer0getLayer2 来获取签名的背景或前景。它们由 PDfFormXObject 表示,因此您可以使用 Canvas 向它们添加您的图像:

    Image svg = SvgConverter.convertToImage(new FileInputStream(sourceFolder + "your_svg.svg"),signer.getDocument());
    Canvas canvas = new Canvas(appearance.getLayer0(),signer.getDocument());
    canvas.add(svg);
    canvas.close();

b) 假设您的目标是将渲染的位图用作 PdfSignatureAppearance 的图形数据。然后是特定的 iText 产品 - pdfRender - 它将 PDF 文件转换为图像。可以应用以下代码:

PdfToImageRenderer.renderPdf(new File(destinationFolder + "svgAsPdf.pdf"),new File(folderForTheResultantImage));

现在您可以从生成的图像文件中创建一个 ImageData 实例(默认情况下,PDF 被转换为一系列格式为“pdfnamePAGE_NUMBER.jpg”的图像,但可以自定义名称或输出图像格式)。在您的情况下,PDF 仅包含一页(代表转换后的 SVG),其名称为“image1.jpg”。剩下的就很明显了:

appearance.setSignatureGraphic(ImageDataFactory.create(destinationFolder + "image1.jpg"));