Как я могу преобразовать документ Word в PDF, где документ содержит различные вещи, такие как таблицы. При попытке использовать iText исходный документ выглядит иначе, чем преобразованный PDF. Могу ли я использовать API/библиотеку с открытым исходным кодом вместо вызова исполняемого файла?
Как я могу преобразовать документ Word в PDF?
Ответ 1
Это сложная задача, когда-либо сложнее, если вы хотите отличные результаты (невозможно без использования Word) как таковое количество API, которые просто делают все это для вас в чистой Java и являются открытым исходным кодом, равно нулю, я полагаю (Update: Я ошибаюсь, см. Ниже).
Ваши основные параметры:
- Использование веб-службы JNI/С#/etc script MS Office (только для 100% отличных результатов)
- Использование доступных API script Open Office (90 +% отлично)
- Использование Apache POI и iText (очень большая работа, никогда не будет идеальной).
Обновление - 2016-02-11 Вот вырезанная копия моего сообщения в блоге по этому вопросу, в котором излагаются существующие продукты, поддерживающие Word-to-PDF в Java.
Преобразование документов Microsoft Office (Word, Excel) в PDF файлы в Java
Три продукта, которые я знаю, могут отображать документы Office:
yeokm1/docs-to-pdf-converter Нерегулярно поддерживается, Чистая Java, Open Source Связывает вместе несколько библиотек для выполнения преобразования.
xdocreport Активно разработанная, чистая Java, Open Source Это Java API для объединения XML-документа, созданного с помощью MS Office (docx) или OpenOffice (odt), LibreOffice (odt) с моделью Java для создания отчета и преобразования его, если вам нужен другой формат (PDF, XHTML...).
Snowbound Imaging SDK Закрытый источник, Чистая Java Snowbound, похоже, является 100% -ным решением Java и стоит более 2500 долларов. Он содержит примеры, описывающие, как конвертировать документы в загрузку оценки.
OpenOffice API Open Source, Not Pure Java - требуется установить Open Office OpenOffice - это собственный пакет Office, который поддерживает Java API. Это поддерживает чтение документов Office и создание PDF-документов. В SDK содержится пример преобразования документа (примеры/java/DocumentHandling/DocumentConverter.java). Чтобы писать PDF файлы, вам необходимо передать сценарий "writer_pdf_Export", а не "MS Word 97". Или вы можете использовать API-интерфейс обертки JODConverter.
JDocToPdf - Dead от 2016-02-11 Использует POI Apache для чтения документа Word и iText для записи PDF. Полностью бесплатная, 100% Java, но имеет ограничения .
Ответ 2
Вы можете использовать JODConverter для этой цели. Его можно использовать для преобразования документов между различными офисными форматами. например:
- Microsoft Office для OpenDocument и наоборот
- Любой формат для PDF
- И поддерживает еще много конверсий.
- Он также может конвертировать документы MS Office 2007 в формат PDF, а также практически со всеми форматами.
Более подробную информацию об этом можно найти здесь: http://www.artofsolving.com/opensource/jodconverter
Ответ 3
Проверьте docs-to-pdf-конвертер на github. Это легкое решение, разработанное специально для преобразования документов в PDF.
Зачем?
Я хотел простую программу, которая может конвертировать документы Microsoft Office в PDF, но без таких зависимостей, как LibreOffice или дорогих проприетарных решений. Видя, как код и библиотеки для преобразования каждого отдельного формата разбросаны по сети, я решил объединить все эти решения в одну программу. Попутно я решил добавить поддержку ODT, так как столкнулся с кодом тоже.
Ответ 4
Вы можете использовать Cloudmersive нативную библиотеку Java. Он бесплатен для 50 000 конверсий в месяц и, по моему опыту, гораздо более точен, чем другие методы, такие как методы iText или Apache, основанные на POI. Документы на самом деле выглядят так же, как и в Microsoft Word, который для меня является ключевым. Между прочим, он также может выполнять преобразование XLSX, PPTX и устаревших DOC, XLS и PPT в PDF.
Вот как выглядит код, сначала добавьте импорт:
import com.cloudmersive.client.invoker.ApiClient;
import com.cloudmersive.client.invoker.ApiException;
import com.cloudmersive.client.invoker.Configuration;
import com.cloudmersive.client.invoker.auth.*;
import com.cloudmersive.client.ConvertDocumentApi;
Затем конвертируйте файл:
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
ConvertDocumentApi apiInstance = new ConvertDocumentApi();
File inputFile = new File("/path/to/input.docx"); // File to perform the operation on.
try {
byte[] result = apiInstance.convertDocumentDocxToPdf(inputFile);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling ConvertDocumentApi#convertDocumentDocxToPdf");
e.printStackTrace();
}
Вы можете бесплатно получить ключ API преобразования документов на портале.
Ответ 5
Я согласен с плакатами, перечисляющими OpenOffice как средство импорта/экспорта высокой четкости документов word/pdf с Java API, а также работает на разных платформах. Фильтры импорта/экспорта OpenOffice довольно мощные и сохраняют большинство форматирования при конвертации в различные форматы, включая PDF. Docmosis и JODReports value-add чтобы облегчить жизнь, чем напрямую изучить API OpenOffice, что может быть сложным из-за стиля UNI api и связанных с ним ошибок.
Ответ 6
Я думаю, что конвертер JOD - это самый простой способ реализовать, см. ссылку ниже для получения дополнительной информации.
http://mytechbites.blogspot.in/2014/10/convert-documents-to-pdf-in-java.html
Ответ 7
Я не пробовал использовать его для MS Word, но у меня был хороший успех при чтении документов MS Excel с использованием Apache POI - http://poi.apache.org/
Ответ 8
Посмотрите на сценарий OpenOffice.org, чтобы выполнить эту работу для вас.
Ответ 9
unoconv, это инструмент python, работающий в UNIX. Хотя я использую Java для вызова оболочки в UNIX, она отлично подходит для меня. Мой исходный код: UnoconvTool.java. Говорят, что как JODConverter, так и Unoconv используют офис open office/libre.
docx4j/docxreport, POI, PDFBox хороши, но им не хватает форматов в преобразовании.
Ответ 10
Использование JACOB Call Office Word является 100% идеальным решением. Но он поддерживается только на платформе Windows, потому что нужно установить Office Word.
- Скачать архив JACOB (последняя версия 1.19);
- Добавьте jacob.jar в classpath вашего проекта;
- Добавьте jacob-1.19-x32.dll или jacob-1.19-x64.dll (зависит от вашей версии jdk) в... \Java\jdk1.x.x_xxx\jre\bin
-
Используя JACOB API, вызовите Office Word для преобразования doc/docx в pdf.
public void convertDocx2pdf(String docxFilePath) { File docxFile = new File(docxFilePath); String pdfFile = docxFilePath.substring(0, docxFilePath.lastIndexOf(".docx")) + ".pdf"; if (docxFile.exists()) { if (!docxFile.isDirectory()) { ActiveXComponent app = null; long start = System.currentTimeMillis(); try { ComThread.InitMTA(true); app = new ActiveXComponent("Word.Application"); Dispatch documents = app.getProperty("Documents").toDispatch(); Dispatch document = Dispatch.call(documents, "Open", docxFilePath, false, true).toDispatch(); File target = new File(pdfFile); if (target.exists()) { target.delete(); } Dispatch.call(document, "SaveAs", pdfFile, 17); Dispatch.call(document, "Close", false); long end = System.currentTimeMillis(); logger.info("============Convert Finished:" + (end - start) + "ms"); } catch (Exception e) { logger.error(e.getLocalizedMessage(), e); throw new RuntimeException("pdf convert failed."); } finally { if (app != null) { app.invoke("Quit", new Variant[] {}); } ComThread.Release(); } } }
}
Ответ 11
Это уже 2019 год, я не могу поверить, что до сих пор нет самого простого и удобного способа конвертировать самый популярный документ Micro $ oft Word в формат Adobe PDF в мире Java.
Я почти опробовал все методы, упомянутые выше, и нашел лучший, и единственный способ удовлетворить мои требования - использовать OpenOffice или LibreOffice. На самом деле я точно не знаю разницу между ними, кажется, они оба предоставляют командную строку soffice
.
Мое требование:
- Он должен работать в Linux, точнее в CentOS, а не в Windows, поэтому мы не можем установить на него Microsoft Office;
- Он должен поддерживать символы китайского языка, поэтому кодировка символов ISO-8859-1 не является выбором, она должна поддерживать Unicode.
Первое, что пришло в голову, это doc-to-pdf-converter
, но он не нуждается в обслуживании, последнее обновление произошло 4 года назад, я не буду использовать решение "никто не будет поддерживать". Xdocreport
кажется многообещающим выбором, но он может конвертировать только docx
, но не двоичный файл doc
который является для меня обязательным. Использование Java для вызова OpenOffice API кажется хорошим, но слишком сложным для такого простого требования.
Наконец, я нашел лучшее решение: используйте командную строку OpenOffice для завершения работы:
Runtime.getRuntime().exec("soffice --convert-to pdf -outdir . /path/some.doc");
Я всегда верю, что самый короткий код - это лучший код (конечно, это должно быть понятно).