使用Java将EPUB转换为PDF

使用Java将EPUB转换为PDF,java,pdf,epub,Java,Pdf,Epub,我想使用Java将EPUB文档转换为PDF。 我发现了很多关于将PDF转换为EPUB的问题,但没有发现其他问题 是否有一个Java库或命令行工具,我可以通过Java调用它来实现这一神奇的功能 提前谢谢 -您可以从命令行调用Calibre的程序。有关更多信息,请参阅 我相信转换可以满足简单的需求。我尝试将其用于电子书转换(ePUB到PDF),但无法控制某些文档参数(页码缩进等)。结果包含来自源ePUB的所有文本,它是可用的,但我对格式的质量不满意 最后,我解析了ePUB并使用PrinceXML进行

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

是否有一个Java库或命令行工具,我可以通过Java调用它来实现这一神奇的功能

提前谢谢


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

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

最后,我解析了ePUB并使用PrinceXML进行HTML到PDF的转换。这样做的好处是,我可以使用完全不同的ToC(带页码的超链接)删除ePUB目录(不带页码的超链接),我可以在适当的地方添加空页等。PrinceXML是二进制文件,可以从命令行运行,也可以通过,它工作得很好,并且广泛支持HTML/CSS


卡雷尔

如果您不怕使用在线服务,则可以使用

实际的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);
    }
}
公共类主{
公共静态void main(字符串[]args)引发IOException{
TreeMap params=newtreemap(String.CASE不区分大小写顺序);
参数put(“文件”,“C:\path\to\test epub.epub”);
参数put(“秘密”、“秘密”);
CloseableHttpResponse response=ConvertApi.convert(“epub”,“pdf”,params);
System.out.println(EntityUtils.toString(response.getEntity(),“UTF-8”);
}
}
类转换API{
publicstaticcloseablehttpresponse转换(stringsrcformat、stringdstformat、TreeMap参数)引发IOException{
MultipartEntityBuilder=MultipartEntityBuilder.create();
forEach参数((k,v)->{
如果(Files.exists(path.get(v))){
addBinaryBody(k,新文件(v));
}否则{
addTextBody(k,v,ContentType.TEXT\u 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=新的HttpPost(String.format(“https://v2.convertapi.com/%s/to/%s?%s“,srcFormat,dstFormat,authParam”);
setEntity(builder.build());
返回httpClient.execute(httpPost);
}
}

由于epub基本上是打包的html,您可能希望尝试将问题分为两部分:1。使用现有库解压2。将html转换为PDF听起来是个好主意。除了包装之外,epub和html有什么区别,可能会导致转换问题?还有一组提供元数据的标准xml文件。如果你只想要文本,你可以忽略大部分。它看起来有点复杂。当然,如果您只需要文本,html文件就可以了。但是,如果您想要html文件的确切顺序、正确的字体和图像,您也必须解析元数据。实际上,您可以使用Zip访问容器中任何文件的内容,内容表(epub 2中的ncx文件)将提供每个html文件的转换顺序。Zip还应提供对包含的任何图像、css或字体文件的访问。