jung-kurt / gofpdf

A PDF document generator with high level support for text, drawing and images
http://godoc.org/github.com/jung-kurt/gofpdf
MIT License
4.33k stars 782 forks source link

Print a file if it has less than 8 pages in Windows #328

Open MarErm27 opened 4 years ago

MarErm27 commented 4 years ago

Hello everyone! This is my first question at Github! My task is to check how many pages contain a pdf document and if it has less than 8 pages print it silently. I'm using this imports

    "github.com/jung-kurt/gofpdf"
    "github.com/jung-kurt/gofpdf/contrib/gofpdi"

and code below



                           var err error

                pdf := gofpdf.New("P", "mm", "A4", "")

                pdfBytes, err := ioutil.ReadFile(DocName)
                if err != nil {
                    panic(err)
                }
                rs := io.ReadSeeker(bytes.NewReader(pdfBytes))
                // Import in-memory PDF stream with gofpdi free pdf document importer
                imp := gofpdi.NewImporter()

                // import first page and determine page sizes
                tpl := imp.ImportPageFromStream(pdf, &rs, 1, "/MediaBox")
                pageSizes := imp.GetPageSizes()
                nrPages := len(imp.GetPageSizes())

                // add all pages from template pdf
                for i := 1; i <= nrPages; i++ {
                    pdf.AddPage()
                    if i > 1 {
                        tpl = imp.ImportPageFromStream(pdf, &rs, i, "/MediaBox")
                    }
                    imp.UseImportedTemplate(pdf, tpl, 0, 0, pageSizes[i]["/MediaBox"]["w"], pageSizes[i]["/MediaBox"]["h"])
                }
                pdf.OutputFileAndClose(DocName + "test")

                pages := pdf.PageCount()
                fmt.Println(pages)

nrPages and pages is a places where I'm trying to get number of pages. And it's not always gives me proper number, but I really need it, sometimes I'm receiving files that contain up to 800 pages and I don't want to print them. I'm new at go, using it only for a week and maybe I just did something wrong. Here is a two examples of files, one returns proper number of pages the other one is giving a wrong number. The result files is those that I'm saving by trhis:
`pdf.OutputFileAndClose(DocName + "test")`
[Incorrect number of pages.pdf](https://github.com/jung-kurt/gofpdf/files/3762847/Incorrect.number.of.pages.pdf)
[Incorrect result.pdf](https://github.com/jung-kurt/gofpdf/files/3762848/Incorrect.result.pdf)
[Proper number of pages.pdf](https://github.com/jung-kurt/gofpdf/files/3762849/Proper.number.of.pages.pdf)
[Proper result (2).pdf](https://github.com/jung-kurt/gofpdf/files/3762850/Proper.result.2.pdf)

Next step is to print it. So I've found solution with cmd and Acrobat Reader DC.  It's here "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" /t  D:\reports\print.pdf"  "HP LaserJet 1018" "oem34.inf" "USB001".

Or maybe I will use a browser in kiosk-printing regime and browser extension that will do window.print().

So far I haven't found any better solution, but I'm going to dig it somehow. Thank you for your attencion. 
jung-kurt commented 4 years ago

My guess is that nrPages := len(imp.GetPageSizes()) is for some reason not returning the number of pages. (Any comment, @phpdave11?) I think pdf.PageCount() will always return the number of times pdf.AddPage() is called, and in this case, it will be limited to the value of nrPages.

Small hint unrelated to the issue: os.Open() returns an os.File which implements the io.ReadSeeker interface. You could use this in your call to imp.ImportPageFromStream() instead of reading all bytes into one large array and then streaming them out with a bytes.Reader.

MarErm27 commented 4 years ago

I came to this code

func isValueInList(value string, list []string) int {
    for i, v := range list {
        if strings.Contains(v, value) {
            return i
        }
    }
    return -1
}
                        out, err := exec.Command("pdfinfo.exe", DocName).Output()
                if err != nil {
                    log.Fatal(err)
                }
                fmt.Printf("The date is %s\n", out)

                str := string(out)
                s := strings.Split(str, "\n")
                x := "Pages"
                indexOfPages := isValueInList(x, s)
                fmt.Println(indexOfPages)
                if indexOfPages != -1 {
                    pages := strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(s[indexOfPages], "Pages:", ""), " ", ""), "\r", "")
                    i, err := strconv.Atoi(pages)
                    if err != nil {
                        fmt.Println(err)
                    }
                    fmt.Println(i)
                    fmt.Println(i < 8)
                }

pdfinfo.exe is from this open source project http://www.xpdfreader.com/download.html Thank you very much