我不是一个有经验的Go开发人员,我通常会为工作任务自动化做一些小微服务。所以我有一个任务来更新现有的PDF文件,添加到它的QR码和旁边的一些意见。文件和评论将来自HTML表单(不,我使用 Postman 测试)。这花了我一些时间,但最后我弄清楚如何获得文件和字符串,生成街机插入到PDF和保存它。在这里我遇到了一个问题,每次当我保存文件到pdf它翻了一番页面分辨率。我在调试过程中查看页面大小参数,直到函数结束时,保存发生,它等于导入文件的原始值,然后保存,它翻了一番。
因此,如果您尝试将QR添加到生成的文件中,则会更小,下次甚至更小,并且它将以这种方式运行直到无穷大。我需要的可能性,添加几个QR码一步一步(由不同的人),以相同的格式相同的文件。
我尝试使用固定的页面大小它没有帮助,尝试添加页面没有格式化它生成非常奇怪的事情。
我使用Go 1.20.2版来处理我使用的PDF
"github.com/phpdave11/gofpdf"
"github.com/phpdave11/gofpdf/contrib/gofpdi"
你可以在below中找到代码本身
// Handling of post requests in order update pdf file
func (a *App) qrAddToFile(w http.ResponseWriter, r *http.Request) {
var png []byte //byte array for qrcode in png
// here we get data from form whic is string for qr generation and pdf file where this qr need to be inserted
r.ParseMultipartForm(4048)
qrstring := r.FormValue("qrstring")
png, err := qrcode.Encode(qrstring, qrcode.Medium, 256) //decode string into qr png image
pngfile := savePngToFile(png) //save image to file
file, fileHeader, err := r.FormFile("qrfile") //get pdf file from post request
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
defer file.Close()
// Save pdf file under unique name
tmpfilename := fmt.Sprintf("./%d%s", time.Now().UnixNano(), fileHeader.Filename)
dst, err := os.Create(tmpfilename)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer dst.Close()
_, err = io.Copy(dst, file)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// start import pdf as a template
imp := gofpdi.NewImporter()
pdf := gofpdf.New("P", "mm", "A4", "")
rs, _ := getTemplatePdf(tmpfilename)
tpl := imp.ImportPageFromStream(pdf, &rs, 1, "/MediaBox")
pageSizes := imp.GetPageSizes()
nrPages := len(imp.GetPageSizes())
var sizeType gofpdf.SizeType
for i := 1; i <= nrPages; i++ {
tpl = imp.ImportPageFromStream(pdf, &rs, i, "/MediaBox")
sizeType.Wd = pageSizes[i]["/MediaBox"]["w"]
sizeType.Ht = pageSizes[i]["/MediaBox"]["h"]
pdf.AddPageFormat("P", sizeType)
imp.UseImportedTemplate(pdf, tpl, 0, 0, sizeType.Wd, sizeType.Ht)
}
// import all pages from exsisting file
pdf.AddPageFormat("P", sizeType) // add new page same format as previous
// add qrcode on page
rdr := bytes.NewReader(png)
_ = pdf.RegisterImageOptionsReader(pngfile, gofpdf.ImageOptions{ImageType: "png", ReadDpi: true}, rdr)
pdf.Image(pngfile, 10, pdf.GetY()+5, 200, 200, false, "", 0, "")
// add some comments on left side of qr code
tr := pdf.UnicodeTranslatorFromDescriptor("cp1251")
pdf.AddFont("Helvetica", "", "helvetica_1251.json")
pdf.SetFont("Helvetica", "", 27)
pdf.SetXY(220, 10)
pdf.SetCellMargin(2)
pdf.MultiCell(370, 12, tr(qrstring), "1", "", false)
err = pdf.Error()
checkErr(err)
err = pdf.OutputFileAndClose("QR.pdf") // save file
checkErr(err)
}
func getTemplatePdf(fname string) (io.ReadSeeker, error) {
file, err := os.Open(fname) // For read access.
if err != nil {
log.Fatal(err)
}
readSeek := io.ReadSeeker(file)
return readSeek, nil
}
我在死胡同里,有人能帮帮我吗?
最好的问候阿图尔
1条答案
按热度按时间2hh7jdfx1#
对不起,我找到了问题的根源,这是所有关于单位。在我的代码中,它是
pdf := gofpdf.New("P", "mm", "A4", "")
,我需要做的就是把它改为pdf := gofpdf.New("P", "pt", "A4", "")
,一切都运行得很好。