golang解图记

26 阅读3分钟

岁在乙巳,秋深霜降,余方偃仰于案牍之间,神游八方,心驰云外,谓之"摸鱼"也。忽闻内子遥呼:"夫君!吾有 Word 一卷,其中图影纷纭,欲析而出之,奈何手拙,无计可施。"

余莞尔曰:"此易耳,何足挂齿!"遂振衣而起,执 GoLang 为笔,以四十行代码为策,顷刻成章。

然初稿虽就,意犹未足。思其文质未协,辞采稍疏,乃重加润色,务求清雅有致,不堕匠气。今录其法如下:

package main

import (
	"fmt"
	"log"
	"os"
	"path/filepath"

	"github.com/unidoc/unioffice/document"
)

func main() {
	docPath := "./XL-36-001-20251030-189790.docx" // 此乃藏图之椟
	outDir := "./extracted_images"                   // 此乃安图之所

	if err := os.MkdirAll(outDir, os.ModePerm); err != nil {
		log.Fatalf("筑室未成,愧对诸图:%v", err)
	}

	doc, err := document.Open(docPath)
	if err != nil {
		log.Fatalf("启椟不得,匣锁甚严:%v", err)
	}
	defer doc.Close()

	for i, img := range doc.Images {
		name := filepath.Join(outDir, fmt.Sprintf("image_%03d.png", i+1))
		if err := img.WriteFile(name); err != nil {
			log.Printf("第%d图逸散于虚空,惜哉:%v", i+1, err)
			continue
		}
		fmt.Printf("第%d图已安厝于 %s,安然无恙。\n", i+1, name)
	}
}

夫图者,形之精也;文者,意之舟也。今以数行简码,析千图于一瞬,非炫技也,实乃应内子之请,成闺中之托。

昔人云:"君子使物,不为物使。"今借 GoLang 之力,化繁为简,举重若轻,亦可谓得其道矣。

或问:"何以不用 Python?"

余笑曰:"Python 固佳,然 GoLang 如快马轻裘,一行抵十行,且编译如风,部署如电,岂不快哉?"

是日也,秋阳煦暖,代码清朗,妻得图而喜,余得闲而乐。

遂记之,以志斯事,并贻同好一笑。

—— 乙巳年九月晦日,于摸鱼斋

往期部分文章列表