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

如何使用开源的Java库正确地从DOCM转换为PDF?

子车新立
2023-03-14

我开始研究如何改变?docm文件转换成PDF文件。据我所知,只有开源库可以转换。docx转pdf。我的解决方案是寻找一种方法来转换。docm to。docx,同时保留每一条信息。为此,我找不到合适的开源解决方案,但我找到了一个apache-poi的submit(链接)。使用在提交中找到的代码,我成功地创建了。包含我的所有信息的docx文件。docm文件有。

        String dir = "<directory>";
    for (int i = 1; i < 41; i++) {
        File f = new File(dir + File.separator + i + ".docm");
        File target = new File(dir + "output" + i + ".docx");
        try {
            new DocumentConverter(f).toDocx(target);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

我从链接中复制了代码,并以上述方式使用它。

一旦我有了包含所有信息的.docx文件,我就开始将它们转换为.pdf文件。为此,我找到了两个可能的开源库,docx4j和documents4j。

Docx4j转换为pdf代码:

    try {
            Docx4J.toPDF(WordprocessingMLPackage.load(target), new FileOutputStream(dir + "out" + i + ".pdf"));
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (Docx4JException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

这将为我生成一个pdf文件,其中包含除MS Word的评论之外的所有信息。

文档4j转换为PDF代码:

try (ByteArrayOutputStream bo = new ByteArrayOutputStream()) {
                try (InputStream in = new BufferedInputStream(new FileInputStream(target));) {
                    IConverter converter = LocalConverter.builder()
                            .baseFolder(new File(dir))
                            .workerPool(20, 25, 2, TimeUnit.SECONDS)
                            .processTimeout(5, TimeUnit.SECONDS)
                            .build();

                    Future<Boolean> conversion = converter
                            .convert(in).as(DocumentType.DOC)
                            .to(bo).as(DocumentType.PDF)
                            .prioritizeWith(1000) // optional
                            .schedule();
                    conversion.get();
                    try (OutputStream outputStream = new FileOutputStream("out"+ i +".pdf")) {
                        bo.writeTo(outputStream);
                    }
                    converter.shutDown();
                } 
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException | ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 

这将为我生成一个看起来不错的pdf文件,并包含MS Word的注释。

进一步的测试表明docx4j pdfs在文本上是准确的,但是位置被改变了(例如:段落被合并或分成两段)。documents4j的pdf在位置上更准确,但就像我说的,它们缺少信息。我的测试是在以相同方式创建的表单文档上进行的,缺失的信息总是在相同的位置。

我的问题如下:

  1. 有没有经过认证的方法可以使用开源库将. docm文件正确转换为. docx文件?
  2. 当我使用文档4j创建pdf时,出了什么问题?
  3. 如何在docx4j的帮助下包含MS Word的评论?
  4. 除了我选择的库之外,还有其他选择吗?(仅限开源)

编辑:我忘记包含我正在使用每个库的最新版本。

共有1个答案

邵锐
2023-03-14

Docents4j通过VBS脚本将实际工作委托给MS Word,因此,结果的任何更改都是由于脚本中的配置。您可以尝试使用它,看看是否可以让Word包含您缺少的内容:https://github.com/documents4j/documents4j/blob/master/documents4j-transformer-msoffice/documents4j-transformer-msoffice-word/src/main/resources/word_convert.vbs

只需构建项目,并查看更改如何影响输出。

 类似资料:
  • 我在Eclipse IDE中编写了JavaFx项目,它工作正常。 一旦我把它转换成Maven项目,我的FMXL文件就停止打开了。但是,如果我创建新的FXML文件并将它们放在相同的文件夹中,一切都会正常工作。 有没有办法在不重新创建所有FXML文件的情况下运行我的Maven项目? 我已经尝试过在代码中更改FXML文件的路径,将FXML移到src/main/resources包,或者简单地将代码从旧的

  • 如何正确转换dto到json在Java?我这样做就像下面使用: 问题在于格式化字段。在Dto我有我的日期在这种格式:但转换此dto到json字节后,我看到我的拆分为对象与许多属性如下: 在使用之后,我希望将中的所有属性以与转换之前相同的格式进行转换。如何做到这一点? 谢谢你的帮助!

  • 我该怎么做才能更精确地定位这些点(±3km就足够精确了)?

  • 问题内容: 我想将一些div转换为PDF,并且尝试了jsPDF库,但没有成功。看来我不明白我需要导入什么才能使库正常工作。我已经看过这些示例,但仍然无法弄清楚。我尝试了以下方法: 在jQuery之后: 用于测试目的,但我收到: 身体的第一个div 在哪里。 问题答案: 您可以按如下方式使用html中的pdf, 步骤1:将以下脚本添加到标题 步骤2:添加HTML脚本以执行jsPDF代码 对此进行自定

  • 问题内容: 我正在从事Spring MVC项目。我正在使用Hibernate。我想将AJAX与jQuery结合使用,以从Spring Controller中获取一些JSON。不幸的是,当我在应用程序中实现方法时,出现了一个错误: 我必须使用哪种适配器以及以哪种方式使用?该方法的最后一行发生了错误: 这是我在Spring MVC项目中与Hibernate一起使用的班级: 编辑 我想知道:我的对象是代

  • 问题内容: 我有一个包含单个模块和一些依赖项的项目。我想在一个包含编译模块的单独目录中创建一个jar。另外,我想在模块旁边提供依赖项。 无论我如何扭曲IntelliJ的“构建jar”过程,模块的输出都将显示为空(除了META-INF文件之外)。 问题答案: 这是使用IntelliJ 10构建jar的方法http://blogs.jetbrains.com/idea/2010/08/quickly-