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.