ajstarks/deck
GitHub: ajstarks/deck
一个基于 Go 语言的幻灯片生成库,通过 XML 标记语言和百分比布局系统,将演示文稿内容导出为 PDF、PNG、SVG 等多种格式。
Stars: 313 | Forks: 19
# deck:用于幻灯片的 Go package
[][1]
Deck 是一个库,使客户端能够使用标准的标记语言制作可缩放的演示文稿。
客户端将 deck 文件读取到 Deck 结构中,并遍历该结构以进行显示、发布等操作。
客户端可以是交互式的,也可以生成 SVG 或 PDF 等标准格式。
其中还包含一个 REST API,用于列出内容、上传、停止、启动和删除 deck,
生成表格以及播放视频。
[关于 Deck 的 deck](http://speakerdeck.com/ajstarks/deck-a-go-package-for-presentations)
## 元素
* deck:封闭元素
* canvas:描述绘图画布的尺寸,每个 deck 一个
* metadata 元素:title(标题)、creator(创建者)、publisher(发布者)、subject(主题)、description(描述)、date(日期)
* slide:在一个 deck 内,可以有任意数量的 slide,指定 slide 的持续时间、背景和文本颜色。
在每个 slide 内可以有任意数量的:
* text:plain、textblock 或 code
* list:plain、bullet、number、centered
* image:JPEG 或 PNG 图像
* line:直线
* rect:矩形
* ellipse:椭圆
* curve:二次贝塞尔曲线(quadratic Bezier curve)
* arc:椭圆弧
* polygon:填充多边形
* polyline:闭合多段线
## 标记
以下是 XML 格式的 deck 示例:
```
Sample Deck
Deck uses these elements
```
list 和 text 元素具有共同的属性:
```
xp: horizontal percentage
yp: vertical percentage
sp: font size percentage
lp: line spacing percentage
type: "bullet", "number" (list), "block", "code" (text)
align: "left", "middle", "end"
color: SVG names ("maroon"), RGB "rgb(127,0,0)" or hex ("#rrggbb")
font: "sans", "serif", "mono"
opacity: opacity percentage
rotation: (0-360 degrees)
link: url
```
请查看 example 目录以获取 deck 示例。
## 布局
所有布局均按百分比计算,使用原点 (0%, 0%) 位于左下角的坐标系。
x(水平)方向向右递增,y(垂直)方向向上递增。
例如,要将元素放置在画布中间,请指定 xp="50" yp="50"。要将元素放置在
距离顶部三分之一、距离底部三分之一的位置:xp="66.6" yp="33.3"。
文本大小也会根据画布宽度进行缩放。例如,sp="3" 是幻灯片标题的典型大小。
图形元素的尺寸(宽度、高度、描边宽度)也会根据画布宽度进行缩放。
幻灯片的内容会根据指定的画布大小自动缩放
(如果未指定尺寸,客户端应设置合理的默认值)
[![deck 的百分比网格][4]][3]
[![Deck 基于百分比的布局][6]][5]
## 客户端
### 示例客户端
```
package main
import (
"fmt"
"log"
"github.com/ajstarks/deck"
)
func dotext(x, y, size float64, text deck.Text) {
fmt.Println("\tText:", x, y, size, text.Tdata)
}
func dolist(x, y, size float64, list deck.List) {
fmt.Println("\tList:", x, y, size)
for i, l := range list.Li {
fmt.Println("\t\titem", i, l)
}
}
func main() {
presentation, err := deck.Read("deck.xml", 1024, 768) // open the deck
if err != nil {
log.Fatal(err)
}
for slidenumber, slide := range presentation.Slide { // for every slide...
fmt.Println("Processing slide", slidenumber)
for _, t := range slide.Text { // process the text elements
x, y, size := deck.Dimen(presentation.Canvas, t.Xp, t.Yp, t.Sp)
dotext(x, y, size, t)
}
for _, l := range slide.List { // process the list elements
x, y, size := deck.Dimen(presentation.Canvas, l.Xp, l.Yp, l.Sp)
dolist(x, y, size, l)
}
}
}
```
目前有四个客户端:pdfdeck、pngdeck、svgdeck 和 vgdeck。
对于 PDF deck,请安装 pdfdeck:
```
go install github.com/ajstarks/deck/cmd/pdfdeck@latest
```
pdfdeck 会根据输入文件生成对应的 PDF deck:
```
pdfdeck deck.xml
```
生成 deck.pdf
对于 SVG deck,请安装 svgdeck:
```
go install github.com/ajstarks/deck/cmd/svgdeck@latest
```
此命令:
```
svgdeck deck.xml
```
每个 SVG 文件生成一张幻灯片,并且每张幻灯片都会链接到下一张。
对于 png deck,请安装 pngdeck:
```
go install github.com/ajstarks/deck/cmd/pngdeck@latest
```
此命令:
```
pngdeck deck.xml
```
每张幻灯片生成一张图像,命名为类似 deck-00001.png
vgdeck 是一个使用 openvg 库在 Raspberry Pi 上显示演示文稿的程序。
安装:
```
go get github.com/ajstarks/deck/cmd/vgdeck
```
要运行 vgdeck,请在命令行上指定一个或多个文件(以 deck XML 标记),每个文件将依次显示。
```
vgdeck sales.xml program.xml architecture.xml
```
以下是 vgdeck 的命令:
* 下一张幻灯片:+、Ctrl-N、[Return]
* 上一张幻灯片:-、Ctrl-P、[Backspace]
* 第一张幻灯片:^、Ctrl-A
* 最后一张幻灯片:$、Ctrl-E
* 重新加载:r、Ctrl-R
* X 射线:x、Ctrl-X
* 搜索:/、Ctrl-F
* 保存:s、Ctrl-S
* 退出:q
所有命令均为单次按键,立即执行
(只有搜索命令会在您输入搜索文本后等待您按 [Return] 键)
要循环浏览 deck,请反复按 [Return] 键
### DECKFONTS
pdfdeck 和 pngdeck 使用 DECKFONTS 环境变量作为字体文件的位置。为您的字体选择一个目录,例如 $HOME/deckfonts,并将 DECKFONTS 环境变量设置为此目录。请注意,位于 github.com/ajstarks/deckfonts 的存储库包含一组供您使用的字体(Times、Helvetica、Courier、Zapf Dingbats、Charter、Fira、Go、IBM Plex 和 Noto):
```
export DECKFONTS=$HOME/deckfonts
cd $HOME
git clone https://github.com/ajstarks/deckfonts
...
pdfdeck foo.xml # (use helvetica as the default)
pdfdeck -sans NotoSans-Regular -serif NotoSerif-Regular -mono NotoMono-Regular foo.xml # specify fonts
```
或者,您可以手动从 gofpfd 包安装字体:(这些说明假设您已经在 GOPATH 中安装了 gofpdf。)
```
mkdir $HOME/deckfonts # make the DECKFONTS directory
export DECKFONTS=$HOME/deckfonts # you should make this permanent in your shell startup
cp $GOPATH/src/github.com/jung-kurt/gofpdf/font/*.json $DECKFONTS
```
通常,您可以将从任何地方获取的 TrueType 文件放置在您的 DECKFONTS 目录中,然后就可以在 pdfdeck 中使用它们:例如,gofpdf 包包含 DejaVu 字体:
```
cp $GOPATH/src/github.com/jung-kurt/gofpdf/font/DejaVu*.ttf $DECKFONTS
pdfdeck -sans DejaVuSansCondensed foo.xml
```
此外,要使用 Go 字体:
```
cd $HOME
mkdir gofonts
cd gofonts
git clone https://go.googlesource.com/image
cp image/font/gofont/ttfs/*.ttf $DECKFONTS
...
pdfdeck -sans Go-Regular -mono Go-Mono foo.xml
```
您也可以通过命令行选项手动设置字体目录:
```
pdfdeck -fontdir $GOPATH/src/github.com/jung-kurt/gofpdf/font foo.xml
```
## API
`deckd` 命令是一个为幻灯片 deck 提供 API 的服务端程序。
该 API 支持 deck 的启动、停止、列出、上传和删除。响应以 JSON 格式编码。
安装:
```
go get github.com/ajstarks/deck/cmd/deckd
```
命令行选项用于控制工作目录和 address:port
-port Address:port (默认: localhost:1958)
-dir [name] 工作目录 (默认: ".")
-maxupload [bytes] 上传限制
GET / 列出 API
GET /deck 以 JSON 格式列出有关内容的信息,(文件名、metadata(幻灯片数量或图像尺寸)、修改时间)
GET /deck?filter=[type] 按类型 (std, deck, image, video) 过滤内容列表
POST /deck/file.xml?cmd=[duration] 启动一个 deck;deck、持续时间和进程 ID 将以 JSON 格式返回
POST /deck/file.xml?slide=[number] 从指定的幻灯片开始
POST /deck?cmd=stop 停止正在运行的 deck
DELETE /deck/file.xml 删除 deck
POST /table 包含制表符分隔列表的内容,创建一个带有格式化表格的幻灯片,Deck: header 指定生成的 deck 文件
POST /table/?textsize=[size] -- 指定生成表格的文本大小
POST /media 播放 Media: header 中指定的媒体文件
`deck` 命令是 deck Web API 的命令行界面。像这样安装它:
```
go get github.com/ajstarks/deck/cmd/deck
$ deck
Usage:
List: deck list [image|deck|video]
Play: deck play file [duration] [start-slide]
Stop: deck stop
Upload: deck upload files...
Remove: deck remove files...
Video: deck video file
Table: deck table file [textsize]
```
该命令的 shell 脚本版本位于 `deck.sh` 中。此版本使用 `gttp` (go get github.com/dgryski/gttp) 发出 HTTP 请求。
标签:EVTX分析, Go, PDF, RESTful API, Ruby工具, SVG, 图形渲染, 提示词优化, 日志审计, 演示文稿