중요한
2024 년 5 월 31 일 현재,이 서비스는 Kotlin 및 Spring Boot를 사용하여 다시 작성되었습니다.
이전 소스 코드를 사용하거나 보려면 nodejs
브랜치를 확인하여 그렇게 할 수 있습니다.
이 도구는 Microsoft Word Documents (DOCX)를 PDF 형식으로 변환합니다.
DOCX에서 PDF 전환에 대한 도구가 풍부하지만 많은 도구가 다음과 같은 과제에 직면 해 있습니다.
더욱 복잡한 문제, 이러한 도구 중 많은 부분은 특정 환경을 요구하며 여러 번의 중복 범위의 추상화 계층을 가지고 있습니다.
정확한 DOCX 변환이 그렇게 어려운 이유는 무엇입니까? 이 문제의 근본은 OOXML 로 알려진 DOCX 사양에 있습니다.
이러한 복잡성을 고려할 때, 완벽한 DOCX를 PDF 컨버터로 만드는 것은 완전 방지 솔루션없이 어려운 과제로 남아 있습니다. 곧 아닙니다.
강력한 오픈 소스 사무실 제품군 인 Libreoffice는 Microsoft Office 형식, 특히 .docx 형식과의 호환성을 향상시키기 위해 지속적으로 노력해 왔습니다. 이는 Microsoft Office에서 Libreoffice로 전환하는 사용자가 문서를 완벽하게 작업 할 수 있도록하는 데 중요합니다.
내장 API 및 서버 모드를 제공하므로 사용자가 UNO (Universal Network Objects) API를 통해 프로그래밍 방식으로 인터페이스 할 수 있습니다.
완벽하지는 않지만 DOCX 형식을 렌더링하기 위해 여전히 무료로 사용 가능한 최상의 솔루션입니다.
이 서비스는 Spring Boot를 사용하여 Java로 내장되어 DOCX 파일을 입력으로 가져오고 application/pdf
파일로 다시 응답하는 간단한 API를 노출합니다.
초기화 중에 백그라운드에서 LibreOffice 서버를 시작하여이를 달성 한 다음 OpenOffice (OO)가 제공하는 UNO API를 통해 서버와 통신하기 시작합니다.
그런 다음 응답을 사용자에게 스트리밍합니다.
DockerHub에서 최신 내장 Docker 이미지를 가져올 수 있습니다.
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
: 사용자 정의 글꼴이 필요한 경우. 필요하지 않은 경우 생략하십시오. 글꼴 섹션에서 더 읽어보십시오. 이 서비스를 로컬로 실행하려면 다음이 필요합니다.
Java 17
Maven
$ export PATH= $PATH :/path/to/folder/apache-maven-3.9.4/bin
$ mvn -v
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
libreoffice, $ 경로 변수를 통해 시스템에서 사용할 수 있는지 확인하십시오.
$ 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 & Stress.js를 통해 이루어집니다.
매우 간단한 1 페이지의 DOCX 파일 (예제 1)으로 동시 요청 으로이 서비스를 테스트했음을 강조합니다. 결과는 다음과 같습니다.
동시 요청 수 | 노동자 수 | 모든 요청을 제공 할 시간 |
---|---|---|
50 | 1 | 5.594S |
50 | 4 | 1.880 년대 |
50 | 8 | 1.277S |
50 | 16 | 1.081S |
입력 파일 복잡성은 변환 성능과 관련하여 중요합니다.
성능 관찰이 있으면 주저하지 말고 문제를보고하십시오.
MIT 라이센스
모하마드 알라 다르