首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打印所有pdf页,但最后一页使用木偶索引

打印所有pdf页,但最后一页使用木偶索引
EN

Stack Overflow用户
提问于 2020-06-01 14:42:03
回答 1查看 1.8K关注 0票数 2

我需要为最后一个pdf页面生成不同的页脚。经过调查,我意识到最好的方法是生成两个不同的pdfs并将它们组合起来。当我需要更改页脚或对第一页使用不同的模板时,或者当我知道哪些页面看起来应该不同(使用pageRanges选项)时,它可以很好地工作,但是在总页码未知的情况下,我无法找到只获取最后(最后n)页的方法。有什么想法吗?我如何才能为最后(最后n页)生成pdf?

如有任何答案,我们将不胜感激。

我使用Puppetorv2.1.0和node.js v8.16.0

这是我现在用来生成pdf文件的脚本。

代码语言:javascript
运行
复制
const puppeteer = require('puppeteer');
const fs = require('fs');

const DEFAULT_HEADER = '<span></span>';
const DEFAULT_FOOTER_HEIGHT = 90;
const DEFAULT_PAGE_PADDING = 36;

const createPdf = async () => {
  let browser;
  try {
    browser = await puppeteer.launch();
    const page = await browser.newPage();

    const [, , bodyFilePath, outputFilePath, footerFilePath] = process.argv;

    await page.goto(`file:${bodyFilePath}`, { waitUntil: 'networkidle0' });

    let footerTemplate = DEFAULT_HEADER;

    if (footerFilePath) {
      footerTemplate = fs.readFileSync(footerFilePath, 'utf8');
    }

    await page.pdf({
      path: outputFilePath,
      format: 'A4',
      margin: {
        top: DEFAULT_PAGE_PADDING,
        right: DEFAULT_PAGE_PADDING,
        bottom: DEFAULT_FOOTER_HEIGHT,
        left: DEFAULT_PAGE_PADDING,
      },
      printBackground: true,
      displayHeaderFooter: true,
      headerTemplate: DEFAULT_HEADER,
      footerTemplate,
    });
  } catch (err) {
    console.log(err.message);
  } finally {
    if (browser) {
      browser.close();
    }
    process.exit();
  }
};

createPdf();

我正在转换为pdf的模板是.html.erb文件

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-02 13:54:32

也许有更好的方法来解决这个问题,但现在我使用了这样的方法--我使用上面相同的脚本生成导出,比我使用的脚本多一个脚本,该脚本打开前面的pdf文件,计数页面并生成两个新文件(我正在将这些文件合并到后端的一个文件)--除了最后一个页面,并且只使用不同页脚的最后一个页面。

代码语言:javascript
运行
复制
const puppeteer = require('puppeteer');
const fs = require('fs');
const pdf = require('pdf-parse');

const DEFAULT_HEADER = '<span></span>';
const DEFAULT_FOOTER_HEIGHT = 90;
const DEFAULT_PAGE_PADDING = 36;

const createPdf = async () => {
  let browser;
  try {
    browser = await puppeteer.launch();
    const page = await browser.newPage();

    const [
      ,
      ,
      bodyFilePath,
      outputFilePath,
      footerFilePath,
      lastPagePath,
      lastPageFooterPath,
    ] = process.argv;

    await page.goto(`file:${bodyFilePath}`, { waitUntil: 'networkidle0' });

    let footerTemplate = DEFAULT_HEADER;
    let lastPageFooterTemplate = DEFAULT_HEADER;

    if (footerFilePath) {
      footerTemplate = fs.readFileSync(footerFilePath, 'utf8');
    }

    if (lastPageFooterPath) {
      lastPageFooterTemplate = fs.readFileSync(lastPageFooterPath, 'utf8');
    }

    const dataBuffer = fs.readFileSync(outputFilePath);
    const pdfInfo = await pdf(dataBuffer);
    const numPages = pdfInfo.numpages;

    const baseOptions = {
      path: outputFilePath,
      format: 'A4',
      margin: {
        top: DEFAULT_PAGE_PADDING,
        right: DEFAULT_PAGE_PADDING,
        bottom: DEFAULT_FOOTER_HEIGHT,
        left: DEFAULT_PAGE_PADDING,
      },
      printBackground: true,
      displayHeaderFooter: true,
      headerTemplate: DEFAULT_HEADER,
      pageRanges: `${numPages}`,
      footerTemplate: lastPageFooterTemplate,
    };

    if (numPages === 1) {
      await page.pdf(baseOptions);
    } else {
      await page.pdf({
        ...baseOptions,
        footerTemplate,
        pageRanges: `-${numPages - 1}`,
      });

      await page.pdf({
        ...baseOptions,
        path: lastPagePath,
        footerTemplate: lastPageFooterTemplate,
      });
    }
  } catch (err) {
    console.log(err.message);
  } finally {
    if (browser) {
      browser.close();
    }
    process.exit();
  }
};

createPdf();

希望这对有同样问题的人有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62134744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档