如何在 iText Java 中直接将 AI (Adobe Illustrator) / SVG / PDF 文件嵌入 PDF 以避免渲染故障?

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

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 显示: output 这与原始 SVG 文件的颜色有很大不同! 就我而言,解决这个问题的一个好方法是避免使用 SVG 文件。众所周知,Adobe Illustrator 文件与 PDF 文件非常相似。您可以使用PDF查看器直接打开AI文件。那么为什么不直接将AI文件嵌入到PDF文件中(作为一部分)呢?我知道许多文档生成器(例如 Latex 编译器

pdflatex
xelatex
)支持将 PDF 作为图形包含到 PDF 中,但是我如何使用 iText 执行相同的操作?我可以将 AI 文件合并到 iText 中的 PDF 文件中,但这种方法会在 PDF 中引入一个新页面,我只希望矢量图成为 PDF 页面中的一部分(如图像)。我怎样才能做到这一点? 如果上面的思路不是一个好方法,或者你知道如何解决SVG渲染bug,请告诉我。谢谢!

java pdf svg itext7 adobe-illustrator
1个回答
0
投票

为了解释 SVG 和 PDF 有何不同,让我们在浏览器中打印解压缩的 SVG 并解压缩以查看矢量的相似之处。 您可以通过在任何文本阅读器中阅读来进行比较的 SVG 位于左侧,并且对于每个笔画我都添加了换行符。然而,PDF 格式被优化为 zip 流,因此需要解压缩,然后自动添加换行符。

您可以立即看到的东西是:

  1. SVG 在行首声明类似 move 或 curve 的操作,而 PDF 则类似“堆栈”,在值之后声明操作。
  2. SVG 是相对偏移,而 PDF 是绝对偏移。
  3. 在这种情况下,起始值在数学上仅相差 0.00001,但根据舍入情况,情况并非总是如此
  4. 虽然在这种情况下四舍五入为“浮点数”非常相似(.#####),但 PDF 需要更多的小数位作为绝对值。
  5. 整体无压缩。 SVG 对于超文本传输协议来说更加紧凑,并且解压后渲染速度可能更快。

文件大小: 未压缩的 SVG=18.8 KB PDF 内部流 =6 0 obj <> 开销 24.0 KB

enter image description here

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