如何在Apps脚本中使用外部Javascript库(PDF库)?

问题描述 投票:0回答:1

我需要在 Apps 脚本应用程序上修改 PDF。为此,我想使用 JS 库:PDF-LIB

我的代码:

eval(UrlFetchApp.fetch("https://unpkg.com/pdf-lib/dist/pdf-lib.js").getContentText());

function modifyPdf() {
  const url = 'https://pdf-lib.js.org/assets/with_update_sections.pdf'
  const existingPdfBytes = UrlFetchApp.fetch(url).getContentText();

  const pdfDoc = PDFDocument.load(existingPdfBytes)
  const helveticaFont = pdfDoc.embedFont(StandardFonts.Helvetica)

  const pages = pdfDoc.getPages()
  const firstPage = pages[0]
  const { width, height } = firstPage.getSize()
  firstPage.drawText('This text was added with JavaScript!', {
    x: 5,
    y: height / 2 + 300,
    size: 50,
    font: helveticaFont,
    color: rgb(0.95, 0.1, 0.1),
    rotate: degrees(-45),
  })

  const pdfBytes = pdfDoc.save()
}

当我执行功能时

modifyPDF
我有:

Erreur  
ReferenceError: PDFDocument is not defined
modifyPdf   @ modifie_pdf.gs:7

你知道如何在我的 Apps 脚本应用程序中导入 js 库吗?

google-apps-script pdf libraries pdf.js pdf-lib.js
1个回答
6
投票
  • eval
    使用的全局变量命名空间是
    PDFLib
    。因此,像
    rgb
    degrees
    PDFDocument
    这样的所有变量都是该对象的键,应该这样引用。

  • 库中存在的大多数函数都使用

    promises
    ,虽然应用程序脚本在功能上不支持它,但在语法上支持它。因此,应该使用
    async
    await
    ,否则你只会得到
    promise
    对象,而不是实际的
    document
    font

  • 该库使用

    setTimeout
    ,这在应用程序脚本中不可用。我使用
    Utilities.sleep
    来模拟它的行为。

  • getContentText()
    返回
    text
    而不是
    binary content
    。使用
    getContent()
    来获取
    byte[]
    并将其投射到
    Uint8Array

eval(UrlFetchApp.fetch("https://unpkg.com/pdf-lib/dist/pdf-lib.js").getContentText());
/*+++simulate setTimeout*/setTimeout = (func, sleep) => (Utilities.sleep(sleep),func())

async function modifyPdf() {
  const url = 'https://pdf-lib.js.org/assets/with_update_sections.pdf'
  const existingPdfBytes = new /*cast to uint8*/Uint8Array(/*returns byte[]*/UrlFetchApp.fetch(url).getContent/*---Text*/());
  /*+++ simulate import*/const { PDFDocument, StandardFonts, rgb, degrees} = PDFLib;
  const pdfDoc = /*+++*/await PDFDocument.load(existingPdfBytes)
  const helveticaFont = /*+++*/ await pdfDoc.embedFont(StandardFonts.Helvetica)

  const pages = pdfDoc.getPages()
  const firstPage = pages[0]
  const { width, height } = firstPage.getSize()
  firstPage.drawText(`This text was added with JavaScript\n\n${' '.repeat(10)}(Google Apps script)!`, {
    x: width/10 + 60,
    y: height/10 + 120,
    size: 40,
    font: helveticaFont,
    color: rgb(0.1, 0.1, 0.1),
    rotate: degrees(50),
    opacity: 0.5,
  })

  const pdfBytes = /*+++*/await pdfDoc.save();
  /*+++*/DriveApp.createFile(Utilities.newBlob(pdfBytes).setName('newpdf from apps script'))
}

© www.soinside.com 2019 - 2024. All rights reserved.