DocBaseから記事をAPIで取得してPDFに変換できるライブラリを作ってみた。

## 概要

node-docbase-sdk使って、DocBaseから記事をAPIで取得してPDFに変換できるライブラリ[docbase-pdf](https://www.npmjs.com/package/docbase-pdf)を作成し、オープンソースとして公開したので記事にしました。

`node-docbase-sdk`については[こちら](https://qiita.com/ffggss/items/e8ac783991c8724a12e0)を参照してください。

## 出力したPDFのサンプル
以下、`DocBase記事のMarkdown`と`出力したPDF`のサンプルです。

- [Markdown(元記事)](https://yukifujisawa.github.io/docbase-pdf/sample.md)
- [PDF(出力した記事)](https://yukifujisawa.github.io/docbase-pdf/347796_DOCBASE_API_TEST.pdf)

## 公開したライブラリ(npm)

https://www.npmjs.com/package/docbase-pdf

## インストール方法

```bash
$ npm install docbase-pdf --save
```
## 実装について(TypeScript)

### DocBasePdfオブジェクト

- `DocBasePdf`オブジェクトを使ってをDocBaseから記事を取得し、PDFを出力します
- `const docBasePdf: DocBasePdf = new DocBasePdf(DOC_BASE_API_TOKEN, TEAM_NAME);`で`DocBasePdf`オブジェクトを準備してください。
- `DOC_BASE_API_TOKEN`には、DocBaseのアクセストークンを設定してください。アクセスートークンの取得方法は、以下、公式マニュアルを参照してください。
  - [アクセストークンについて](https://help.docbase.io/posts/45703#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3)
- `process.env.DOC_BASE_API_TOKEN`を取得するには、コマンド実行時に環境変数として`DOC_BASE_API_TOKEN`を設定してください。
    - コマンド実行例: ```$ DOC_BASE_API_TOKEN=*** node .```
- `TEAM_NAME`は、チームドメインを指定してください
    - 例えば、`https://wywy.docbase.io`というURLでDocBaseを利用している場合、`wywy`がチームドメインです。

```typescript:DocBasePdfオブジェクト
// An access token
const DOC_BASE_API_TOKEN = process.env.DOC_BASE_API_TOKEN;
const TEAM_NAME = 'TEAM_NAME';

const docBasePdf: DocBasePdf = new DocBasePdf(DOC_BASE_API_TOKEN, TEAM_NAME);
```

## サンプルコード(TypeScript)

下記、サンプルコードを実行すると、`指定した記事IDのPDF`と`検索キーワードに合致したPDF`が`docsディレクトリ`に出力されます。

```typescript
import { DocBasePdf } from './DocBasePdf';
import { MemoCondition } from 'node-docbase-sdk/lib/conditions/MemoCondition';

// Get DocBaseAPI Token from cli.
// ex.
//   $ DOC_BASE_API_TOKEN=<DOC_BASE_API_TOKEN> node .
const DOC_BASE_API_TOKEN = process.env.DOC_BASE_API_TOKEN;
const TEAM_NAME = 'TEAM_NAME';

// クライアント生成
const docBasePdf: DocBasePdf = new DocBasePdf(DOC_BASE_API_TOKEN, TEAM_NAME);

// メモの検索キーワード
const KEYWORD = 'DOCBASE_API_TEST';

// PDF出力先ディレクトリ
const outputPath = 'docs';

// 取得するメモID
// https://${TEAM_NAME}.docbase.io/posts/${memoId}
const memoId = 347796;

async function main() {

  // メモIDを指定してPDFを取得します。
  await docBasePdf.getByMemoId(memoId, outputPath);

  // 検索条件を指定してPDFを取得します。
  const condition: MemoCondition = <MemoCondition>{};
  condition.q = KEYWORD;
  await docBasePdf.getByCondition(condition, outputPath);
}

// == Main ==
main().catch((error) => {
  console.log(error);
});
```

## サンプルプロジェクト

GitHubにサンプルプロジェクト作成しておきました。上記コードをすぐに検証できるかと思うので、よければご利用ください。

https://github.com/YukiFujisawa/docbase-pdf-sample

## 参考記事

- [DocBase APIドキュメント](https://help.docbase.io/posts/45703)
- [MarkdownをPDFに変換する方法](https://qiita.com/ledsun/items/08f411f6a709e1ccecd4)
- [マークダウンからPDFを作るならPandocよりmarkdown-pdfっすね](http://m0t0k1x2.tumblr.com/post/128637275424/%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3%E3%81%8B%E3%82%89pdf%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AA%E3%82%89pandoc%E3%82%88%E3%82%8Amarkdown-pdf%E3%81%A3%E3%81%99%E3%81%AD)
- [TypeScript対応のDocBase APIクライアントをnpmで公開してみた](https://qiita.com/ffggss/items/e8387d69d39d90e1bf45)
- [node-markdown2pdf](https://github.com/tea3/node-markdown2pdf)