2014-11-04 1 views
3

Я хотел бы преобразовать документ EPUB в PDF с помощью Java. Я нашел много вопросов о преобразовании PDF в EPUB, но ничего не изменил.Преобразование EPUB в PDF с Java

Есть ли Java-библиотека или инструмент командной строки, который я мог бы вызвать через Java, чтобы сделать магию?

Thx заранее!

-Gesh

+2

поскольку EPUB в основном упакованной HTML, вы можете попытаться разделить задачу на две части: 1. Распаковать с помощью существующих библиотек 2. Преобразование HTML в pdf – Photon

+0

Это звучит неплохо. Какие различия, кроме упаковки, имеют epub по сравнению с html, которые могут вызвать проблемы при конвертации? – Gesh

+0

Существует также набор стандартных xml-файлов, которые предоставляют метаданные. Если вы просто хотите текст, вы можете игнорировать большую часть его. – Photon

ответ

0

Вы можете вызвать программу Калибра называется ebook-convert из командной строки. См. Calibre manual для получения дополнительной информации.

Я считаю, что преобразование отлично подходит для простых требований. Я попытался использовать его для конвертации электронных книг (ePUB в PDF), но не смог контролировать некоторые параметры документа (отступы номера страницы и т. Д.). Результат содержал весь текст из исходного ePUB, он был полезен, но меня не устраивало качество форматирования.

Наконец-то я закончил с парсингами ePUB и использовал PrinceXML для преобразования HTML в PDF. Хорошо, что я могу удалить оглавление ePUB (гиперссылки без номеров страниц) с совершенно другим ToC (гиперссылки с номерами страниц), я могу добавить пустые страницы, где это необходимо и т. Д. PrinceXML - это двоичный файл, который вы можете запускаться из командной строки или вы можете выполнить его через Java wrapper, он работает очень хорошо и имеет широкую поддержку HTML/CSS.

Карел

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); 
    } 
}