vsdx-go

module
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 26, 2026 License: BSD-3-Clause

README

vsdx-go

Go Reference Go Report Card CI

A Go library for reading, editing, writing, and rendering Microsoft Visio (.vsdx) files — no Visio or Office installation required.

Features

  • Read & write .vsdx / .vsdm files: pages, shapes, text, connectors, masters.
  • Edit position, size, rotation, text, character/paragraph formatting, line and fill styles, hyperlinks, connection points, layers, user-defined cells, and protection locks.
  • Shape model with master-inheritance resolution for cells, text, geometry, and data properties.
  • Per-shape SVG rendering: geometry (incl. NURBS → Bézier), arrows, line patterns, gradients, drop shadows, soft edges, transforms (rotation/flip), and nested groups.
  • Authoring: create/duplicate masters, read .vssx stencils, document themes/variants and stylesheets.
  • Extras: a 175+ function formula evaluator, A* connector auto-routing, Jinja-style text templating, schema validation, and file diffing.

Installation

go get github.com/wijnberg-net/vsdx-go/vsdx

Requires Go 1.21 or later. The only dependency is github.com/beevik/etree.

Quick start

package main

import (
	"fmt"
	"log"

	"github.com/wijnberg-net/vsdx-go/vsdx"
)

func main() {
	vis, err := vsdx.Open("diagram.vsdx")
	if err != nil {
		log.Fatal(err)
	}
	defer vis.Close()

	// Inspect: print every shape on the first page.
	page := vis.GetPage(0)
	for _, shape := range page.AllShapes() {
		fmt.Printf("shape %s: %q\n", shape.ID, shape.Text())
	}

	// Edit: find a shape, change its text, position, and fill.
	if s := page.FindShapeByText("Hello"); s != nil {
		s.SetText("Updated")
		s.SetX(3.0)
		s.SetFillColor("#ff0000")
	}

	// Write the result to a new file.
	if err := vis.SaveVsdx("output.vsdx"); err != nil {
		log.Fatal(err)
	}
}

Rendering to SVG

Rendering is done per shape with ShapeToSVG, which returns a *SVGResult whose SVG field (a []byte) holds the markup. Options are functional: WithSize, WithPrecision, and WithBrandColor.

shapes := vis.GetPage(0).AllShapes()

res, err := vsdx.ShapeToSVG(shapes[0],
	vsdx.WithSize(200, 150),
	vsdx.WithPrecision(2),
)
if err != nil {
	log.Fatal(err)
}
fmt.Println(string(res.SVG)) // the SVG markup

A whole master can be rendered with MasterToSVG. To assemble a full page, render its shapes and place each result.

Templating

Shape and page text may contain Jinja-style directives that RenderTemplate fills in from a context map:

vis.RenderTemplate(map[string]any{
	"name":      "Production",
	"count":     42,
	"show_info": true,
	"items":     []any{"Server A", "Server B"},
})
Directive Description
{{key}} Replace with a context value (supports arithmetic, e.g. {{x*y}})
{% for item in list %} Duplicate the shape for each item
{% showif condition %} Show or hide a shape or page (not, >, <, ==)
{% set self.x = expr %} Set a shape property from an expression

API reference

The complete, always-current API — every type, method, and runnable example — is on pkg.go.dev.

A few entry points to get oriented:

  • Open/save: Open, OpenBytes, (*VisioFile).Close, (*VisioFile).SaveVsdx
  • Pages: (*VisioFile).GetPage, GetPageByName, GetPageNames, AddPage, CopyPage
  • Find shapes: (*Page).AllShapes, ChildShapes, FindShapeByID, FindShapeByText, FindShapesByText
  • Read shapes: (*Shape).Text, X/Y, Width/Height, Angle, FillColor, LineColor, CellValue
  • Edit shapes: (*Shape).SetText, SetX/SetY, SetWidth/SetHeight, SetFillColor, SetLineColor, Move, FindReplace
  • Geometry: (*Shape).AddGeometry, AddGeometryRect, and (*Geometry).AddMoveTo/AddLineTo/AddArcTo
  • Render: ShapeToSVG, MasterToSVG
  • Templating: (*VisioFile).RenderTemplate

Runnable examples live in examples/ and as Go examples on pkg.go.dev.

How it works

.vsdx (ZIP) → in-memory map[string][]byte → etree XML parse
  → VisioFile.Pages   (from visio/pages/…)
  → Page → Shapes      (from <Shapes> elements)
  → Shape → Cells, Geometry, DataProperties (from child elements)

Shapes can inherit from masters; a property lookup falls back to the master shape when a value is not set locally. Saving serialises the modified XML back into a new ZIP archive.

VSDX file format

A .vsdx file is a ZIP archive of XML parts:

[Content_Types].xml        content-type mappings
docProps/app.xml           document properties
visio/document.xml         styles and stylesheets
visio/pages/pages.xml      page definitions
visio/pages/page1.xml      page content (shapes, connects)
visio/masters/…            master shape definitions

XML namespace: http://schemas.microsoft.com/office/visio/2012/main.

Running tests

go test ./vsdx/...
go test ./vsdx/... -cover    # with coverage

Test fixtures are .vsdx files in tests/; golden SVGs for render tests live in testdata/golden/.

Contributing

Contributions are welcome — see CONTRIBUTING.md.

License

BSD 3-Clause — see LICENSE.

Acknowledgements

vsdx-go was originally derived from the BSD-licensed vsdx Python library by Dave Howard, and has since been substantially rewritten and extended for Go.

Author

Michel Wijnberg

Trademarks

Microsoft and Visio are trademarks of Microsoft Corporation. vsdx-go is an independent project and is not affiliated with, sponsored by, or endorsed by Microsoft.

Directories

Path Synopsis
examples
inspect command
Command inspect prints the pages and text-bearing shapes of a .vsdx file.
Command inspect prints the pages and text-bearing shapes of a .vsdx file.
Package vsdx provides reading, editing, writing, and SVG rendering of Microsoft Visio (.vsdx) files.
Package vsdx provides reading, editing, writing, and SVG rendering of Microsoft Visio (.vsdx) files.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL