週末にpptxファイルが生成できるスライド作成ツールのプロトタイプを作りました。
スライドエディタで作成したスライドをPowerPoint形式で出力できるようにした。
— もっと@Gatsby本を改訂するぞ (@mottox2) June 7, 2020
まだまだサイズやアスペクト比を一致させてない雑な作りだけど、動いたときはかなり嬉しかった。
ただし、自分はKeynote派なのでPowerPointはあまり使う機会が… pic.twitter.com/2yec28lTnB
ご覧の通り画面に対応したpptxファイルがダウンロードされていることがわかると思います。
このpptxファイル生成にはVercelのServerless Functionsを利用しており、jsx-presentationというライブラリを利用しています。
実際には次のようなコードで動作しています。(少々泥臭い感じなのは見逃してください。)
import React from "react";
import { NextApiRequest, NextApiResponse } from 'next'
import { generate, Presentation, Slide, Text, Shape } from "jsx-presentation";
import { Block } from '../../types/blocks'
export default async (req: NextApiRequest, res: NextApiResponse) => {
const blocks = req.body as Block[]
const content = await generatePptx(blocks)
res.statusCode = 200
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.presentationm')
res.send(content)
}
const scale = 0.3;
const generatePptx = (blocks: Block[]) => {
return generate(
<Presentation>
<Slide>
{blocks.map((block) => {
if (block.type === "text")
return (
<Text
fontSize={Math.round(block.fontSize * scale * 2)}
color="333333"
textAlign="left"
position="absolute"
width={100}
top={Math.round(block.top * scale)}
left={Math.round(block.left * scale)}
key={block.id}
>
{block.text}
</Text>
);
else if (block.type === "rect")
return (
<Shape
fill={block.backgroundColor.replace("#", "")}
position="absolute"
top={Math.round(block.top * scale)}
left={Math.round(block.left * scale)}
width={Math.round(block.width * scale)}
height={Math.round(block.height * scale)}
key={block.id}
/>
);
else throw "Invalid Block Exception";
})}
</Slide>
</Presentation>,
{ skipGenerate: true }
);
};
JSXで記述した結果がpptxに反映されています。jsx-presentationからインポートしたコンポーネントで記述しています。
つまりjsx-presentationを使えば、コード上からパワーポイントのプレゼンテーションファイルを生成することができます。そこで簡単に使い方を紹介します。
一番簡単な構成は次のようなコードです。yarn add jsx-presentation
でインストールして次のようなindex.tsx
を作成しましょう。
import React from "react";
import { generate, Presentation, Slide, Text } from "jsx-presentation";
generate(
<Presentation>
<Slide>
<Text fontSize={16} color='333333' textAlign='center' />
</Slide>
</Presentation>
);
覚えることとしては次の3つです。
これらのルールを守りながら上記のファイルを実行しましょう。babelやtscなど実行方法は問いません。個人的にはts-nodeでやるのが楽だと思っています。
ただ、ドキュメントもほとんどない状況なのでちゃんとやっていくのは難しいでしょう。そこで利用するのがjsx-presentation-starterです。
このリポジトリには、ある程度コンポーネントが網羅された状況のファイル郡が用意されているのでそこから必要な部分だけを編集していく形になります。
ディレクトリ構造も次のようになっており、ある程度の肥大化を想定した形になっています。
* index.tsx
* components/
* PageHeader.tsx
* slides/
* Slide1.tsx
* Slide2.tsx
ぜひ、Reactの記法でスライドを書く体験をしてみてください。
ここ最近、Web技術を利用した画像生成に興味があります。本記事では、日本語における表現の一種である縦書きに焦点を当て、Web技術を使った縦書きを含む画像生成方法についての調査をまとめました。 > 現
追記(2022/12/29): 問い合わせに対応する窓口をTwitterに統一したいので、フォームページは削除しました。 当ブログは静的サイトホスティングサービスのNetlifyでホスティングされ
毎年10月に開催されるHacktoberfestに参加しました。このイベントはOSSへの貢献を行い、期間中に規定数(4つ)の貢献を行った人に特典がプレゼントされるものになっています。 自分はドキュメ