16

I am creating an application to download pdf files from url and show in my dashboard page as grid wise.

I am using node.js with express framework.

exports.pdf = function(req, response) {
    var url ="http://www.ieee.org/documents/ieeecopyrightform.pdf";

    http.get(url, function(res) {
     var chunks = [];
     res.on('data', function(chunk) {
     console.log('start');
     chunks.push(chunk);
    });

    res.on("end", function() {
      console.log('downloaded');
      var jsfile = new Buffer.concat(chunks).toString('base64');
      console.log('converted to base64');
      response.header("Access-Control-Allow-Origin", "*");
      response.header("Access-Control-Allow-Headers", "X-Requested-With");
      response.header('content-type', 'application/pdf');
     response.send(jsfile);
    });
    }).on("error", function() {
   console.log("error");
   }); 
};
abdulbarik
  • 6,101
  • 5
  • 38
  • 59

6 Answers6

17

For those looking to download a PDF server side, which is a bit of a different use case than the OP, here's how I did it using the request npm module:

const fs = require("fs");
const request = require("request-promise-native");

async function downloadPDF(pdfURL, outputFilename) {
    let pdfBuffer = await request.get({uri: pdfURL, encoding: null});
    console.log("Writing downloaded PDF file to " + outputFilename + "...");
    fs.writeFileSync(outputFilename, pdfBuffer);
}

downloadPDF("https://www.ieee.org/content/dam/ieee-org/ieee/web/org/pubs/ecf_faq.pdf", "c:/temp/somePDF.pdf");
Ryan Shillington
  • 23,006
  • 14
  • 93
  • 108
  • 2
    this is not working it is giving me plain text file with pdf extension but not opening – James Jun 23 '20 at 19:04
  • @James It's not supposed to open. It's just supposed to save the file as c:\temp\somePDF.pdf. If you want it to open in your PDF viewer, that's a different question entirely. – Ryan Shillington Jun 28 '20 at 15:39
3

Simple solution I used to download pdf in node js is by npm i node-downloader-helper and just add downlaod url:

const { DownloaderHelper } = require('node-downloader-helper');

const download = new DownloaderHelper('url', __dirname);
download.on('end', () => console.log('Download Completed'))
download.start();
Syed Haseeb
  • 212
  • 2
  • 9
2

This will Help.

response.setHeader("Content-Type", "text/pdf");

This Link will help

George Rosario
  • 761
  • 11
  • 24
0

try this full version pdf downloader with an explanation

"use strict";

/**
 *
 * @author xgqfrms
 * @license MIT
 * @copyright xgqfrms
 * @created 2022-04-01
 * @modified
 *
 * @description  Node.js pdf crawler
 * @augments
 * @example
 * @link
 *
 */

// 1. commonjs module using `require` keyword
const fs = require("fs");
const path = require("path");
const { exit } = require("process");

const request = require("request-promise-native");

const log = console.log;

// 2. custom download folder
const folder = path.resolve(__dirname, '../pdf');
// log('folder', folder);

// 3. check if the folder exists, if not create it
if (!fs.existsSync(folder)) {
  fs.mkdirSync(folder);
}

async function downloadPDF(url, filename) {
  log(' pdf downloading ...');
  const pdfBuffer = await request.get({
    uri: url,
    encoding: null,
  });
  // 4. write file to local file system
  fs.writeFileSync(filename, pdfBuffer);
  log('✅ pdf download finished!');
  // 5. exit the terminal after download finished
  exit(0);
}

const url = 'https://cs193p.sites.stanford.edu/sites/g/files/sbiybj16636/files/media/file/l1.pdf';
const filename = folder + '/cs193p-2021-l1.pdf';
// log('filename =', filename);

downloadPDF(url, filename);

enter image description here

enter image description here

refs

https://nodejs.org/api/process.html#exit-codes

xgqfrms
  • 10,077
  • 1
  • 69
  • 68
0

If anyone is having issues (like I was) actually getting the PDF to open in a PDF viewer when using the request module, try setting the encoding in your call to null. Something like this:

async function downloadPDF(pdfURL, outputFilename, token) {
  const options = {
    url: pdfURL,
    headers: {
      'Content-Type': 'application/pdf',
      'Authorization': 'Bearer '+token,
    },
    encoding: null
  }
}
Tyler2P
  • 2,324
  • 26
  • 22
  • 31
Gray
  • 1
0

As of node 18, you can do this with no third party dependencies, using the native fetch API and the native filesystem API:

const pdfRespone = await fetch("https://example.com/file.pdf");
const pdfBuffer = await pdfRespone.arrayBuffer();
const binaryPdf = Buffer.from(pdfBuffer);
fs.writeFileSync("/your/file/name.pdf", binaryPdf, 'binary');

If you're dealing with very large files or have limited memory, you could also do this with streams, which would allow you to avoid loading the whole file into memory at once.

Matt Korostoff
  • 1,927
  • 2
  • 21
  • 26