使用Java将EPUB转换为PDF

问题描述:

我想使用Java将EPUB文档转换为PDF。 我发现很多关于将PDF转换为EPUB的问题,但没有其他办法。使用Java将EPUB转换为PDF

是否有一个Java库或一个命令行工具,我可以通过Java调用会做魔术?

Thx提前!

-Gesh

+2

因为EPUB基本上是包装HTML,你可能想尝试的问题分为两个部分: 1.解压使用现有的库 2.将HTML转换成pdf – Photon 2014-11-04 12:19:00

+0

这听起来像个好主意。与包装相比,除了包装之外,哪些差异与epub相比可能导致转换问题? – Gesh 2014-11-04 12:22:10

+0

还有一组提供元数据的标准xml文件。如果你只是想要的文字,你可以忽略它的大部分。 – Photon 2014-11-04 16:53:56

您可以拨打口径的程序的命令行称为ebook-convert。请参阅Calibre manual了解更多信息。

我相信对于简单的需求,转换工作正常。我试图用它来进行电子书转换(ePUB to PDF),但无法控制一些文档参数(页码缩进等)。结果包含源ePUB的所有文本,它可用,但我对格式化的质量不满意。

最后,我最终解析了ePUB并使用PrinceXML进行了HTML转换。关于这一点的好处是我可以用一个完全不同的ToC(带页码的超链接)去除ePUB目录表(超链接不带页码),我可以在适当的地方添加空白页面。PrinceXML是一个二进制文件,你可以从命令行运行,或者你可以通过Java wrapper执行它,它工作得很好,并且有广泛的HTML/CSS支持。

卡雷尔

如果你不害怕使用在线服务的话,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); 
    } 
}