मुझे अंतिम पीडीएफ पृष्ठ के लिए अलग-अलग पादलेख उत्पन्न करने की आवश्यकता है। जांच के बाद मैंने महसूस किया कि सबसे अच्छा तरीका है कि दो अलग-अलग पीडीएफ़ तैयार करें और उन्हें संयोजित करें। यह ठीक काम करता है जब मुझे पहले पृष्ठ के लिए पाद लेख बदलने या विभिन्न टेम्पलेट्स का उपयोग करने की आवश्यकता होती है, या ऐसे मामलों में जब मुझे पता होता है कि कौन से पृष्ठ अलग दिखना चाहिए (pageRanges विकल्प का उपयोग करके), लेकिन मुझे केवल अंतिम प्राप्त करने का कोई तरीका नहीं मिल रहा है (अंतिम n) पृष्ठ जब कुल पृष्ठ संख्या अज्ञात है। कोई विचार है कि मैं केवल अंतिम (अंतिम एन) पृष्ठों के लिए पीडीएफ कैसे उत्पन्न कर सकता हूं?

किसी भी उत्तर के लिए सराहना की जाएगी।
मैं कठपुतली v 2.1.0 का उपयोग node.js v 8.16.0 के साथ कर रहा हूं

यह एक स्क्रिप्ट है जिसका उपयोग मैं अभी पीडीएफ फाइल बनाने के लिए कर रहा हूं।

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

टेम्प्लेट जिन्हें मैं पीडीएफ में परिवर्तित कर रहा हूं, वे हैं .html.erb फाइलें

2
Bogdan Linnik 1 जून 2020, 17:42

1 उत्तर

सबसे बढ़िया उत्तर

शायद इस समस्या को हल करने के बेहतर तरीके हैं लेकिन इस बिंदु पर मैंने इस दृष्टिकोण का उपयोग किया है - मैं ऊपर की तरह एक ही स्क्रिप्ट का उपयोग करके निर्यात उत्पन्न कर रहा हूं, और मैं एक और स्क्रिप्ट का उपयोग कर रहा हूं जो पिछली पीडीएफ फाइल खोलता है, पृष्ठों की गणना करता है और उत्पन्न करता है दो नई फाइलें (जिन्हें मैं बैकएंड पर एक फाइल में जोड़ रहा हूं) - पिछले एक को छोड़कर सभी पेज, और अलग-अलग फुटर के साथ केवल आखिरी पेज।

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

उम्मीद है कि यह एक ही मुद्दे वाले किसी व्यक्ति के लिए सहायक होगा।

0
Bogdan Linnik 2 जून 2020, 14:12