[node.js-express-wkhtmltopdf] PDF作成でのエラー

  node.js

node.jsのWebアプリケーション改修中にPDF帳票を返す処理で下記エラーで落ちる事象に遭遇しました。(実は遭遇したのは2回目で対処方法を忘れていたので備忘を兼ねて書き残しておきます。)

[2022-02-15T15:45:31.935] [ERROR] file - uncaughtException : 
Error: QNetworkAccessFileBackendFactory: URL has no schema set, use file:// for files
    at Socket.<anonymous> (c:\Users\_____\VSCodeProjects\TestResultsSystem\node_modules\wkhtmltopdf\index.js:97:17)
    at Object.onceWrapper (events.js:422:26)
    at Socket.emit (events.js:315:20)
    at addChunk (_stream_readable.js:295:12)
    at readableAddChunk (_stream_readable.js:271:9)
    at Socket.Readable.push (_stream_readable.js:212:10)
    at Pipe.onStreamRead (internal/stream_base_commons.js:186:23)
    at Pipe.callbackTrampoline (internal/async_hooks.js:120:14)

もともとunix系のPCで開発・公開されているプログラムなので私の環境(Windows10)に原因があるとと判断して調査しました。分かってしまうと簡単なことなのですが、下記のようなhtmlのcssパス指定で引っかかっていました。

<link rel="stylesheet" type="text/css" href="<%= dirname %>/../views/pdf/pdfstyle.css">

dirname というパラメータには現在の実行中のコードのあるディレクトリの絶対パスが設定されます。unix系であれば /home/user1/workspace/app1/routes みたいな文字列になり、以下のように展開されます。

<link rel="stylesheet" type="text/css" href="/home/user1/workspace/app1/routes/../views/pdf/pdfstyle.css">

一方、Windowsでは c:\users\user1\workspace\app1\routes のような文字列となり、以下のように展開されます。

<link rel="stylesheet" type="text/css" href="c:\users\user1\workspace\app1\routes/home/user1/workspace/app1/../views/pdf/pdfstyle.css">

この展開されたパスがうまく解釈できなくてエラーとなっているようでした。

そこでエラーメッセージに含まれている「URL has no schema set, use file:// for files」(URLにスキーマが無い、ファイルに対してfile://を使え)という助言に従って下記のように修正したところ、エラーは発生しなくなりました。

<link rel="stylesheet" type="text/css" href="file://<%= dirname %>/../views/pdf/pdfstyle.css">

この修正によりunix系で実行した場合、href="file:///home/user1/workspace/app1/routes/../views/pdf/pdfstyle.css" のように展開されることになります。fileスキームは file://<host>/<path> ですが、ローカルPCにあるファイルへアクセスの場合は<host>部分を省略できるため file:/// となっても問題ないようです。

LEAVE A COMMENT