使用Java将EPUB转换为PDF

3
我希望利用Java将EPUB文档转换为PDF。我找到了很多关于将PDF转换为EPUB的问题,但没有关于反向转换的内容。
是否有一个Java库或命令行工具,可以通过Java调用来完成这个魔术般的转换呢?
提前感谢!
-Gesh

3
由于epub基本上是打包的HTML,您可能希望尝试将问题分为两部分: 1.使用现有库进行解压缩 2.将HTML转换为PDF - Photon
听起来是个好主意。除了包装之外,EPUB与HTML相比有哪些差异可能会在转换时引起问题? - Gesh
还有一组标准的XML文件,提供元数据。如果您只想要文本,则可以忽略大部分内容。 - Photon
似乎有点更加复杂。当然,如果你只需要文本,那么HTML文件就可以了。但是,如果你想要HTML文件的确切顺序、正确的字体和图像,你也必须解析元数据。 - Gesh
实际上,您可以使用Zip访问容器中任何文件的内容,目录表(在epub 2中为ncx文件)将提供每个HTML文件应转换的顺序。 Zip还应该提供对包含的任何图像、CSS或字体文件的访问权限。 - Vinze
2个回答

1
如果您不介意使用在线服务,那么EPUB to PDF Rest API可以使用。
实际的JAVA代码将如下所示。
public class Main {
    public static void main(String[] args) throws IOException {
        TreeMap params = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

        params.put("File", "C:\path\to\test-epub.epub");
        params.put("Secret", "<secret>");

        CloseableHttpResponse response = ConvertApi.convert("epub", "pdf", params);
        System.out.println(EntityUtils.toString(response.getEntity(), "UTF-8"));
    }
}

class ConvertApi {
    public static CloseableHttpResponse convert(String srcFormat, String dstFormat, TreeMap params) throws IOException {
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        params.forEach((k, v) -> {
            if(Files.exists(Paths.get(v))) {
                builder.addBinaryBody(k, new File(v));
            } else {
                builder.addTextBody(k, v, ContentType.TEXT_PLAIN);
            }
        });

        String authParam = params.get("secret") == null ? String.format("Token=%s", params.get("token")) : String.format("Secret=%s", params.get("secret"));
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(String.format("https://v2.convertapi.com/%s/to/%s?%s", srcFormat, dstFormat, authParam));
        httpPost.setEntity(builder.build());
        return httpClient.execute(httpPost);
    }
}

0

您可以从命令行调用Calibre的程序ebook-convert。有关更多信息,请参阅Calibre手册

我相信转换对于简单的要求是有效的。我尝试将其用于电子书转换(ePUB到PDF),但无法控制某些文档参数(如页码缩进等)。结果包含了源ePUB中的所有文本,虽然可用,但我对格式质量不满意。

最后,我解析了ePUB并使用PrinceXML进行HTML到PDF转换。这样做的好处是我可以删除ePUB目录(没有页码的超链接)并使用完全不同的目录(带有页码的超链接),我可以在适当的位置添加空白页等。PrinceXML是一个二进制文件,您可以从命令行运行它,也可以通过Java wrapper执行它,它非常好用,并且具有广泛的HTML/CSS支持。

Karel


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接