如何在Node.js中从URL下载PDF文件?

16

我正在创建一个应用程序,用于从URL下载PDF文件并以网格方式显示在我的仪表板页面上。

我正在使用Node.js和Express框架。

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");
   }); 
};

发布你正在使用的代码。 - George Rosario
6个回答

17

对于那些希望在服务器端下载 PDF 文件的人,这与 OP(原始发布者)有点不同,以下是我使用 request npm 模块完成此操作的方法:

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");

2
这个不起作用,它给我一个扩展名为PDF的纯文本文件,但无法打开。 - James
@James 这个程序不是用来打开文件的,它只是将文件保存在 c:\temp\somePDF.pdf。如果你想要在 PDF 阅读器中打开它,那就是另一个完全不同的问题了。 - Ryan Shillington

3

我用于在Node.js中下载PDF文件的简单解决方案是通过 npm i node-downloader-helper 安装下载助手并添加下载链接:

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

const download = new DownloaderHelper('url', __dirname);
download.on('end', () => console.log('Download Completed'))
download.start();

2

0
如果有人遇到了问题(就像我一样),在使用请求模块时无法在PDF查看器中打开PDF,请尝试在调用中将编码设置为null。就像这样:
async function downloadPDF(pdfURL, outputFilename, token) {
  const options = {
    url: pdfURL,
    headers: {
      'Content-Type': 'application/pdf',
      'Authorization': 'Bearer '+token,
    },
    encoding: null
  }
}

0

试试这个带解释的完整版PDF下载器

"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

参考

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


0
截至节点18,你可以在没有第三方依赖的情况下通过原生 fetch API原生文件系统 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');

如果您正在处理非常大的文件或者内存有限,您也可以使用流来完成这个操作,这将使您能够避免一次性加载整个文件到内存中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接