Web Renderer

FREEMIUM
By petadata | Updated a month ago | Business Software
Health Check

N/A

Back to All Tutorials (5)

Convert HTML to PDF by using Go Lang

In this tutorial we will cover how to implement asynchronous approach of Web Renderer. You only need to send HTML content to SubmitPDFFromHTMLTask or SubmitImageFromHTMLTask API methods to receive task identifier as response. There is also SubmitPDFFromUrlTask and SubmitImageFromUrlTask methods to render PDF or Image from public Web Uri.

After receiving task identifier you need to check task status by calling GetRenderingTaskStatus method. You need to call same method after a few seconds delay as long as task status equals to “Waiting”. Once you receive “Completed” from GetRenderingTaskStatus method you can call DownloadResult method to download final file. You can use the Go Lang implementation below.

package main

import (
	"bytes"
	"errors"
	"fmt"
	"io"
	"mime/multipart"
	"net/http"
	"os"
	"time"
)

func createReqBody(htmlContent string, uri string, pageLabel string, useCompression string, messageLabel string, browserHeight string, browserWidth string) (string, io.Reader, error) {
	buf := new(bytes.Buffer)
	bw := multipart.NewWriter(buf)

	htmlContentField, _ := bw.CreateFormField("htmlContent")
	htmlContentField.Write([]byte(htmlContent))

	uriField, _ := bw.CreateFormField("uri")
	uriField.Write([]byte(uri))

	useCompressionField, _ := bw.CreateFormField("useCompression")
	useCompressionField.Write([]byte(useCompression))

	pageLabelField, _ := bw.CreateFormField("pageLabel")
	pageLabelField.Write([]byte(pageLabel))

	messageLabelField, _ := bw.CreateFormField("messageLabel")
	messageLabelField.Write([]byte(messageLabel))

	browserHeightField, _ := bw.CreateFormField("browserHeight")
	browserHeightField.Write([]byte(browserHeight))

	browserWidthField, _ := bw.CreateFormField("browserWidth")
	browserWidthField.Write([]byte(browserWidth))

	bw.Close()
	return bw.FormDataContentType(), buf, nil
}

func submitPdfRenderTask(htmlContent string, uri string, rapidApiKey string) (string, error) {
	contType, reader, err := createReqBody(htmlContent, uri, "Home Page", "false",
		"Initial Capture", "768", "1024")
	if err != nil {
		return "", err
	}

	req, err := http.NewRequest("POST", "https://web-renderer.p.rapidapi.com/SubmitPDFFromHTMLTask", reader)
	req.Header.Add("Content-Type", contType)
	req.Header.Add("X-RapidAPI-Key", rapidApiKey)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil || resp.StatusCode != 200 {
		fmt.Println("Cannot upload request to render error:", err)
		return "", err
	}
	defer resp.Body.Close()
	b, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}
	return string(b), nil
}

func getRenderingTaskStatus(taskId string, rapidApiKey string) (string, error) {
	url := fmt.Sprintf("https://web-renderer.p.rapidapi.com/GetRenderingTaskStatus?taskId=%s", taskId)
	req, err := http.NewRequest("GET", url, nil)
	req.Header.Add("X-RapidAPI-Key", rapidApiKey)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil || resp.StatusCode != 200 {
		fmt.Println("Cannot check rendering status of task with error:", err)
		return "", err
	}
	defer resp.Body.Close()
	b, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}
	return string(b), nil
}

func downloadResult(taskId string, rapidApiKey string) ([]byte, error) {
	url := fmt.Sprintf("https://web-renderer.p.rapidapi.com/DownloadResult?taskId=%s", taskId)
	req, err := http.NewRequest("GET", url, nil)
	req.Header.Add("X-RapidAPI-Key", rapidApiKey)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil || resp.StatusCode != 200 {
		fmt.Println("Cannot download rendered file with error:", err)
		return nil, err
	}
	defer resp.Body.Close()
	b, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	return b, nil
}

func main() {
	htmlContent := "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"></head><body><h1>Hello World!</h1></body></html>"
	uriOfHtmlContent := "https://www.google.com?hl=en"
	rapidApiKey := "<YOUR RAPIDAPI KEY HERE>"
	taskId, err := submitPdfRenderTask(htmlContent, uriOfHtmlContent, rapidApiKey)
	if err != nil {
		panic(err)
	}
	retryCount := 0
	for retryCount < 100 {
		retryCount++
		time.Sleep(5 * time.Second)
		status, err := getRenderingTaskStatus(taskId, rapidApiKey)
		if err != nil {
			panic(err)
		}
		if status == "Completed" {
			fileBytes, err := downloadResult(taskId, rapidApiKey)
			if err != nil {
				panic(err)
			}
			err = os.WriteFile("html_from_html.pdf", fileBytes, 0644)
			if err != nil {
				panic(err)
			}
			break
		} else if status == "Waiting" {
			continue
		} else if status == "Failed" {
			panic(errors.New("Cannot render html"))
		} else {
			panic(errors.New("Cannot render html"))
		}
	}
}