将.fo文件转换为.pdf

3

我正在尝试使用Java将一个名为source.fo的文件转换为result.pdf文件。

我希望达到与调用Apache Fop命令相同的结果:

fop -fo source.fo -pdf result.pdf

也许这不是问题的重点,但我已经成功使用Freemarker模板创建了这些.fo文件。在我在Google上找到的所有使用Java FOP库的示例中,它们使用XML和XSL-FO文件创建PDF,但这不适用于我的情况。
我的备选方案(我正在尝试避免)是调用系统命令。
非常感谢您的帮助。

1
你读过FOP: Embedding吗?还有什么问题吗?(我只在命令行上调用它,但我无法想象他们不会合理地记录您的用例) - undefined
我猜不是,但这就是我所需要的,谢谢! - undefined
1个回答

4

示例 Fo 文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" language="EN">
    <fo:layout-master-set>
        <fo:simple-page-master margin-right="5mm" margin-left="5mm" margin-bottom="5mm" margin-top="5mm" page-width="210mm" page-height="297mm" master-name="A4-portrail">
            <fo:region-body margin-bottom="20mm" margin-top="25mm"/>
            <fo:region-before precedence="true" display-align="before" extent="25mm" region-name="xsl-region-before"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="A4-portrail">
        <fo:static-content flow-name="xsl-region-before">
            <fo:table border-style="solid" border-width="0.4mm" border-color="black" font-size="10pt" width="100%" table-layout="fixed">
                <fo:table-column column-width="proportional-column-width(20)"/>
                <fo:table-column column-width="proportional-column-width(45)"/>
                <fo:table-column column-width="proportional-column-width(20)"/>
                <fo:table-body>
                    <fo:table-row>
                        <fo:table-cell padding-left="2mm" display-align="center" text-align="left">
                            <fo:block>1299Levent Divilioglu</fo:block>
                        </fo:table-cell>
                        <fo:table-cell display-align="center" text-align="center">
                            <fo:block font-size="150%">
                                <fo:basic-link external-destination="http://www.example.com">List of Month Records</fo:basic-link>
                            </fo:block>
                            <fo:block space-before="3mm"/>
                        </fo:table-cell>
                        <fo:table-cell padding-right="2mm" display-align="center" text-align="right">
                            <fo:block>19. Mayis Mah. No: 6 Kadikoy/Istanbul</fo:block>
                            <fo:block space-before="6mm" display-align="before">Page <fo:page-number/> . <fo:page-number-citation ref-id="end-of-document"/>
                            </fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>
        </fo:static-content>
        <fo:flow reference-orientation="0" border-collapse="collapse" flow-name="xsl-region-body">
            <fo:block>Records of Month</fo:block>
            <fo:table space-after="5mm" display-align="center" text-align="center" border-style="solid" border-width="0.35mm" border-color="black" font-size="10pt" width="100%" table-layout="fixed">
                <fo:table-column column-width="proportional-column-width(20)"/>
                <fo:table-column column-width="proportional-column-width(30)"/>
                <fo:table-column column-width="proportional-column-width(25)"/>
                <fo:table-column column-width="proportional-column-width(50)"/>
                <fo:table-body font-size="95%">
                    <fo:table-row height="8mm">
                        <fo:table-cell>
                            <fo:block>Date</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>Called Number</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>Price</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>Discount Type</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block>03-10-2016:19:25:03</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>505-999-88-77</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>12.95</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>4</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block>08-10-2016:20:13:35</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>507-666-42-23</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>24.45</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>1</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block>15-10-2016:17:47:34</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>535-234-44-54</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>21.34</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>3</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block>21-10-2016:21:31:23</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>542-323-43-58</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>51.35</fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block>2</fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>
            <fo:block id="end-of-document">
                <fo:instream-foreign-object>
                    <svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="150mm" width="200mm">
                        <path style="fill:yellow;stroke:red;stroke-width:2" d="M153 334 C153 334 151 334 151 334 C151 339 153 344 156 344 C164 344 171 339 171 334 C171 322 164 314 156 314 C142 314 131 322 131 334 C131 350 142 364 156 364 C175 364 191 350 191 334 C191 311 175 294 156 294 C131 294 111 311 111 334 C111 361 131 384 156 384 C186 384 211 361 211 334 C211 300 186 274 156 274"/>
                    </svg>
                </fo:instream-foreign-object>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

B - 示例代码

package com.levent.fop;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.xml.sax.SAXException;

public class ConvertFoToPdf {

    public static void main(String[] args) throws SAXException, IOException, TransformerException {
        hede();
    }

    public static void hede() throws SAXException, IOException, TransformerException {
        // Step 1: Construct a FopFactory by specifying a reference to the configuration file
        // (reuse if you plan to render multiple documents!)
//      FopFactory fopFactory = FopFactory.newInstance(new File("D:/output/fop.xconf"));
        FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());

        // Step 2: Set up output stream.
        // Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams).
        OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("D:/output/myfile.pdf")));

        try {
            // Step 3: Construct fop with desired output format
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);

            // Step 4: Setup JAXP using identity transformer
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer(); // identity transformer

            // Step 5: Setup input and output for XSLT transformation
            // Setup input stream
            Source src = new StreamSource(new File("D:/output/input.fo"));

            // Resulting SAX events (the generated FO) must be piped through to FOP
            Result res = new SAXResult(fop.getDefaultHandler());

            // Step 6: Start XSLT transformation and FOP processing
            transformer.transform(src, res);

        } finally {
            //Clean-up
            out.close();
        }
    }

}

C - 样例输出

enter image description here

这是一个关于IT技术的样例输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接