重要
2024年5月31日現在、サービスはKotlinとSpring Bootを使用して書き直されています。
古いソースコードを使用したり見たりする場合は、 nodejs
ブランチをチェックアウトすることでそうすることができます。
このツールは、Microsoft Word Documents(docx)をPDF形式に変換します。
DOCXからPDF変換のためのツールが豊富にありますが、次のような課題に直面しています。
さらに複雑な問題を複雑にすると、これらのツールの多くは特定の環境を必要とし、抽象化の複数の、しばしば冗長な層を持っています。
なぜ正確なDOCX変換がそんなに難しいのですか?問題のルートは、 OOXMLとして知られるDOCX仕様にあります。
これらの複雑さを考えると、PDFコンバーターへの完璧なDocxを作成することは、困難な課題のままであり、フルプルーフソリューションは見えません。すぐにはありません。
強力なオープンソースのオフィススイートであるLibreofficeは、Microsoft Officeフォーマット、特に.DOCX形式との互換性を強化するために一貫して努力してきました。これは、ユーザーがMicrosoft OfficeからLibreofficeに移行することを保証するために重要です。
組み込みのAPIとサーバーモードを提供し、ユーザーがユニバーサルネットワークオブジェクト(UNO)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
:カスタムフォントが必要な場合。必要でない場合は省略します。詳細については、Fontsセクションをご覧ください。 このサービスをローカルに実行するには、次のことが必要です。
Java 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/
その後、サービスを再起動する必要があります。
フォントがシステム/Docker画像に含まれていない場合、結果PDFSは元のDocxファイルと同じように見えません。
このツールは、パフォーマンスを念頭に置いて設計されています。
デフォルトの設定は、1人のコンバーターワーカーのみでサービスを実行します。十分なシステムリソースが利用可能で、ワーカープールのサイズを増やす必要がある場合は、環境変数pool.size
を提供することでそうすることができます。
または、プロパティファイルのpool.size
lineを除外することでそうすることができます。
このテストは、WebブラウザーとJavaScript、Checkout index.html&stress.jsを介してそれぞれ行われます。
非常にシンプルな1ページのDOCXファイル(例1)を使用した同時リクエストでこのサービスをストレステストしました。ここに結果があります。
同時リクエストの数 | 労働者の数 | すべてのリクエストを提供する時間 |
---|---|---|
50 | 1 | 5.594S |
50 | 4 | 1.880S |
50 | 8 | 1.277S |
50 | 16 | 1.081S |
コンバージョンパフォーマンスに関しては、入力ファイルの複雑さが非常に重要であることに注意してください。
パフォーマンスの観察がある場合は、躊躇して問題を報告してください。
MITライセンス
モハマド・アルハダル