使用Apache POI和Pdfbox从.docx创建PDF时丢失样式

时间:2018-05-08 06:26:43

标签: java pdf apache-poi

代码创建.docx,然后从中创建PDF。打开时,边距和样式与.docx不匹配,但主要问题是文本已移动且某些图像被遗漏。压缩PDF的代码:

    CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
    CTPageMar pageMar = sectPr.addNewPgMar();
    pageMar.setLeft(BigInteger.valueOf(720L));
    pageMar.setTop(BigInteger.valueOf(1440L));
    pageMar.setRight(BigInteger.valueOf(720L));
    pageMar.setBottom(BigInteger.valueOf(1440L));

关于遗漏的图像我不知道,有边距我试图添加它们在实例化文档和创建PdfOptions之间添加以下代码:

'use strict';
(function () {
    angular.module('loan-apply.directive.module')

        .directive('chitSlider', function () {
            return {
                restrict: 'E',
                templateUrl: 'src/modules/loan-apply/directives/chit-slider/chit-slider.html',
                link: chitFundCtrl
            }
        });

    function chitFundCtrl($scope, $http, element) {

        $http.get('src/temp/chit-fund-data.json')
            .success(function (data) {
                $scope.Details = data;
            })
            .error(function(data, status, headers, config) {
                // log error
            });

        setTimeout(function () {
            $(element).find('md-radio-group').slick({
                infinite: true,
                slidesToShow: 5,
                slidesToScroll: 5,
                arrows: true,
            });
        }, 0);


    }
})();

但是不要工作。

我找到了修改边距的方法:在.docx的创建中添加上面相同的代码,它似乎在工作。但这并不能解决错过图像和移动文本的问题。此外,它使代码更加丑陋并且感觉不对,因为在(.docx的编写中)之后正确添加了样式。

如何保留.docx中的样式或添加它们以使 PDF 最接近.docx?

Java 1.8,Apache POI 3.15和Pdfbox 2.0.9。

1 个答案:

答案 0 :(得分:0)

我设法找到了一个解决方案,但只适用于Windows(可能很容易转换为在Linux中使用,但我没有研究它)。我的问题是.docx看起来与打印的PDF完全不同。我用OfficeToPDF并用java调用它。命令行是这样的:

[path-to-officetopdf]/officetopdf.exe [source]\myFile.docx [destination]\myNewPDF.pdf

对于任何可能关心的人,这是使用java执行shell命令的方式:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public static String executeShellCommand(String command) {
        StringBuffer output = new StringBuffer();

    Process p;
    try {
        p = Runtime.getRuntime().exec(command);
        p.waitFor();
        BufferedReader reader =  new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";           
        while ((line = reader.readLine())!= null) {
            output.append(line + "\n");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return output.toString();

}

我希望这可以帮助别人,如果我找到了使用Linux的方法,我会发布它。