HTML para PDF com nó.js

estou a tentar criar uma versão impressa pdf das páginas web do meu site. Algo do tipo express.render() só torna a página como pdf

Alguém conhece um módulo de nó que faça isso ?

Se não, como é que iria implementar um ? Já vi alguns métodos falarem sobre usar browser sem cabeça como phantom.js, mas não sei qual é o fluxo.

Author: Martin Schröder, 2013-01-28

8 answers

Estendendo-se sobre a resposta de Mustafa.

A) instalar http://phantomjs.org/ e depois

B) instalar o módulo de nó fantasma https://github.com/amir20/phantomjs-node

enter image description here

C) Aqui está um exemplo de renderização de um pdf

var phantom = require('phantom');   

phantom.create().then(function(ph) {
    ph.createPage().then(function(page) {
        page.open("http://www.google.com").then(function(status) {
            page.render('google.pdf').then(function() {
                console.log('Page Rendered');
                ph.exit();
            });
        });
    });
});

Saída do PDF:

enter image description here

Editar: imprimir silenciosamente este PDF

java -jar pdfbox-app-2.0.2.jar PrintPDF -silentPrint C:\print_mypdf.pdf

 79
Author: Jozzhart, 2016-07-04 10:22:55

Fantasma.o js é um servidor webkit sem cabeça e irá carregar qualquer página web e rendê-la em memória, embora possa não ser capaz de a ver, existe uma funcionalidade de captura de ecrã, na qual poderá exportar a vista actual como PNG, PDF, JPEG e GIF. Veja este exemplo de phantom.documentação js

 21
Author: Mustafa, 2014-10-30 08:37:11

Se quiser Exportar HTML para PDF. Tens muitas opções. sem nó até

Opção 1: Tenha um botão na sua página html que invoca a janela.função print (). use o browsers nativo html para pdf. use as consultas de mídia para fazer sua página html parecer bom em um pdf. e você também tem a impressão antes e depois de eventos que você pode usar para fazer alterações na sua página antes de imprimir.

Opção 2. htmltocanvas ou rasterizeHTML. converter o seu html para área de desenho, depois ligar toDataURL () on the canvas object to get the image . e usar uma biblioteca JavaScript como jsPDF para adicionar essa imagem a um ficheiro PDF. A desvantagem desta abordagem é que o pdf não se torna editável. Se você quer dados extraídos do PDF, há maneiras diferentes para isso.

Opção 3. @Jozzhard answer

 11
Author: MurWade, 2014-08-09 21:12:58

A melhor solução que encontrei é html-pdf. É simples e funciona com html grande.

Https://www.npmjs.com/package/html-pdf

É tão simples como isso:

    pdf.create(htm, options).toFile('./pdfname.pdf', function(err, res) {
        if (err) {
          console.log(err);
        }
    });
 7
Author: Thermech, 2017-01-18 18:35:33

Criar PDF a partir do URL externo

Aqui está uma adaptação das respostas anteriores que utiliza html-pdf, mas também a combina com requestify para que funcione com uma URL externa:

Instale as suas dependências

npm i -S html-pdf requestify

Então, crie o script:

//MakePDF.js

var pdf = require('html-pdf');
var requestify = require('requestify');
var externalURL= 'http://www.google.com';

requestify.get(externalURL).then(function (response) {
   // Get the raw HTML response body
   var html = response.body; 
   var config = {format: 'A4'}; // or format: 'letter' - see https://github.com/marcbachmann/node-html-pdf#options

// Create the PDF
   pdf.create(html, config).toFile('pathtooutput/generated.pdf', function (err, res) {
      if (err) return console.log(err);
      console.log(res); // { filename: '/pathtooutput/generated.pdf' }
   });
});

Depois corres da linha de comando:

node MakePDF.js
[[6]}Veja o seu pixel embelezado perfeito PDF ser criado para você (de graça!)
 5
Author: TetraDev, 2016-11-10 15:45:55

Utilizar html-pdf

var fs = require('fs');
var pdf = require('html-pdf');
var html = fs.readFileSync('./test/businesscard.html', 'utf8');
var options = { format: 'Letter' };

pdf.create(html, options).toFile('./businesscard.pdf', function(err, res) {
  if (err) return console.log(err);
  console.log(res); // { filename: '/app/businesscard.pdf' } 
});
 2
Author: Krishan, 2017-03-10 05:38:14

Dimensão da

Eu usei html-pdf

Fácil de usar e permite não só salvar pdf como arquivo, mas também encaminhar conteúdo pdf para um WriteStream (para que eu pudesse transmiti-lo diretamente para o Google Armazenamento para salvar lá meus relatórios).

Usar imagens css +

Tem em conta o css. O único problema que enfrentei, ignorou as minhas imagens. A solução que encontrei foi substituir o url no valor de referência ([1]) por um valor de Base (64)., por exemplo

<img src="data:image/png;base64,iVBOR...kSuQmCC">

Pode fazê-lo com o seu código ou usar um dos conversores online, por exemplo https://www.base64-image.de/

Compilar o código html válido a partir do fragmento html + css

  1. tive de obter um fragmento do meu documento html (acabei de enviar .html () method on jQuery selector).
  2. Então li o conteúdo do ficheiro relevante.

Usando estes dois valores (armazenados em variáveis html e css em conformidade), compilou um código html válido usando o texto do Modelo

var htmlContent = `
<!DOCTYPE html>
<html>
  <head>
    <style>
      ${css}
    </style>
  </head>
  <body id=direct-sellers-bill>
    ${html}
  </body>
</html>`

E passou para create método de html-pdf .

 2
Author: Alexander, 2017-10-02 11:04:26

Tente usar o "Puppeteer" para criar PDF a partir do HTML

Exemplo a partir daqui https://github.com/chuongtrh/html_to_pdf

Ou https://github.com/GoogleChrome/puppeteer

 0
Author: ChuongTran, 2018-10-03 11:55:52