SVG 文件在 iText Java 中无法正确呈现。我应该找到一种更好的方法将矢量图插入到我的 pdf 文件中。
我想以编程方式生成带有一些矢量图和文本的 PDF 文件。 iText是Java社区中处理PDF文件最好的库之一。所以我用 iText 编写了一个程序来满足我的需求。我的矢量图最初是由 Adobe Illustrator 创建的,iText 不直接支持它。阅读 iText 示例后,我发现 iText 支持 SVG 文件,因此我将矢量图转换为 SVG。但是,iText 仍然无法正确渲染这些 SVG。缺少一些颜色。这是一个非常简单的演示来重现该问题: 首先,添加Maven依赖(我使用的是最新版本9.0.0):
<dependencies>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-core</artifactId>
<version>9.0.0</version>
<type>pom</type>
</dependency>
</dependencies>
二、编写一个简单的Java类:
package net.opho.demo;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.HorizontalAlignment;
import com.itextpdf.svg.converter.SvgConverter;
import java.io.FileInputStream;
public class main {
public static void main(String[] args) throws Exception {
String svgPath = "C:\\develop\\OPhOLogo.svg";
String outputPdfPathDemo = "C:\\develop\\demo.pdf";
try (FileInputStream svg = new FileInputStream(svgPath)) {
PdfDocument pdf = new PdfDocument(new PdfWriter(outputPdfPathDemo));
Image logo = SvgConverter.convertToImage(svg, pdf).setWidth(200).setHorizontalAlignment(HorizontalAlignment.CENTER);
Paragraph text = (new Paragraph("Some texts...")).setFontSize(20);
Document documentDemo = new Document(pdf);
documentDemo.add(logo);
documentDemo.add(text);
documentDemo.close();
}
}
}
在此示例中,我使用的 SVG 文件可以从此处预览或下载。 生成的 PDF 显示: 这与原始 SVG 文件的颜色有很大不同! 就我而言,解决这个问题的一个好方法是避免使用 SVG 文件。众所周知,Adobe Illustrator 文件与 PDF 文件非常相似。您可以使用PDF查看器直接打开AI文件。那么为什么不直接将AI文件嵌入到PDF文件中(作为一部分)呢?我知道许多文档生成器(例如 Latex 编译器
pdflatex
和 xelatex
)支持将 PDF 作为图形包含到 PDF 中,但是我如何使用 iText 执行相同的操作?我可以将 AI 文件合并到 iText 中的 PDF 文件中,但这种方法会在 PDF 中引入一个新页面,我只希望矢量图成为 PDF 页面中的一部分(如图像)。我怎样才能做到这一点?
如果上面的思路不是一个好方法,或者你知道如何解决SVG渲染bug,请告诉我。谢谢!
为了解释 SVG 和 PDF 有何不同,让我们在浏览器中打印解压缩的 SVG 并解压缩以查看矢量的相似之处。 您可以通过在任何文本阅读器中阅读来进行比较的 SVG 位于左侧,并且对于每个笔画我都添加了换行符。然而,PDF 格式被优化为 zip 流,因此需要解压缩,然后自动添加换行符。
您可以立即看到的东西是:
文件大小: 未压缩的 SVG=18.8 KB PDF 内部流 =6 0 obj <> 开销 24.0 KB