node-html-pdf icon indicating copy to clipboard operation
node-html-pdf copied to clipboard

Generated PDF has no style, no images.

Open Scrashdown opened this issue 2 years ago • 5 comments

Hello,

The header of my HTML file looks like this:

<head>
        <meta charset="utf-8">
        <link rel="stylesheet" type="text/css" href="style.css">
</head>

Somewhere else in my HTML file, I have an image:

<img src="img/profile.jpg">

I am trying to compile with the following script (main.js):

let src = fs.readFileSync(`./src/in.html`, 'utf-8')
const options = {
        "base": `file://${__dirname}/src/`,
        "format": "A4",
        "orientation": "portrait"
}
pdfc.create(src, options).toFile(`./out/out.pdf`, (err, res) => {
        if (err) return console.log(err)
        console.log(res)
})

Here is the file structure:

|- main.js
|- src/
   |- in.html
   |- style.css
   |- img/
      |- profile.jpg
|- out/

The resulting PDF has no style, no images... I'm guessing something is wrong with options.base, but it is pointing to the right directory and the files are where the HTML file expects them to be. Am I passing the options wrong?

Thanks.

Scrashdown avatar Mar 20 '22 12:03 Scrashdown

I had the same problem, I solved just adding the localUrlAccess option, this is my code:

    var fs = require('fs');
    var pdf = require('html-pdf');
    const path = require('path');

    var html = fs.readFileSync('./templates/index.html', 'utf8');
    let base = path.resolve('./templates/static') + '/';
    base = base.replace(new RegExp(/\\/g), '/');

    var options = {
        "format": "Letter",
        "base": "file:///" + base,
        "localUrlAccess": true, // set this to true to enable local file access
    };

    pdf.create(html, options).toFile('./public/example.pdf', function (err, res) {
        if (err) return console.log(err);
        console.log(res); // { filename: '/public/example.pdf' }
    });

I hope you find it helpful 👍

jsantoyov avatar Mar 31 '22 17:03 jsantoyov

Use base64 image

Gotvna avatar May 31 '22 13:05 Gotvna

I tried using localUrlAccess: true for my code, but it still didn't work for me.

Rohanpatel512 avatar May 31 '22 15:05 Rohanpatel512

Leave this package if you want to nice ans easy css

Gotvna avatar May 31 '22 21:05 Gotvna

I tried using localUrlAccess: true for my code, but it still didn't work for me.

You also need to supple the base value. That is an absolute path to your html base directory. so if your files are stored at

/home/hello/world

your base needs to be

file:///home/hello/world

this is what worked for me:

import pdf from 'html-pdf';
import {readFile} from 'fs/promises';
import {fileURLToPath} from 'url';
import path from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

async function main() {
  const file = await readFile("./README.html");
  await new Promise(res => pdf.create(file , {
    localUrlAccess: true,
    format: 'A4',
    base: "file:///" + __dirname + "/",
  }).toFile('./README.pdf', function() {res()}));
}

main();

liam-jones-lucout avatar Jun 22 '22 13:06 liam-jones-lucout