当前位置: 首页 > 知识库问答 >
问题:

使用Apache FOP的SVG到PDF

丁长卿
2023-03-14

我有3个SVG文件,我想转换成一个PDF。我正试图用Apache FOP实现这一点,但迄今为止我没有成功。

我的想法是简单地将所有3个SVG文件一个接一个地写入生成的PDF中,但是这不起作用。我的代码是这样的:

public void convertSVG2PDF(File svg, File svg2, File svg3, File pdf) throws IOException,
        TranscoderException {

    // Create transcoder
    Transcoder transcoder = new PDFTranscoder();
    // Transcoder transcoder = new org.apache.fop.render.ps.PSTranscoder();

    // Setup input
    InputStream in = new java.io.FileInputStream(svg);
    InputStream in2 = new java.io.FileInputStream(svg2);
    InputStream in3 = new java.io.FileInputStream(svg3);

    try {
        TranscoderInput input = new TranscoderInput(in);
        TranscoderInput input2 = new TranscoderInput(in2);
        TranscoderInput input3 = new TranscoderInput(in3);

        // Setup output
        OutputStream out = new java.io.FileOutputStream(pdf);
        out = new java.io.BufferedOutputStream(out);
        try {
            TranscoderOutput output = new TranscoderOutput(out);
            TranscoderOutput output2 = new TranscoderOutput(out);
            TranscoderOutput output3 = new TranscoderOutput(out);

            // Do the transformation
            transcoder.transcode(input, output);
            transcoder.transcode(input2, output2);
            transcoder.transcode(input3, output3);
        } finally {
            out.close();
        }
    } finally {
        in.close();
    }
}

最后,我的SVG图像如下所示,它们是由javascript应用程序生成的。

< svg height="70" id="topBar" version="1.1" width="1060" xmlns="http://www.w3.org/2000/svg">
    <g clip-path="url(#clip)" height="560" transform="translate(60,0)" width="1060">
      <clipPath id="clip">
        <rect height="70" width="1000"/>
  </clipPath>
  <rect fill="white" fill-opacity="1" height="70" id="rect" stroke="black" stroke-width="2" width="1000" x="0" y="0"/>
  <path d="M-35.63129521110456,34L-1.6312952111045584,68L32.36870478889544,34L-1.6312952111045584,1Z" fill="white" id="mileStones" stroke="green" stroke-width="2"/>
  <path d="M269.4286615414018,34L303.4286615414018,68L337.4286615414018,34L303.4286615414018,1Z" fill="white" id="mileStones" stroke="green" stroke-width="2"/>
  <path d="M674.5082762455497,34L708.5082762455497,68L742.5082762455497,34L708.5082762455497,1Z" fill="white" id="mileStones" stroke="green" stroke-width="2"/>
  <text id="mileStoneText" style="font-size: 15px;" x="-16.631295211104558" y="40">MS1</text>
  <text id="mileStoneText" style="font-size: 15px;" x="288.4286615414018" y="40">MS2</text>
  <text id="mileStoneText" style="font-size: 15px;" x="693.5082762455497" y="40">MS3</text>
</g>

到目前为止,我的代码覆盖了pdf两次,生成的PDF只包含最后一个SVG。我也可以用里面的图像创建3个单独的pdf。但我需要这三个都在一页上,一个在另一个下面。

共有1个答案

姜飞飙
2023-03-14

您可以使用PDFMergerU的合并您的PDF。以下是一些基于您的代码的示例代码:

public class SvgToPdfConverter {

    private ArrayList<byte[]> pdfs = new ArrayList<byte[]>();

    public void convertSVG2PDF(File svg) throws IOException, TranscoderException {
        // Create transcoder
        Transcoder transcoder = new PDFTranscoder();
        // Input
        FileInputStream bais = new FileInputStream(svg);
        // Output
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        TranscoderInput input = new TranscoderInput(bais);
        TranscoderOutput output = new TranscoderOutput(baos);
        // Do the transformation
        transcoder.transcode(input, output);
        pdfs.add(baos.toByteArray());
    }

