Важный
По состоянию на 31 мая 2024 года сервис был переписан с использованием котлин и весеннего ботинка.
Если вы хотите использовать или посмотреть на старый исходный код, вы можете сделать это, проверив филиал nodejs
.
Этот инструмент преобразует документы Microsoft Word (DOCX) в формат PDF.
Хотя существует множество инструментов для преобразования DOCX в PDF, многие сталкиваются с такими проблемами, как:
Дальнейшие усложнения, многие из этих инструментов требуют конкретной среды и имеют множественные, часто избыточные слои абстракции.
Почему точная конверсия DOCX так сложна? Корень проблемы заключается в спецификации DOCX, известной как OOXML .
Учитывая эти сложности, создание безупречного DOCX в PDF-преобразователя остается сложной задачей, без полного устойчивого решения. Не в ближайшее время.
LibreOffice, мощный офисный набор с открытым исходным кодом, постоянно стремился повысить совместимость с форматами Microsoft Office, особенно форматом .docx. Это важно, чтобы пользователи переходили из Microsoft Office к Libreoffice, чтобы продолжать работать со своими документами.
Он предлагает встроенные API и режим сервера, позволяющий пользователям программно взаимодействовать с ним через API Universal Network Objects (UNO).
Несмотря на то, что он не идеален, он по -прежнему является лучшим доступным решением бесплатно для рендеринга форматов DOCX.
Эта служба построена в Java, используя Spring Boot, обнажая простой API, который принимает файл DOCX в качестве ввода и отвечает обратно с помощью файла application/pdf
.
Это достигает этого, запустив сервер LibreOffice в фоновом режиме во время инициализации, затем начинает общаться с сервером через API -интерфейсы UNO, предоставленные OpenOffice (OO):
А затем потоковую передачу ответа обратно пользователю.
Вы можете вытащить последнее встроенное изображение Docker из Dockerhub:
docker pull moalhaddar/docx-to-pdf:latest
Тогда вы можете запустить службу:
docker run
--rm --name docx-to-pdf
-p 8080:8080
-e " pool.size=1 "
-v ./fonts:/usr/share/fonts/custom
moalhaddar/docx-to-pdf:latest
Некоторые детали:
pool.size
: Если вам понадобится больше работников. Опустите, если не нужно. . Читать больше в разделе производительности./usr/share/fonts/custom
: в случае, если вам понадобятся пользовательские шрифты. Опустите, если не нужно. Читайте больше в разделе шрифтов. Чтобы запустить эту услугу на местном уровне, вам понадобится следующее:
Ява 17
Мавен
$ export PATH= $PATH :/path/to/folder/apache-maven-3.9.4/bin
$ mvn -v
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
LibreOffice, убедитесь, что он доступен в вашей системе через переменную $ Path.
$ libreoffice --version
LibreOffice 7.5.6.2 50(Build:2)
Клонировать этот репозиторий, а затем из домашнего каталога. Запустите службу
$ mvn spring-boot:run
Ожидайте, что служба будет запущена на порту 8080 по умолчанию.
2023-10-06T22:36:06.922+03:00 INFO 1513874 --- [ main] d.a.d.DocxToPdfKotlinApplicationKt : No active profile set, falling back to 1 default profile: "default"
2023-10-06T22:36:07.414+03:00 INFO 1513874 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-10-06T22:36:07.419+03:00 INFO 1513874 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-10-06T22:36:07.419+03:00 INFO 1513874 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.13]
2023-10-06T22:36:07.463+03:00 INFO 1513874 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-10-06T22:36:07.464+03:00 INFO 1513874 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 513 ms
2023-10-06T22:36:07.554+03:00 INFO 1513874 --- [atcher-worker-1] d.a.docxtopdf.server.LibreOfficeServer : [LibreOffice/0] Starting server instance..
2023-10-06T22:36:07.788+03:00 INFO 1513874 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator'
2023-10-06T22:36:07.813+03:00 INFO 1513874 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-10-06T22:36:07.821+03:00 INFO 1513874 --- [ main] d.a.d.DocxToPdfKotlinApplicationKt : Started DocxToPdfKotlinApplicationKt in 1.071 seconds (process running for 1.22)
После того, как служба будет запущена, вы можете попробовать нанести удар по сервису в конечной точке /pdf
.
curl --output output.pdf
--location ' http://localhost:8080/pdf '
--form ' document=@"/home/moalhaddar/example.docx" '
var formdata = new FormData ( ) ;
formdata . append ( "document" , fileInput . files [ 0 ] , "file.docx" ) ;
var requestOptions = {
method : 'POST' ,
body : formdata ,
} ;
fetch ( "http://localhost:8080/pdf" , requestOptions )
. then ( response => response . text ( ) )
. then ( result => console . log ( result ) )
. catch ( error => console . log ( 'error' , error ) ) ;
Примеры ниже примеров включены в этот репозиторий здесь
Получится, что вы используете шрифт в документе DOCX, который не включен в вашу систему. В этом случае указанный шрифт должен быть включен либо:
/usr/share/fonts/
Directory. Пример $ cp ./fonts/DroidKufi-Bold.ttf /usr/share/fonts/
Тогда вам нужно будет перезагрузить сервис.
Если шрифт не включен в изображение System/Docker, то результат PDFS не будет выглядеть так же, как исходный файл DOCX.
Этот инструмент был разработан с учетом производительности.
Настройки по умолчанию запускают службу только с одним работником преобразователя. Если у вас есть достаточно системных ресурсов, и вам нужно увеличить размер пула работников, вы можете сделать это, предоставив пул переменной среды. pool.size
для обслуживания.
Или вы можете сделать это, не покинув линию pool.size
в файле свойств.
Тест проводится через веб -браузер и JavaScript, Checkout Index.html & Press.js соответственно.
Я проверил эту услугу с помощью параллельных запросов с очень простым 1-страничным файлом DOCX (пример 1), вот результаты:
Количество одновременных запросов | Количество рабочих | Время обслуживать все запросы |
---|---|---|
50 | 1 | 5.594S |
50 | 4 | 1.880S |
50 | 8 | 1.277S |
50 | 16 | 1.081S |
Имейте в виду, что сложность ввода файла очень важна, когда дело доходит до производительности преобразования.
Если у вас есть какие -либо наблюдения за производительностью, не стесняйтесь открыть и сообщать о проблеме.
MIT Лицензия
Мохаммад Альхаддар