DOCX 转 PDF 仅在保存文件后有效 [JAVA]

DOCX to PDF works after saving file only [JAVA]

提问人:Bruno RB 提问时间:10/17/2023 最后编辑:Rifat Rubayatul IslamBruno RB 更新时间:10/17/2023 访问量:71

问:

下面提供的代码有点有效,我试图解决的问题是我已经能够将我的 docx 保存在本地。当我试图将其转换为 pdf 时,我得到空白页或只有 docx 标题的页面。但是当我使用 Libre office 或免费办公室手动打开文件并在不进行任何更改的情况下保存它并再次运行转换时,该文件可以完美地转换到我需要的样子。有谁知道为什么会发生这种情况,以及我如何在不必实际操作和保存文件的情况下复制该行为,因为我需要以编程方式执行所有这些过程?

我试图使用以下方法将 DOCX 转换为 PDF:

<dependency>      
    <groupId>fr.opensagres.xdocreport</groupId>           
    <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
    <version>1.0.6</version>  
</dependency>

到目前为止,我的代码是:

public byte[] converterXmlToDocx(Long idModeloDocumento) throws Docx4JException {
    try {
        byte[] gzipXml = buscarModeloDocumento(idModeloDocumento);
        byte[] xmlData = descompactarGzip(gzipXml);

        WordprocessingMLPackage pkg = WordprocessingMLPackage.load(new    ByteArrayInputStream(xmlData));

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        pkg.save(outputStream);

        //saves file localy
        String outputFilePath = "src/main/resources/test1.docx";
        File outputDocxFile = new File(outputFilePath);
        pkg.save(outputDocxFile);

        return outputStream.toByteArray();
    } catch (Docx4JException | IOException e) {
        e.printStackTrace();
        throw new Docx4JException("Erro converting xml to docx", e);
    }
}


public void convertLOCAL(String docxFilePath, String pdfFilePath) {
    try {
        FileInputStream docxFile = new FileInputStream(docxFilePath);
        XWPFDocument document = new XWPFDocument(docxFile);

        FileOutputStream pdfFile = new FileOutputStream(pdfFilePath);
        PdfOptions options = PdfOptions.create();
        PdfConverter.getInstance().convert(document, pdfFile, options);

        docxFile.close();
        pdfFile.close();

        System.out.println("Sucess");
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
        throw new RuntimeException("Conversion Error", ex);
    }
}

我上面所做的是使用第一种方法生成 docx 文件,他们在我的控制器中使用第二种方法对其进行转换,传递输入 docx 路径和输出 pdf 路径。

java pdf apache-poi docx docx4j

评论

1赞 Ishan 10/17/2023
因此,问题可能出在从 XML 转换的磁盘上写入 DOCX 的方式。如果该 DOCX 按原样打开并保存,则 DOCX 到 PDF 有效。这意味着,问题出在 DOCX 生成中。为什么要使用两次?你不能只用一次就做吗?也许只是把它写进去,然后用它本身把它写到磁盘上。不要再做了。也许在第一次调用时内部设置了某些内容,这会阻止它在第二次调用时将文件写入磁盘?converterXmlToDocx()pkg.save()ByteArrayOutputStreampkg.save()savesave
0赞 Bruno RB 10/17/2023
感谢您的输入。我希望我能找到一种方法来了解在按原样打开和保存后,生成的文件与相同的生成文件有什么不同。我正在使用 2 pkg.save,因为第二次保存是注释代码的一部分,仅用于测试,在“生产”中,我仅使用流转换为 pdf,并且结果与转换本地文件相同
0赞 JasonPlutext 10/19/2023
什么是调用 converterXmlToDocx 和 convertLOCAL?converterXmlToDocx FlatOPC 的输入是 XML 吗?您可以比较之前和之后的文档.xml部分。

答: 暂无答案