我在Go上的函数每次保存到pdf文件后使用fpdf双页分辨率

rsaldnfx  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(154)

我不是一个有经验的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
}

我在死胡同里,有人能帮帮我吗?
最好的问候阿图尔

2hh7jdfx

2hh7jdfx1#

对不起,我找到了问题的根源,这是所有关于单位。在我的代码中,它是pdf := gofpdf.New("P", "mm", "A4", ""),我需要做的就是把它改为pdf := gofpdf.New("P", "pt", "A4", ""),一切都运行得很好。

相关问题