JAVA / PDF:从.doc模板动态添加表行到.pdf输出

时间:2014-12-02 11:45:54

标签: java pdf open-source richtextbox doc

我的私密问题实际上只显示了我想要做的一个解决方案。实际情况如下: /**(1)Our clients(A) will offer us(B) templates in .doc format *(2)We should fill all of the empty tables with data rows accroding to the table-head in templates. *(3)The output of these documents shoulded be delivered in .pdf format to users(C) for the seek of avoiding being changed. *(4)PS-->part of the final PDF contents are come from rich-text-editor stored in database through browers.So the pdf is make up with two main parts totally **/ (5)PPS - >必须支持中文

我的想法是单独处理.doc模板和富文本,因为我还没有找到一个"银弹"到目前为止。我将稍后将两个.pdf组合在一起。

(1)富文本部分:我将使用fly-saucer或pef-box从html生成临时.pdf文件。文件

(2) .doc模板部分:我在这里尝试。

1,I tried FOP and other xstl library, but it can't work with .doc well.
2,I can not use itext because the format of the .doc is complex and strict, it would kill me if I make a .pdf looking like the same as the .doc tempates with code.
3,I have worked with flying-saucer in the folowing steps:
      1).doc transformed to .html documents
      2)edit the .html documents with free-marker language to generte .flt templates
      3)fill table rows in .flt with dynamic data fetched from database generate middle xhtml stream
      4)generate .pdf file from xhtml stream with flying-saucer

正如您所看到的,我的解决方案实在太尴尬了。处理100多个模板不是一个好的解决方案。

以下是我的问题: (1)是否有"银弹"可以处理.doc(应该动态添加表行数据)和富文本(html / xhtml)到我的.pdf文件?

(2)如果没有(我真的找不到。)。我该如何解决?我应该如何处理.doc模板?

(3)@MihaiC给我一个解决方案,但我的老板不买它,因为他要我尝试一个开源解决方案。所以,如果使用oracle发布者,我可以自由使用它,现在全功能我不知道吗?

======================在12月3日编辑的privious qustion' 2014 ============================

我有一个pdf tampalte文件,其只有一个表头的表。现在我需要添加表行内容,以便从我的数据库中获取数据。 我已经搜索了很多,但我无法找到解决这个问题的方法。 有谁知道是否有一个java库可以帮我这么做?

PS->

不想为pdf文件创建新表,但在表头后添加行。

我无法从头开始创建pdf的原因是输出pdf文件的格式非常严格,以至于无法通过代码创建它。所以我只需要使用pdf模板文件保持它的格式和布局

1 个答案:

答案 0 :(得分:0)

我希望我理解你的问题,我认为你需要的是一种从pdf文件开始生成template的方法,该文件可以随时间更改,以及来自数据库的数据。

为此,您可以使用Oracle Bi Publisher Desktop中的库。他们的位置通常是

C:\Program Files\Oracle\BI Publisher\BI Publisher Desktop\TemplateViewer\lib

您需要的是(名称可能已经更新,因为较新的版本,但或多或​​少是相同的,如果有疑问添加项目中的所有那些)

i18nAPI_v3
versioninfo
xdocore
xmlparserv2-904

您可以阅读有关构建RTF模板的教程,例如Creating RTF Templates。在线提供了大量的例子。

您需要将数据库中的数据转换为xml格式,因为库使用标记来标识行和数据。

首先,您需要为数据库返回的查询结果定义这样的方法。

您可以使用JAXB

public byte[] getXMLData() { ... }

以下方法将根据xml方法生成的getXMLData()以及templateFile生成outFileType输出文件类型生成报告。

public byte[] getReport(String templateFile, String outFileType) {
    byte[] dataBytes = null;
    try {
        //Process RTF template to convert to XSL-FO format
        RTFProcessor rtfp = new RTFProcessor(templateFile);
        ByteArrayOutputStream xslOutStream = new ByteArrayOutputStream();
        rtfp.setOutput(xslOutStream);
        rtfp.process();

        ByteArrayInputStream xslInStream = new ByteArrayInputStream(xslOutStream.toByteArray());

        FOProcessor processor = new FOProcessor();
        ByteArrayInputStream dataStream = new ByteArrayInputStream(getXMLData());
        processor.setData(dataStream);
        processor.setTemplate(xslInStream);

        ByteArrayOutputStream pdfOutStream = new ByteArrayOutputStream();
        processor.setOutput(pdfOutStream);
        byte outFileTypeByte = FOProcessor.FORMAT_PDF;
        if ("HTML".equalsIgnoreCase(outFileType)) {
            outFileTypeByte = FOProcessor.FORMAT_HTML;
        } else if ("RTF".equalsIgnoreCase(outFileType)) {
            outFileTypeByte = FOProcessor.FORMAT_RTF;
        }
        processor.setOutputFormat(outFileTypeByte);
        processor.generate();

        dataBytes = pdfOutStream.toByteArray();

    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("IOException when generating pdf " + e);

    } catch (XDOException e) {
        e.printStackTrace();
        System.out.println("XDOException when generating pdf " + e);

    }
    return dataBytes;
}

通过调用以下内容生成pdf报告:

public byte[] getReport() {
   String templatePath ="<pathToTemplate>/Template.rtf";
   return getReport(templatePath, "pdf");
}