如何通過Go語言html生成PDF?

語言: CN / TW / HK

之前我們在某景區開發了一個行人監測系統,系統上線後經過我們不斷的調整和優化,一直保持了穩定的執行,現在該景區需要製作一個網站,網站裡可以檢視一天中的每個時間點統計的人數,並生成PDF,供下載檢視。由於在服務端我們使用的是Go語言製作,所以這裡我們用的一個go-wkhtmltopdf來實現該功能。

生成第一個PDF可以是想要的格式(沒有問題):

第二次生成PDF就會出現下圖錯誤的情況:

在檢視控制檯應用出現如下錯誤提示:

生成PDF的程式碼:

func WritePDFFile(htmlPath, pdfPath string) error {
   if err := pdf.Init(); err != nil {
      return err
   }
   pdf.Destroy()

   // Create object from URL.
   object2, err := pdf.NewObject(htmlPath)
   if err != nil {
      return err
   }

   // Create converter.
   converter, err := pdf.NewConverter()
   if err != nil {
      return err
   }
   defer converter.Destroy()

   // Add created objects to the converter.
   converter.Add(object2)

   // Set converter options.
   converter.Title = "人數統計"
   converter.PaperSize = pdf.A4
   converter.Orientation = pdf.Portrait
   converter.MarginTop = "1cm"
   converter.MarginBottom = "1cm"
   converter.MarginLeft = "10mm"
   converter.MarginRight = "10mm"

   // Convert objects and save the output PDF document.
   outFile, err := os.Create(pdfPath)
   if err != nil {
      return err
   }
   defer outFile.Close()

   if err := converter.Run(outFile); err != nil {
      return err
   }
   return nil
}

上面的程式碼是在該函式初始化PDF例項,並將該函式銷燬。呼叫下載PDF介面時,第一次呼叫沒有錯誤,但是第二次呼叫會出現不在主執行緒中的問題,所以需要將PDF初始化例項先例項化在主執行緒中,即可解決。

解決辦法有二個可以生成PDF:

1、在主函式初始化例項。

2、使用exe命令直接轉換PDF,這種也是最簡單的方法。