golang md文件转为PDF文件,有没有好用的插件推荐呀?

golang实现后端读取本地文件夹中的md文件后转为PDF文件。md文件图片代码都需要正常呈现处理。

回答不易,求求您采纳点赞哦 感激不尽

可以使用golang的blackfriday和wkhtmltopdf库来实现将Markdown文件转换为PDF文件的功能。blackfriday是一个流行的Markdown解析器,支持将Markdown文本解析为HTML代码。wkhtmltopdf则是一个将HTML文件转换为PDF文件的命令行工具,可以通过golang的os/exec包来执行该命令行工具。

以下是一个示例代码,使用blackfriday将Markdown文本解析为HTML代码,并使用wkhtmltopdf将HTML文件转换为PDF文件:

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "os"
    "os/exec"
    "path/filepath"
    "strings"

    "github.com/russross/blackfriday"
)

func main() {
    // 读取指定文件夹中的所有Markdown文件
    mdFiles, err := filepath.Glob("/path/to/folder/*.md")
    if err != nil {
        fmt.Println(err)
        return
    }

    for _, mdFile := range mdFiles {
        // 读取Markdown文件内容
        mdContent, err := ioutil.ReadFile(mdFile)
        if err != nil {
            fmt.Println(err)
            continue
        }

        // 将Markdown内容解析为HTML代码
        htmlContent := blackfriday.Run(mdContent)

        // 生成HTML文件
        htmlFileName := strings.TrimSuffix(mdFile, filepath.Ext(mdFile)) + ".html"
        err = ioutil.WriteFile(htmlFileName, htmlContent, 0644)
        if err != nil {
            fmt.Println(err)
            continue
        }

        // 将HTML文件转换为PDF文件
        pdfFileName := strings.TrimSuffix(htmlFileName, ".html") + ".pdf"
        cmd := exec.Command("wkhtmltopdf", htmlFileName, pdfFileName)
        var out bytes.Buffer
        cmd.Stdout = &out
        err = cmd.Run()
        if err != nil {
            fmt.Println(err)
            continue
        }
        fmt.Println("PDF file generated:", pdfFileName)

        // 删除生成的HTML文件
        err = os.Remove(htmlFileName)
        if err != nil {
            fmt.Println(err)
            continue
        }
    }
}


该示例代码遍历指定文件夹中的所有Markdown文件,将Markdown文件解析为HTML代码,并生成对应的HTML文件。然后,使用wkhtmltopdf将HTML文件转换为PDF文件,并删除生成的HTML文件。需要注意的是,在将Markdown文件解析为HTML代码时,如果Markdown文件中包含图片,blackfriday会将图片的路径解析为相对路径,需要将图片路径转换为绝对路径,否则在转换HTML文件时会出现图片无法显示的问题。可以使用path/filepath包中的Abs函数将相对路径转换为绝对路径。

有几个Go语言的库可以将Markdown文件转换为PDF文件,其中比较常用的是github.com/jung-kurt/gofpdf。以下是一个简单的示例代码,演示如何使用该库将Markdown文件转换为PDF文件:


package main

import (
    "bufio"
    "bytes"
    "fmt"
    "io/ioutil"
    "os"
    "regexp"
    "strings"

    "github.com/jung-kurt/gofpdf"
    "github.com/russross/blackfriday"
)

// 正则表达式用于匹配Markdown文件中的图片
var imgRegexp = regexp.MustCompile(`!\[.*?\]\((.*?)\)`)

func main() {
    // 读取Markdown文件的内容
    content, err := ioutil.ReadFile("example.md")
    if err != nil {
        fmt.Println("Error reading file:", err)
        return
    }

    // 使用blackfriday库将Markdown内容转换为HTML
    html := blackfriday.Run(content)

    // 创建PDF文档对象
    pdf := gofpdf.New("P", "mm", "A4", "")

    // 添加一页空白页面
    pdf.AddPage()

    // 将HTML内容添加到PDF文档中
    // 注意,这里需要对HTML中的图片进行处理
    processImages(pdf, string(html))

    // 保存PDF文件
    err = pdf.OutputFileAndClose("example.pdf")
    if err != nil {
        fmt.Println("Error saving file:", err)
        return
    }

    fmt.Println("Conversion complete.")
}

func processImages(pdf *gofpdf.Fpdf, html string) {
    // 将HTML中的图片提取出来
    matches := imgRegexp.FindAllStringSubmatch(html, -1)

    // 逐个处理图片
    for _, match := range matches {
        // 读取图片文件
        imageFile, err := os.Open(match[1])
        if err != nil {
            fmt.Println("Error reading image file:", err)
            continue
        }
        defer imageFile.Close()

        // 将图片添加到PDF文档中
        image, _, err := image.Decode(imageFile)
        if err != nil {
            fmt.Println("Error decoding image:", err)
            continue
        }
        pdf.ImageFromGoImage(image, 10, 10, 0, 0, false, "", 0, "")
    }

    // 将HTML中的图片替换为占位符
    html = imgRegexp.ReplaceAllString(html, "")
    html = strings.TrimSpace(html)

    // 将HTML内容添加到PDF文档中
    pdf.SetFont("Arial", "", 12)
    pdf.WriteHtml([]byte(html))
}

在这个示例代码中,我们首先读取Markdown文件的内容,然后使用blackfriday库将Markdown内容转换为HTML。接下来,我们创建一个PDF文档对象,并将HTML内容添加到PDF文档中。在将HTML内容添加到PDF文档之前,我们需要将HTML中的图片提取出来,并逐个添加到PDF文档中。由于gofpdf库不支持直接将图片添加到PDF文档中,我们需要先将图片读入内存,然后将其转换为Go语言中的image.Image对象,最后使用`pdf.Image

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^