Files
pdfme/website/i18n/ja/docusaurus-plugin-content-docs/current/getting-started.md
2026-05-09 17:16:18 +09:00

381 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# はじめに
:::tip インタラクティブなドキュメント
[DeepWiki](https://deepwiki.com/pdfme/pdfme)を使用すると、pdfmeのドキュメントやソースコードについてインタラクティブに質問できます。コードの使い方や機能について疑問がある場合に便利です。
:::
## イントロダクション
pdfmeはPDFのデザインと生成プロセスを簡素化するために作成されました。特に以下のようなユースケースに役立ちます
- 短いコードでデザインされたPDFを作成する必要がある場合
- アプリケーションにPDFエディタ機能を統合する必要がある場合
- パフォーマンスを損なうことなく大量のPDFを作成する必要がある場合
## インストール
動作要件はnode環境 `>=16` です。
pdfmeには、generatorとUIの2つのパッケージがあります。
PDFを生成するためのパッケージは、以下のコマンドでインストールできます。
```
npm i @pdfme/generator @pdfme/common
```
PDFデザイナー、フォーム、ビューワーを使用するためのパッケージは、以下のコマンドでインストールできます。
```
npm i @pdfme/ui @pdfme/common
```
`@pdfme/ui` は standalone bundle として配布されるため、Designer / Form / Viewer を使うためだけに `react``react-dom` を別途インストールする必要はありません。
\*どのパッケージを使用する場合でも、`@pdfme/common`をインストールする必要があります。
pdfmeでは以下の型、関数、クラスが利用可能です。
`@pdfme/common`
- [Template](/docs/getting-started#template)
`@pdfme/generator`
- [generate](/docs/getting-started#generator)
`@pdfme/ui`
- [Designer](/docs/getting-started#designer)
- [Form](/docs/getting-started#form)
- [Viewer](/docs/getting-started#viewer)
環境がwebpackを使用している場合は、以下のように必要なアイテムをインポートします。
```ts
import type { Template } from '@pdfme/common';
import { generate } from '@pdfme/generator';
```
```ts
import type { Template } from '@pdfme/common';
import { Designer, Form, Viewer } from '@pdfme/ui';
```
**すべてのオブジェクトは`Template`を使用しており、これについては次のセクションで簡単に説明します。**
## テンプレート {#template}
pdfmeライブラリの中核はテンプレートです。
テンプレート型は`@pdfme/generator`または`@pdfme/ui`の両方からインポートできます。テンプレートはあらゆる場所で使用されます。
テンプレートは、固定部分と可変部分の2つに分けることができます。
これらをbasePdfとschemaと呼びます。
以下の画像はテンプレートの良い例です。
![](/img/template.png)
- **basePdf**: 生成されるPDFの固定部分のPDFデータ。
- **schemas**: 生成されるPDFの可変部分の定義データ。
**basePdf**プロパティは、`string`base64エンコード`ArrayBuffer`、または`Uint8Array`としてPDFデータを受け入れます。`BLANK_PDF`を使用して空白のA4 PDFをインポートして動作を確認できます。または、以下のように空のPDFを定義することもできます。`overflow: "expand"` を使うテキスト、リスト、テーブルなど、動的レイアウトやページ区切りが必要なスキーマを使用する場合は、以下の形式でPDFを指定してください
```json
basePdf: { "width": 210, "height": 297, "padding": [10, 10, 10, 10] }
```
**schemas**はデフォルトではテキストのみ使用できます。`generate``Designer``Form``Viewer` が使うデフォルトのプラグインレジストリには、意図的に `text` スキーマだけが含まれています。
画像、署名、テーブル、QRコードなどのバーコード、その他のスキーマタイプを使う場合は、`@pdfme/schemas` から対象プラグインを明示的に import し、`plugins` オプションで渡してください。
さらに、独自のスキーマを作成することで、上記以外の種類をレンダリングすることも可能です。詳細は[カスタムスキーマ](/docs/custom-schemas)と、既存コードを更新する場合の [v6 migration guide](/docs/migration-v6) をご覧ください。
具体的なデータを見てみましょう。
TypeScriptを使用している場合は、Template型をインポートできます。
### 最小限のテンプレート {#minimal-template}
```ts
import { Template, BLANK_PDF } from '@pdfme/common';
const template: Template = {
basePdf: BLANK_PDF,
schemas: [
[
{
name: 'a',
type: 'text',
position: { x: 0, y: 0 },
width: 10,
height: 10,
},
{
name: 'b',
type: 'text',
position: { x: 10, y: 10 },
width: 10,
height: 10,
},
{
name: 'c',
type: 'text',
position: { x: 20, y: 20 },
width: 10,
height: 10,
},
],
],
};
```
[playground Designer](https://playground.pdfme.com/designer?template=a4-blank)からテンプレートを作成できます。または、テンプレート作成機能をアプリケーションに統合したい場合は、[デザイナーセクション](/docs/getting-started#designer)をご覧ください。
### プラグインの使用
デフォルトでは、例は多くの場合`text`スキーマタイプの使用を示しています。ただし、他の組み込みスキーマタイプを使用したり、`@pdfme/schemas`パッケージで独自のカスタムスキーマを作成したりすることもできます。
#### ステップ1: `@pdfme/schemas`のインストール
追加のスキーマタイプにアクセスするために必要なパッケージをインストールします。
```bash
npm install @pdfme/schemas
```
#### ステップ2: 組み込みおよびカスタムスキーマタイプの使用
以下は、組み込みとカスタムの両方のスキーマタイプを使用したテンプレートの例です:
```ts
import { Template, BLANK_PDF } from '@pdfme/common';
import { text, barcodes, image } from '@pdfme/schemas';
import myCustomPlugin from './custom-plugins';
const template: Template = {
basePdf: BLANK_PDF,
schemas: [
[
{
name: 'example_text',
type: 'text',
position: { x: 0, y: 0 },
width: 40,
height: 10,
},
{
name: 'example_image',
type: 'image',
position: { x: 200, y: 200 },
width: 60,
height: 40,
},
{
name: 'example_qr_code',
type: 'qrcode',
position: { x: 100, y: 100 },
width: 50,
height: 50,
},
],
],
};
const plugins = {
Text: multiVariableText,
'QR Code': barcodes.qrcode,
Image: image,
MyCustomPlugin: myCustomPlugin,
};
const inputs = [
{
example_text: 'Hello, World!',
example_image: 'data:image/png;base64,iVBORw0KG....',
example_qr_code: 'https://pdfme.com/',
},
];
generate({ template, inputs, plugins }).then((pdf) => {
console.log(pdf);
});
```
#### 組み込みスキーマタイプの探索
サポートされているすべての組み込みスキーマタイプを表示するには、[サポートされている機能のドキュメント](/docs/supported-features)を参照してください。
#### カスタムスキーマタイプの作成 {#creating-your-own-schemas}
組み込みではないスキーマタイプが必要な場合は、独自のものを定義できます。詳細な手順については、[カスタムスキーマガイド](/docs/custom-schemas#creating-your-own-schemas)をご覧ください。
## ジェネレーター {#generator}
PDF生成関数`generate`は、PDFを生成するために`template``inputs`の2つの引数を取ります。これはNode.jsとブラウザの両方で動作します。
[上記で作成したテンプレート](/docs/getting-started#minimal-template)を使用してPDFファイルを生成するコードを以下に示します。
```ts
import type { Template } from '@pdfme/common';
import { generate } from '@pdfme/generator';
const template: Template = {
// 省略... テンプレートセクションを確認してください。
};
const inputs = [{ a: 'a1', b: 'b1', c: 'c1' }];
generate({ template, inputs }).then((pdf) => {
console.log(pdf);
// ブラウザ
// const blob = new Blob([pdf.buffer], { type: 'application/pdf' });
// window.open(URL.createObjectURL(blob));
// Node.js
// fs.writeFileSync(path.join(__dirname, `test.pdf`), pdf);
});
```
以下のようなPDFファイルを作成できます。
![](/img/simple-pdf.png)
また、inputs配列の各要素はPDFのページに対応しており、複数の要素を提供することで複数ページのPDFファイルを作成できます。
## UI
UIは[デザイナー](/docs/getting-started#designer)、[フォーム](/docs/getting-started#form)、[ビューワー](/docs/getting-started#viewer)クラスで構成されています。
### デザイナー {#designer}
デザイナーを使用すると、テンプレートスキーマを編集でき、誰でも簡単にテンプレートJSONオブジェクトを作成できます。
[playground Designer](https://playground.pdfme.com/designer?template=a4-blank)から独自のテンプレートをデザインするか、デザイナーをアプリケーションに統合することができます。
上記で作成したテンプレートをデフォルトテンプレートとして使用し、デザイナーを統合してみましょう。
```ts
import type { Template } from '@pdfme/common';
import { Designer } from '@pdfme/ui';
const domContainer = document.getElementById('container');
const template: Template = {
// 省略... テンプレートセクションを確認してください。
};
const designer = new Designer({ domContainer, template });
```
デザイナークラスは上記のようにインスタンス化され、テンプレートデザイナーが`domContainer`に表示されます。
以下のようにテンプレートを編集できます。操作はGoogle Slidesなどに似ているため、一般的なキーボードショートカットを使用できます。
![](/img/designer.gif)
デザイナーインスタンスは以下のメソッドで操作できます。
- `saveTemplate`
- `updateTemplate`
- `getTemplate`
- `onChangeTemplate`
- `onSaveTemplate`
- `destroy`
UIの状態は `options` で制御できます(省略時は下記のデフォルト値です)。
```js
// UIの状態を一部またはすべて設定省略時のデフォルト値を例示
const options = {
zoomLevel: 1,
sidebarOpen: true
};
const designer = new Designer({ domContainer, template, options });
```
### フォーム {#form}
テンプレートを使用してフォームとPDFビューワーを作成できます。
フォームは、ユーザーがテンプレートに基づいてスキーマを入力するためのUIを作成します。
[playground Form/Viewer](https://playground.pdfme.com/form-viewer?template=invoice)で請求書テンプレートを使用したフォームを試すことができます。
```ts
import type { Template } from '@pdfme/common';
import { Form } from '@pdfme/ui';
const domContainer = document.getElementById('container');
const template: Template = {
// 省略...
};
// これは初期データです。
const inputs = [{ a: 'a1', b: 'b1', c: 'c1' }];
const form = new Form({ domContainer, template, inputs });
```
![](/img/form.gif)
フォームインスタンスには、ユーザーの入力を取得するための`getInputs`メソッドがあります。
以下のコードに示すように、`getInputs`から取得したデータを入力として渡すことで、ユーザーの入力に基づいてPDFファイルを生成できます。
```ts
generate({ template, inputs: form.getInputs() }).then((pdf) => {
const blob = new Blob([pdf.buffer], { type: 'application/pdf' });
window.open(URL.createObjectURL(blob));
});
```
### ビューワー {#viewer}
モバイルブラウザでPDFファイルを表示するのは、iframeでうまく表示されないため面倒です。
ビューワーはフォーム開発プロセスの副産物ですが、作成するPDFファイルのプレビューをユーザーに表示することができます。
ビューワーの使用は基本的にフォームの使用と同じですが、ユーザーが編集できない点が異なります。
```ts
import type { Template } from '@pdfme/common';
import { Viewer } from '@pdfme/ui';
const domContainer = document.getElementById('container');
const template: Template = {
// 省略...
};
const inputs = [{ a: 'a1', b: 'b1', c: 'c1' }];
const viewer = new Viewer({ domContainer, template, inputs });
```
![](/img/viewer.png)
## 特別な感謝
- [pdf-lib](https://pdf-lib.js.org/): PDF生成に使用。
- [fontkit](https://github.com/foliojs/fontkit): フォントレンダリングに使用。
- [PDF.js](https://mozilla.github.io/pdf.js/): PDF表示に使用。
- [React](https://reactjs.org/): UI構築に使用。
- [form-render](https://xrender.fun/form-render): UI構築に使用。
- [antd](https://ant.design/): UI構築に使用。
- [react-moveable](https://daybrush.com/moveable/), [react-selecto](https://github.com/daybrush/selecto), [@scena/react-guides](https://daybrush.com/guides/): デザイナーUIに使用。
- [dnd-kit](https://github.com/clauderic/dnd-kit): デザイナーUIに使用。
- [Lucide](https://lucide.dev/) デザイナーUIとスキーマのアイコンに使用。
これらのライブラリなしではpdfmeを作成することはできませんでした。これらのライブラリの開発者に感謝します。
pdfmeに貢献したい場合は、[開発ガイド](/docs/development-guide)ページをご確認ください。
あなたの貢献をお待ちしています!
## クラウドサービスオプション
pdfmeは強力なオープンソースライブラリですが、一部のユーザーはマネージドソリューションを好む場合があることを理解しています。セットアップやメンテナンスの必要なく、すぐに使える、スケーラブルなPDF生成サービスを探している方には、pdfme Cloudを提供しています。
**[pdfme Cloudを試す - 手間のかからないPDF生成](https://app.pdfme.com?utm_source=website&utm_content=getting-started)**
pdfme Cloudはオープンソースライブラリのすべての機能に加えて、以下を提供します
- インフラ管理なしでスケーラブルなPDF生成
- ホスト型WYSIWYGテンプレートデザイナー
- シンプルなAPI統合
- 自動更新とメンテナンス
\*pdfmeは今後もオープンソースであり続けます。クラウドサービスはマネージドソリューションを好む方向けのオプションサービスです。