最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js實(shí)現(xiàn)文本與pdf相互轉(zhuǎn)換的代碼詳解

 更新時(shí)間:2025年07月09日 10:24:44   作者:Heo  
在IT行業(yè)中,文檔格式轉(zhuǎn)換是日常工作中的常見需求,Word與PDF是兩種廣泛應(yīng)用的文檔格式,它們各有優(yōu)勢(shì),但有時(shí)需要相互轉(zhuǎn)換以滿足特定場(chǎng)景的需求,本篇將詳細(xì)講解如何使用Node.js實(shí)現(xiàn)文本與pdf相互轉(zhuǎn)換,需要的朋友可以參考下

pdf 轉(zhuǎn)文本

主要使用 pdf-parse 這個(gè)庫(kù),直接識(shí)別提取我們 pdf 文件中的文字。

const express = require("express");
const fs = require("fs");
const PDFParser = require("pdf-parse");
const cors = require("cors");

const pdfFilePath = "./xxx_實(shí)習(xí)生.pdf";

const app = express();

// 解決跨域問題
app.use(cors());
app.use(express.static(__dirname));
app.use(express.json());

app.post("/form2pdf", (req, res) => {
  console.log(req.body);
  const str = "";

    // 1. 讀取pdf文件
  fs.readFile(pdfFilePath, (err, pdfBuffer) => {
    if (err) {
      console.log(err);
      return;
    }

    PDFParser(pdfBuffer).then((pdfData) => {
      const pages = pdfData.text.split("\n\n");
      console.log(pages);
      let str;
      for (let i = 1; i < pages.length; i++) str = str + pages[i];
      console.log(str);
    });
  });
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

文本轉(zhuǎn) pdf

主要使用 pdfkit 這個(gè)庫(kù)將文本轉(zhuǎn)為pdf文件。

const express = require("express");
const fs = require("fs");
const cors = require("cors");
const PDFDocument = require("pdfkit");

const app = express();

// 解決跨域問題
app.use(cors());
app.use(express.static(__dirname));
app.use(express.json());

app.post("/form2pdf", (req, res) => {
  console.log(req.body);
  const str = "";
  // 使用 pdfkit 生成pdf

  // 創(chuàng)建 PDF 文檔
  const doc = new PDFDocument({
    margin: 50, // 控制上下左右留白
  });

  // 輸出到文件
  // 如果有同名的 直接覆蓋
  doc.pipe(fs.createWriteStream("output.pdf"));

  // ========== Header ==========
  function addHeader(doc) {
    doc.fontSize(20).text(req.body.name, { align: "center" }).moveDown();
    doc
      .moveTo(50, doc.y) // 從左邊開始畫橫線
      .lineTo(550, doc.y) // 到右邊
      .stroke();
    doc.moveDown();
  }

  // ========== Footer ==========
  function addFooter(doc) {
    const range = doc.bufferedPageRange(); // 所有頁(yè)

    for (let i = range.start; i < range.start + range.count; i++) {
      doc.switchToPage(i);
      doc
        .fontSize(10)
        .fillColor("gray")
        .text(`第 ${i + 1} 頁(yè)`, 0, doc.page.height - 50, {
          align: "center",
        });
    }
  }

  // ========== Body ==========
  function addBody(doc) {
    doc.fontSize(12);
    doc.text(req.body.name + " " + req.body.sex + " " + req.body.age, {
      align: "left",
      lineGap: 4,
    });
  }

  // 添加內(nèi)容
  addHeader(doc);
  addBody(doc);

  // 結(jié)束前添加 footer(多頁(yè)也有效)
  doc.end();
  doc.on("end", () => {
    addFooter(doc);
  });

  // 把后端的pdf地址返回給前端
  res.json({
    code: 200,
    data: "http://localhost:3000/output.pdf",
  });
  res.send("PDF generated successfully!");
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

瀏覽器緩存引發(fā)的小問題

之前自己寫 demo,遇到一個(gè)小問題,可能剛剛?cè)腴T的小白一時(shí)找不到原因,特此記錄下:

  • 后端生成pdf文件,但是名稱都相同(而且由于前端通過 iframe 渲染 pdf 的url 地址,url 地址也相同)
  • 盡管內(nèi)容不同,但是瀏覽器發(fā)現(xiàn)相同的名稱pdf(靜態(tài)文件),會(huì)繼續(xù)使用緩存,導(dǎo)致后端pdf雖然重新覆蓋生成,但是前端瀏覽器中的 iframe 渲染的 pdf 還是舊的(緩存中的)。

解決方法是:

<iframe :src="url" width="100%" height="1200px"></iframe>

const onSubmit = () => {
  axios.post("http://localhost:3000/form2pdf", form).then((res) => {
    url.value = res.data.data + "?t=" + Date.now();
    console.log(url);
  });
};

添加一個(gè)時(shí)間戳來阻止瀏覽器繼續(xù)使用緩存,以保證每次重新請(qǐng)求都可以渲染最新的pdf 文件數(shù)據(jù)。

  1. 瀏覽器為什么會(huì)緩存 PDF?

靜態(tài)資源(如 PDF、圖片、JS、CSS)默認(rèn)會(huì)被瀏覽器緩存。
這是因?yàn)?Express 的 express.static() 中間件會(huì)自動(dòng)為靜態(tài)資源設(shè)置緩存相關(guān)的 HTTP 頭(如 Cache-Control),讓瀏覽器下次訪問同樣的 URL 時(shí)直接用本地緩存,加快加載速度、減少服務(wù)器壓力。

只要 URL 一樣,且沒有特殊的禁止緩存設(shè)置,瀏覽器就會(huì)優(yōu)先用緩存。

如果在 /form2pdf 路由里加了:

res.setHeader("Cache-Control", 'no-store');

但這個(gè) header 只作用于 /form2pdf 這個(gè)接口的響應(yīng),對(duì) output.pdf 這個(gè)靜態(tài)文件的響應(yīng)沒有影響。
output.pdf 的響應(yīng)是由 express.static(__dirname) 處理的,和接口響應(yīng)頭無關(guān)。

  1. 為什么加參數(shù)能解決?

當(dāng)你訪問 output.pdf?t=xxx 時(shí),瀏覽器認(rèn)為這是一個(gè)全新的資源(即使實(shí)際文件一樣),所以會(huì)重新請(qǐng)求服務(wù)器,不會(huì)用緩存。

  1. 如何讓靜態(tài) PDF 不被緩存?

可以讓 Express 靜態(tài)資源響應(yīng)時(shí)加上禁止緩存的 header:

app.use(express.static(__dirname, {
  setHeaders: (res, path) => {
    if (path.endsWith('.pdf')) {
      res.setHeader('Cache-Control', 'no-store');
    }
  }
}));

這樣瀏覽器每次都會(huì)重新請(qǐng)求 PDF 文件。

到此這篇關(guān)于Node.js實(shí)現(xiàn)文本與pdf相互轉(zhuǎn)換的代碼詳解的文章就介紹到這了,更多相關(guān)Node.js文本與pdf互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Node.js中修改全局變量的方式及注意事項(xiàng)

    Node.js中修改全局變量的方式及注意事項(xiàng)

    本文詳細(xì)介紹了在Node.js中如何修改全局變量,包括全局變量的定義方式、正確的修改姿勢(shì)、潛在的隱患及其解決方案,以及推薦的替代方案,總結(jié)建議了在實(shí)際應(yīng)用中應(yīng)盡量避免使用全局變量,轉(zhuǎn)而采用模塊化、可維護(hù)性更高的方法,感興趣的朋友一起看看吧
    2025-02-02
  • Node.js的cross-env工具包使用介紹

    Node.js的cross-env工具包使用介紹

    這篇文章主要為大家介紹了Node.js的cross-env工具包使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • node如何實(shí)現(xiàn)簡(jiǎn)單的腳手架淺析

    node如何實(shí)現(xiàn)簡(jiǎn)單的腳手架淺析

    在工作中,需要開發(fā)一個(gè)腳手架,用于給相關(guān)用戶提供相關(guān)的開發(fā)便利性,下面這篇文章主要給大家介紹了關(guān)于node如何實(shí)現(xiàn)簡(jiǎn)單的腳手架的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • node.js中的fs.exists方法使用說明

    node.js中的fs.exists方法使用說明

    這篇文章主要介紹了node.js中的fs.exists方法使用說明,本文介紹了fs.exists方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 三分鐘教會(huì)你用nodejs操作mysql數(shù)據(jù)庫(kù)

    三分鐘教會(huì)你用nodejs操作mysql數(shù)據(jù)庫(kù)

    MySQL數(shù)據(jù)庫(kù)作為最流行的開源數(shù)據(jù)庫(kù),基本上是每個(gè)web開發(fā)者必須要掌握的數(shù)據(jù)庫(kù)程序之一了,基本使用?node.js上,最受歡迎的mysql包就是mysql模塊,下面這篇文章主要給大家介紹了關(guān)于如何通過三分鐘教會(huì)你用nodejs操作mysql數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2023-05-05
  • Node.js完整安裝配置指南(包含國(guó)內(nèi)鏡像配置)

    Node.js完整安裝配置指南(包含國(guó)內(nèi)鏡像配置)

    本文介紹Node.js的安裝配置過程,包括使用Chocolatey、官網(wǎng)下載、國(guó)內(nèi)鏡像下載等安裝方法,驗(yàn)證安裝,配置國(guó)內(nèi)鏡像源,環(huán)境變量配置,npm配置優(yōu)化,常用鏡像測(cè)速腳本,使用nrm管理鏡像源,及故障排查內(nèi)容,最后推薦了完整的配置命令和立即解決方案,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 解決yarn安裝依賴包報(bào)錯(cuò)error An unexpected error occurred: https://registry.npm.taobao.orgnpm/element-ui: get問題

    解決yarn安裝依賴包報(bào)錯(cuò)error An unexpected error o

    文章主要講述了在使用yarn安裝依賴包時(shí)遇到的錯(cuò)誤,并提供了解決方案,建議將請(qǐng)求地址設(shè)置為淘寶源,對(duì)node-sass鏡像源進(jìn)行設(shè)置,最后重新下載依賴包
    2026-04-04
  • Node.js Sequelize如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫分離

    Node.js Sequelize如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫分離

    Sequelize是一個(gè)易于使用,支持多SQL方言(dialect)的對(duì)象-關(guān)系映射框架(ORM),這個(gè)庫(kù)完全采用JavaScript開發(fā)并且能夠用在Node.JS環(huán)境中。它當(dāng)前支持MySQL, MariaDB, SQLite 和 PostgreSQL 數(shù)據(jù)庫(kù)。在Node.js中,使用 Sequelize操作數(shù)據(jù)庫(kù)時(shí),同樣支持讀寫分離。
    2016-10-10
  • Node4-5靜態(tài)資源服務(wù)器實(shí)戰(zhàn)以及優(yōu)化壓縮文件實(shí)例內(nèi)容

    Node4-5靜態(tài)資源服務(wù)器實(shí)戰(zhàn)以及優(yōu)化壓縮文件實(shí)例內(nèi)容

    這篇文章主要介紹了Node4-5靜態(tài)資源服務(wù)器實(shí)戰(zhàn)以及優(yōu)化壓縮文件實(shí)例內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2019-08-08
  • linux 后臺(tái)運(yùn)行node服務(wù)指令方法

    linux 后臺(tái)運(yùn)行node服務(wù)指令方法

    今天小編就為大家分享一篇linux 后臺(tái)運(yùn)行node服務(wù)指令方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評(píng)論

新平| 定安县| 津南区| 开封县| 库尔勒市| 西盟| 宁安市| 东兴市| 类乌齐县| 乐清市| 天峻县| 锡林郭勒盟| 永善县| 屯留县| 双桥区| 庆阳市| 宜君县| 马尔康县| 尚义县| 淄博市| 凉城县| 车致| 石棉县| 嵊泗县| 建瓯市| 金湖县| 定结县| 抚松县| 梨树县| 青河县| 新田县| 邮箱| 纳雍县| 临城县| 昌图县| 太康县| 介休市| 长泰县| 赤水市| 威信县| 榆中县|