Converting html to pdf is not in correct format using chromeDp golang

159 Views Asked by At

I'm using ChromeDp package of golang,for capturing html from url, in which i have dynamic content which is being rendered from api, and then converting it into a pdf,the html which is being captured is correct but the pdf which is being generated is not in proper format, please have a look on the code which is being used for it

func main() {

    t1 := time.Now()
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    url := "url_from_where_you want to capture html"

    var dataHTML string

    if err := chromedp.Run(ctx,
        chromedp.Navigate(url),
        chromedp.WaitVisible("#root", chromedp.ByQuery),
    ); err != nil {
        log.Fatal(err)
    }
    fmt.Println("Page loaded successfully")

    // Sleep for a brief period to ensure the data rendering is complete (adjust timing as needed)
    time.Sleep(2 * time.Second)

    // Capture the HTML content of the element containing the rendered API data
    if err := chromedp.Run(ctx,
        chromedp.OuterHTML("#root", &dataHTML, chromedp.NodeVisible),
    ); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Captured HTML content", dataHTML)

    CreatePdfInBytes(ctx, dataHTML)
    
    t2 := time.Now()
    fmt.Println(t2.Sub(t1))
}

func CreatePdfInBytes(ctx context.Context, html string){
    var wg sync.WaitGroup
    var pdfBuf []byte

    navigate := chromedp.Navigate("about:blank")

    eventLoader := chromedp.ActionFunc(func(ctx context.Context) error {
        loaderctx, cancel := context.WithCancel(ctx)
        chromedp.ListenTarget(loaderctx, func(event interface{}) {
            if _, ok := event.(*page.EventLoadEventFired); ok {
                wg.Done()
                cancel()
            }
        })
        return nil
    })

    setDocContent := chromedp.ActionFunc(func(ctx context.Context) error {
        frameTree, err := page.GetFrameTree().Do(ctx)
        if err != nil {
            return err
        }
        return page.SetDocumentContent(frameTree.Frame.ID, html).Do(ctx)

    })

    loaderWg := chromedp.ActionFunc(func(ctx context.Context) error {
        wg.Wait()
        return nil
    })

    genPdf := chromedp.ActionFunc(func(ctx context.Context) error {
        buf, _, err := page.PrintToPDF().WithMarginTop(0.3).WithMarginBottom(0.3).WithPrintBackground(true).Do(ctx)
        if err != nil {
            return err
        }
        pdfBuf = buf
        return nil
    })

    wg.Add(1)
    err := chromedp.Run(ctx, navigate, eventLoader, setDocContent, loaderWg, genPdf)
    if err != nil {
        fmt.Println(err)
    }

    file, err := os.Create("abc.pdf")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    // Write the PDF data to the file
    _, err = file.Write(pdfBuf)
    if err != nil {
        panic(err)
    }
    return 
}

This is the original image which should be displayed -> Orignal Image

This is the result which i am getting in the pdf -> Image1, Image2

Can anyone explain and let me know what needs to be corrected in order to get the desired result.

0

There are 0 best solutions below