作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在 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 库吗?
最佳答案
eval
使用的全局变量命名空间是PDFLib
。因此,所有变量(例如 rgb
、levels
、PDFDocument
)都是该对象的键,应该这样引用。
库中的大多数函数都使用 promises
,虽然应用程序脚本在功能上不支持它,但在语法上却支持它。因此,应该使用async
、await
,否则你只会得到promise
对象,而不是实际的document
或字体
该库使用 setTimeout
,这在应用脚本中不可用。我使用 Utilities.sleep
来模拟它的行为。
getContentText()
返回文本
,而不是二进制内容
。使用 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'))
}
关于pdf - 如何在 Apps 脚本中使用外部 Javascript 库(PDF 库)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73166361/
我是一名优秀的程序员,十分优秀!