ajstarks/deck

GitHub: ajstarks/deck

一个基于 Go 语言的幻灯片生成库,通过 XML 标记语言和百分比布局系统,将演示文稿内容导出为 PDF、PNG、SVG 等多种格式。

Stars: 313 | Forks: 19

# deck:用于幻灯片的 Go package [![Deck 介绍](https://farm4.staticflickr.com/3820/13415195635_64da6a7a90.jpg)][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
  • canvas
  • slide
  • text
  • list
  • image
  • line
  • rect
  • ellipse
  • curve
  • arc
  • ``` 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, 图形渲染, 提示词优化, 日志审计, 演示文稿