    public void merge(File mergedPDF) throws IOException, COSVisitorException {
        PDFMergerUtility ut = new PDFMergerUtility();
        for (byte[] bytes : pdfs) {
            ut.addSource(new ByteArrayInputStream(bytes));
        }
        ut.setDestinationStream(new FileOutputStream(mergedPDF));
        ut.mergeDocuments();
    }
}

还有一个 main 方法的示例:

    public static void main(String[] args) {
        File exampleSVGFile = new File(System.getProperty("user.home") + File.separator + "example.svg");
        File exampleOutputFile = new File(System.getProperty("user.home") + File.separator + "example.pdf");
        SvgToPdfConverter converter = new SvgToPdfConverter();
        try {
            converter.convertSVG2PDF(exampleSVGFile);
            converter.convertSVG2PDF(exampleSVGFile);
            converter.convertSVG2PDF(exampleSVGFile);
        } catch (Exception e) {
            log.error("Converting svg failed. ", e);
        }
        try {
            converter.merge(exampleOutputFile);
        } catch (Exception e) {
            log.error("Merge failed. ", e);
        }
    }
 类似资料:
  • 我试图使用Apache Fop和Java生成PDF,但生成的Pdf总是一个空白页。它都嵌套在一个网络应用程序中,割断器是玻璃鱼。 有人有什么建议吗? 以下是我的xsl: 示例XML文件如下所示: 编辑:应该生成pdf的Java代码。。。 第二次编辑: 我发现我的outputStream有问题。我想显示另存为对话框,以便从web应用程序下载生成的文件。我不明白,我的输出有什么问题。。。

  • 问题内容: 我有一个类似于以下代码的HTML构造: 我希望能够使用javascript和DOM向上面定义的SVG中添加一些元素。我将如何完成?我在想 我对使用DOM或如何创建要传递给appendChild的元素不是很熟悉,因此请帮助我解决这个问题,或者向我展示解决此问题的其他替代方法。非常感谢。 问题答案: 如果要创建HTML元素,请使用函数。SVG使用名称空间,这就是为什么必须使用函数的原因。

  • 问题内容: 我需要将SVG图形添加​​到PDF文件中。 使用iText7是否有可能? 使用iText5: 我在以下页面中发现了这一点: PdfPTable和PdfTemplate 有一种创建类似于Template的方法: 如何创建Graphics2D? 问题答案: 巧合的是,我们今天发布了SVG实现。我们目前尚不支持全部功能集,我们仍将在第二季度及以后的时间里进行开发,但是您已经可以使用它了。该工

  • 问题内容: 我正在尝试按照本教程将d3.js SVG Vis转换为PNG服务器端(使用Node.js)http://eng.wealthfront.com/2011/12/converting- dynamic-svg-to- png-with.html 链接到完整代码: https : //gist.github.com/1509145 但是,每当尝试请求加载页面时,我都会不断收到此 错误 有人

  • 问题内容: 是否可以使用css3为svg元素设置阴影,类似 我看到了有关使用滤镜效果创建阴影的一些评论。有没有单独使用css的示例。下面是正确使用cusor样式但没有阴影效果的工作代码。请帮助我以最少的代码获得阴影效果。 问题答案: 这是一个使用’filter’属性将dropshadow应用于某些svg的示例。如果要控制阴影的不透明度,请查看此示例。该属性控制赋予阴影的透明度。 示例中的相关位:

  • 我正在尝试使用蜡染将 SVG 转换为 JPG。在SVG中,我正在使用外部谷歌字体,因此不幸的是,这失败了,并出现以下错误: 有没有办法解决这个问题,或者有一个简单的方法来扩展蜡染来支持这一点? 这是我使用的Java代码: 这是我的SVG文件: 谢谢,杰拉尔德