【问题标题】:Converting a docx containing a chart to PDF将包含图表的 docx 转换为 PDF
【发布时间】:2015-08-17 14:30:08
【问题描述】:

我有一个 docx4j 生成的文件,其中包含几个表格、标题,最后还有一个 excel 生成的曲线图。

为了将此文件转换为 PDF,我尝试了很多方法,但没有得到任何成功的结果。

  1. 带有 xsl-fo 的 Docx4j 不起作用,docx 文件中包含的大部分内容尚未实现,并以红色文本显示为“未实现”。
  2. JODConverter 也不起作用,我得到了一个结果 PDF,其中一切都很好(只是格式/样式问题很小),但图表没有显示。
  3. 最后,最接近的方法是使用 Apache POI:生成的 PDF 与我的 docx 文件相同,但仍然没有显示图表。
  4. 我已经知道 Aspose 可以很容易地解决这个问题,但我正在寻找一个开源、免费的解决方案。

我在 Apache POI 中使用的代码如下:

public static void convert(String inputPath, String outputPath)
        throws XWPFConverterException, IOException {
    PdfConverter converter = new PdfConverter();
    converter.convert(new XWPFDocument(new FileInputStream(new File(
            inputPath))), new FileOutputStream(new File(outputPath)),
            PdfOptions.create());
}

我不知道如何在 PDF 中获取图表,谁能告诉我如何进行?

提前致谢。

【问题讨论】:

    标签: java pdf charts docx docx4j


    【解决方案1】:

    我不知道这是否对您有帮助,但您可以使用“jacob”(我不知道是否可以使用 apache poi 或 docx4j) 使用此解决方案,您可以自己打开“Word”并将其导出为 pdf。

    !电脑需要安装Word!

    这里是下载页面:http://sourceforge.net/projects/jacob-project/

    try {           
            if (System.getProperty("os.arch").contains("64")) {
                System.load(DLL_64BIT_PATH);
            } else {
                System.load(DLL_32BIT_PATH);
            }
        } catch (UnsatisfiedLinkError e) {
            //TODO          
        } catch (IOException e) {
            //TODO          
        }
    
     ActiveXComponent oleComponent = new ActiveXComponent("Word.Application");
     oleComponent.setProperty("Visible", false);
     Variant var = Dispatch.get(oleComponent, "Documents");
     Dispatch document = var.getDispatch();
    
     Dispatch activeDoc = Dispatch.call(document, "Open", fileName).toDispatch();
    
    // https://msdn.microsoft.com/EN-US/library/office/ff845579.aspx
    Dispatch.call(activeDoc, "ExportAsFixedFormat", new Object[] { "path to pdfFile.pdf", new Integer(17), false, 0 });
    Object args[] = { new Integer(0) };//private static final int DO_NOT_SAVE_CHANGES = 0;
    Dispatch.call(activeDoc, "Close", args); 
    Dispatch.call(oleComponent, "Quit");
    

    【讨论】:

    • 哇,伙计,这太棒了。谢谢一百万,我一直在为此苦苦挣扎,这是一个即时解决方案!
    • @Keews 很高兴听到它有帮助。 (我也经历过同样的事情)。我最终用 jacob 完成了我所有的 Word 创建/编辑工作。几乎没有任何文档,但如果您搜索 net/microsoft 帮助页面,您几乎可以做任何事情......
    • 这绝对是我正在寻找的工具 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2019-10-26
    • 2018-08-13
    • 1970-01-01
    • 2014-05-25
    • 2016-09-04
    • 2021-04-23
    相关资源
    最近更新 更多