hajareshyam / pdf-creator-node

This package is used to generate HTML to PDF in Nodejs
MIT License
239 stars 79 forks source link

File is not showing local language after downloading #33

Open rajeshwarpatlolla opened 3 years ago

rajeshwarpatlolla commented 3 years ago

I have an application which is developed with node.js and hosted on heroku. We are generating a pdf on the node.js server and sending the stream to frontend, so that the users can download the file.

When i am trying it on the localhost, i am able to see proper content in the file. But when i host the node.js code on heroku and try the same, the file is not showing local language(telugu, an indian language) in the pdf. Below is the screenshot of the file i am getting.

enter image description here

The below code is the frontend code which will hit the server api and get the file content from server

const response = await axios.post(
          '/reports/pdf',
          { tests: this.tests },
          { responseType: 'blob' },
        );
        window.console.log(response);
        if (response) {
          this.createAndDownloadBlobFile(response, 'tests');
        }

The below code is to download the file. This function is called in the above code after getting the response.

createAndDownloadBlobFile(body, filename, extension = 'pdf') {
      const blob = new Blob([body]);
      const fileName = `${filename}.${extension}`;
      if (navigator.msSaveBlob) {
        // IE 10+
        navigator.msSaveBlob(blob, fileName);
      } else {
        const link = document.createElement('a');
        // Browsers that support HTML5 download attribute
        if (link.download !== undefined) {
          const url = URL.createObjectURL(blob);
          link.setAttribute('href', url);
          link.setAttribute('download', fileName);
          link.style.visibility = 'hidden';
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
        }
      }
    },

The node.js code is as below

return new Promise((resolve, reject) => {
      pdf
        .create(document, options)
        .then((res) => {
          var content = fs.readFileSync(path.resolve(__dirname, '../utils/output.pdf'));
          resolve(content);
        })
        .catch((error) => {
          reject(error);
        });
    });

I tried few different ways by changing the response format to base64 and changing the data format. But still no use. Any help would be really appreciated.

Created a question on stack overflow @ https://stackoverflow.com/questions/66210490/file-is-not-showing-local-language-after-downloading

Another issue is i am not able to add any stylings to the content using css. It is just ignoring the css even if we write.

HenglyEver commented 2 years ago

In my case, the library worked very fine on both local and production but last week it failed to load the local text (like your issue, showing block letter) and images without any reason on production, although, local still work fine and now I'm breaking my head to understand what is going on. Do you have any solution yet?