pdfme 開発者レター 2024年2月
去年の12月からV4の開発を着手してすでに3ヶ月が過ぎようとしている。
開発スピードが遅くて申し訳ない。しかし少しづつV4のリリースは現実になってきている。
V4に実装予定の機能
-
- Preview: https://add-dynamic-table-schema-332.vercel.app/
- テーブルは計画と違う実装で進んでいる。
- 二ヶ月前にImplementation Ideas for Dynamic Tables in pdfmeというブログ記事を書いたが実際には当時のアイデアとは違う方法で実装を行なった。
-
jspdf-autotable の実装をベースに行なった。
- 整理されたクラス、オプション、レイアウトの計算が再利用できると考えた。
- jspdf-autotable のコードを移植し、不要なコードを削除してテーブルの計算処理を利用している。
- generatorとUIパッケージで
getDynamicTemplate
という関数を呼び出し、その中でテーブルの高さを計算し、そのテーブルよりもY座標が下にあるスキーマのY座標を再設定したり、ページブレイクの処理を行なっている。
- 致命的なバグがいくつかあり、うまく修正できずに1週間経過した。
-
getDynamicTemplate
の実装の中でうまく計算ができていないことが致命的でリリースをブロックしている。 - バグはすでにissueを作成している。: https://github.com/pdfme/pdfme/issues?q=is%3Aissue+is%3Aopen+label%3Atable
- 正直バグの修正がうまくいかずでスタックしている。ここで止まっていたくないので、次で紹介する他の機能の実装にも着手するつもりだ
-
-
Add a Left Sidebar for Placing Schemas #400
- スキーマを追加する際にサイドバーから引き出せるUIを追加する
- プラグインの定義が変わる(アイコンの追加)のでこのメジャーバージョンに入れるつもり
-
Placeholder, Expression
- まだどのように実現するかは具体的なイメージはない。
- Handlebars のようなテンプレートエンジンがレンダリング時に動くようになるとか?
- しかしユーザーのニーズは明確にある。これも破壊的変更があるかもしれないので場合によってはV4に含めるべきだと考えている。
- まだどのように実現するかは具体的なイメージはない。
公開時期
- 早くリリースしたいが明確にバグがいつ解消できるか、他の機能についてもまだ着手していないので現時点では逆算してリリース日を決めることができない。
- 現時点では上記の機能のうちテーブルの実装しかない。しかもリリースするまでに解消すべき致命的なバグがあるのでまだまだ時間がかかりそうだ。
- V4で発表される機能に対して特に使う予定がない場合はこのまま安心してV3を使い続けてほしい。バグの対応などV3に必要な修正は今後も引き続き行なっていく予定だ。
alpha版へのアクセス
-
V4のプレビュー環境を用意している: https://pdfme-playground-v4.vercel.app/
-
V4の installの方法
npmのバージョンからnextタグのついたものはV4のバージョンだ。現在各パッケージで4.0.0-alpha.0のバージョンがリリースされている。
- 下記コマンドでインストール可能だ。
npm i @pdfme/common@4.0.0-alpha.0 @pdfme/schemas@4.0.0-alpha.0 @pdfme/generator@4.0.0-alpha.0 @pdfme/ui@4.0.0-alpha.0
- 下記コマンドでインストール可能だ。
後方互換性について
V4を使う場合、過去のテンプレートとプラグインは修正が必要になる。
- テンプレート:
-
template.sampledata
は廃止になり、各スキーマのcontent
プロパティにデザイナーの表示用データを持つようになりました。
-
- プラグイン:
-
プラグインの初期データとして
defaultValue
の代わりにdefaultSchema.content
を使うようになりました。 -
プラグイン内でonChangeした場合、これまでユーザーの入力を
onChange
で書き換えていたが、{[key:string]:string}
の形式でスキーマの自体定義も変更できるようになりました。
これまでのonChange
と同じようにユーザーの入力を反映させたい場合はonChange({ key: 'content', value: data });
と書いてください。
-
- テンプレートにバージョン:
-
V4のデザイナーで作成されたテンプレートからテンプレートにバージョンが付くようになりました。現時点では開発版なのでプロパティは
pdfmeVersion:"4-dev"
が追加されます。
-
最後に
Help wanted!
テーブルのバグが解消されれば次のステップに進めるが、正直スタックしているので協力してくれる人がいると本当に嬉しい…
- 下記のIssueについて協力してくれる人がいれば教えてほしい。
コラボレーターが現れたときに効率的に修正が行えるよう、これからissueに私が知っている情報を追記するつもりだ。
スタックしているが前に進みたいと思っているので、3月は下記の機能の実装を開始するつもりだ。
みんなありがとう
2月は私は良い進捗を出すことができなかったが、コントリビューターは最高の仕事をしてくれた。ありがとう。
- Fix pdf text render overlap by avoiding line breaks in pdflib #417
- ui-build-optimization: development react/react-dom files in prod build fix #422
まだマージされていないが、カラータイプが追加されたこのPRもクールだ。
コード以外でもOSSへの貢献の方法は無限にある。
まずはソフトウエアを使うこと、そして良いと思ったら友達にこのライブラリを紹介すること、もしバグを見つけたらIssueから登録してください。
時間はかかるかもしれないですが、できるだけ返信していますし、コメントに目を通すようにしています。
V4は私がこのライブラリを作り始めた時に諦めていたテーブル機能が入る予定で、これは一人では絶対にできなかったことだ。サポーター、コントリビューター、ユーザーには感謝している。
私はOSSの力にはびっくりさせられている、今は最高のPDFライブラリができそうな気がするんだ!
またアップデートがあれば更新します。最後まで読んでくれてありがとう。
Discussion
はじめまして。
pdfmeに興味を持ちまして、nuxt(v2)にて試してみようと思ったのですが、
@pdfme/commonをimportすると以下のエラーが発生します。
you may need an appropriate loader to handle this file type, currently no loaders are configured to process this file.
試してみたコードは貴Webサイトのサンプルをnuxt用に少し変えたものです。
<template>
<div>{{ template }}</div>
</template>
<script>
import { BLANK_PDF } from "@pdfme/common"
export default {
data() {
return {
template: {
basePdf: BLANK_PDF,
schemas: [
// ...
]
}
}
}
}
</script>
webpackでfontファイルの読み込み時に適切なローダーの設定がないのだろうと推測しているのですが、解決方法をご教示いただけないでしょうか。
Nuxt 2.17.2で同じエラーに遭遇しましたので、ご参考にコメントします。
nuxt.config.ts
に下記のように追加するとloaderのエラーはなくなりました。これとは別に
@pdfme/schemas
のインストールが必要でした。optional chaining(?)の部分の読み込みの問題のようです。(参考に別の方の記事を添付します。)
もし参考になりましたら。
お返事がめちゃくちゃ遅れて申し訳ないです。(通知見てなかった...)
Nuxtで検証できていなかったので助かります。ありがとうございます!
hosaka313様
ありがとうございます。
別機能の実装に追われていて未だ確認できていないのですが、時期が来たら参考にさせていただきます。
作成者様のお役に立つかもしれませんので、結果もこちらにご報告いたします。
遅くなって申し訳ありません💦
だいぶご無沙汰してしまいました。
やっと試行する時間が取れましたので、hosaka313様のアドバイスも含めて試してみましたところ、
import { generate } from '@pdfme/generator` で
This dependency was not found:
@pdfme/schemas/utils in ./node_modules/@pdfme/generator/dist/esm/src/generate.js
To install it, you can run: npm install --save @pdfme/schemas/utils
@pdfme/schemasもインストールしたのですが、utilsへの参照ができていないようです。
助けていただけますと幸いです。