简体   繁体   English

jsPDF - 包括其他 pdf

[英]jsPDF - include other pdf

I'm trying to solve such problem with jsPDF:我正在尝试使用 jsPDF 解决此类问题:

I have PDF file, which is stored on server.我有 PDF 文件,它存储在服务器上。 I'm generating another pdf with jsPDF and trying to append to already existed pdf file (as I mentioned above) as a another page.我正在用 jsPDF 生成另一个 pdf 并尝试将已经存在的 pdf 文件(如我上面提到的)作为另一个页面附加。

I googled about it, but can't find any help.我用谷歌搜索了它,但找不到任何帮助。 Also I found this question on stackoverflow, but it is different scenario - Append Existing Pdf to Jspdf我也在 stackoverflow 上发现了这个问题,但它是不同的场景 - Append Existing Pdf to Jspdf

How can I make this to work?我怎样才能使这个工作? Or is any other plugin or something else to make this?或者有没有其他插件或其他东西可以做到这一点?

Unforfortunately, with jsPDF today (2018) it is not supported.不幸的是,今天(2018 年)不支持 jsPDF。

Alternative solution替代方案

But you could edit server side with free PHP library like FPDI .但是您可以使用免费的 PHP 库(如FPDI)编辑服务器端。 With FPDI it is even possible to edit PDF documents, extract some pages and to add them to new PDF documents.使用 FPDI 甚至可以编辑 PDF 文档、提取一些页面并将它们添加到新的 PDF 文档中。 How to do it see here .怎么做请看这里

You could send to your server a request using AJAX and the server do it and gives you a new PDF back.您可以使用 AJAX 向您的服务器发送请求,服务器执行此操作并返回一个新的 PDF。


Update更新

We are in July 2020 and it is not supported with jsPDF.我们在 2020 年 7 月,jsPDF 不支持它。 But some user created pull request about adding (copying) from pages from the same PDF document.但是一些用户创建了关于从同一 PDF 文档的页面添加(复制)的拉取请求 On this link before you can find the sample code how to use his function.在此链接之前,您可以找到示例代码如何使用他的功能。 But it can not add pages from another PDF's .它不能从另一个 PDF 的. The code from his function you can find here .您可以在此处找到他函数中的代码。

Alternative solution with JavaScript PDF-lib使用 JavaScript PDF-lib 的替代解决方案

You can do it with JavaScript "PDF-lib".您可以使用 JavaScript“PDF-lib”来实现。 The source code and other info you can find on GitHub page .您可以在GitHub 页面上找到源代码和其他信息。 A lot of demos from this library you can find on it's project page .你可以在它的项目页面上找到这个库中的很多演示

"PDF-lib" can create and modify PDF documents in any JavaScript environment. “PDF-lib”可以在任何 JavaScript 环境中创建和修改 PDF 文档。 It is designed to work in any modern JavaScript runtime.它旨在在任何现代 JavaScript 运行时中工作。 Tested in Node.JS, Browser, Deno, and React Native environments.在 Node.JS、浏览器、Deno 和 React Native 环境中测试。

API documentation is available on the project site at: API 文档可在项目站点上获得:
https://pdf-lib.js.org/docs/api/ https://pdf-lib.js.org/docs/api/

Example "Create PDF with Embed PDF Pages"示例“使用嵌入的 PDF 页面创建 PDF”

 const { PDFDocument } = PDFLib; async function embedPdfPages() { // Fetch American flag PDF const flagUrl = 'https://pdf-lib.js.org/assets/american_flag.pdf', // Fetch US constitution PDF constitutionUrl = 'https://pdf-lib.js.org/assets/us_constitution.pdf', flagPdfBytes = await fetch(flagUrl).then((res) => res.arrayBuffer()), constitutionPdfBytes = await fetch(constitutionUrl).then((res) => res.arrayBuffer()), // Create a new PDFDocument pdfDoc = await PDFDocument.create(); // Add a blank page to the document var page = pdfDoc.addPage(); // Embed the first page of the American flag PDF const [americanFlag] = await pdfDoc.embedPdf(flagPdfBytes), // Load the constitution PDF into a PDFDocument usConstitutionPdf = await PDFDocument.load(constitutionPdfBytes), // Embed the first page of the constitution firstPageOfConstitution = await pdfDoc.embedPage(usConstitutionPdf.getPages()[0]); // Draw the American flag page page.drawPage(americanFlag); //add a blank new page to the document page = pdfDoc.addPage(); // Draw the first page of the constitution page.drawPage(firstPageOfConstitution); // Serialize the PDFDocument to bytes (a Uint8Array) const pdfBytes = await pdfDoc.save(); // Trigger the browser to download the PDF document download(pdfBytes, "pdf-lib_pdf_page_embedding_example.pdf", "application/pdf"); }
 body { width: 100vw; height: 100vh; display: flex; justify-content: center; align-items: center; flex-direction: column; } p { font-family: helvetica; font-size: 24px; text-align: center; margin: 25px; } .small { font-family: helvetica; font-size: 18px; text-align: center; margin: 25px; } button { background-color: #008CBA; border: none; color: white; padding: 15px 32px; text-align: center; font-size: 16px; }
 <script src="https://unpkg.com/pdf-lib@1.4.0"></script> <script src="https://unpkg.com/downloadjs@1.4.7"></script> <p>Click the button to embed PDF pages with <code>pdf-lib</code></p> <button onclick="embedPdfPages()">Create PDF</button> <p class="small">(Your browser will download the resulting file)</p>


Example "Create PDF with JPEG and other PDF as attachments"示例“使用 JPEG 和其他 PDF 作为附件创建 PDF”

 const { PDFDocument, rgb } = PDFLib async function addAttachments() { // Define attachment URLs const jpgUrl = 'https://pdf-lib.js.org/assets/cat_riding_unicorn.jpg', pdfUrl = 'https://pdf-lib.js.org/assets/us_constitution.pdf', // Fetch attachments jpgAttachmentBytes = await fetch(jpgUrl).then(res => res.arrayBuffer()), pdfAttachmentBytes = await fetch(pdfUrl).then(res => res.arrayBuffer()), pdfDoc = await PDFDocument.create(); // Add the JPG attachment await pdfDoc.attach(jpgAttachmentBytes, 'cat_riding_unicorn.jpg', { mimeType: 'image/jpeg', description: 'Cool cat riding a unicorn!', creationDate: new Date('2019/12/01'), modificationDate: new Date('2020/04/19') }); // Add the PDF attachment await pdfDoc.attach(pdfAttachmentBytes, 'us_constitution.pdf', { mimeType: 'application/pdf', description: 'Constitution of the United States', creationDate: new Date('1787/09/17'), modificationDate: new Date('1992/05/07') }); // Add a page with some text const page = pdfDoc.addPage(); page.drawText('This PDF has two attachments. Note that only some appropriated PDF readers can view attachments. For example the Adobe Reader.', {x: 135, y: 415}); // Serialize the PDFDocument to bytes (a Uint8Array) const pdfBytes = await pdfDoc.save(); // Trigger the browser to download the PDF document download(pdfBytes, "pdf-lib_add_attachments.pdf", "application/pdf"); }
 body { width: 100vw; height: 100vh; display: flex; justify-content: center; align-items: center; flex-direction: column; } p { font-family: helvetica; font-size: 24px; text-align: center; margin: 25px; } .small { font-family: helvetica; font-size: 18px; text-align: center; margin: 25px; } button { background-color: #008CBA; border: none; color: white; padding: 15px 32px; text-align: center; font-size: 16px; } blockquote { background-color: rgba(255,229,100,.3); border-left: 8px solid #ffe564; padding: 15px 30px 15px 15px; }
 <script src="https://unpkg.com/pdf-lib@1.7.0"></script> <script src="https://unpkg.com/downloadjs@1.4.7"></script> <br><br><br> <p>Click the button below to create a document and attach a JPEG image and PDF file with <code>pdf-lib</code></p> <blockquote>Note that only some PDF readers can view attachments. This includes Adobe Reader, Foxit Reader, and Firefox.</blockquote> <button onclick="addAttachments()">Create PDF</button> <p class="small">(Your browser will download the resulting file)</p>

Useful links:有用的链接:

jsPDF can't do this, but pdf-lib can. jsPDF 不能这样做,但pdf-lib可以。 You can combine the two, or just use pdf-lib on its own.您可以将两者结合使用,也可以单独使用pdf-lib To load an existing pdf in pdf-lib , just do this:要在pdf-lib加载现有的 pdf,只需执行以下操作:

async function loadPdf(){
  const response = await fetch('existing.pdf');
  const buffer = await response.arrayBuffer();
  const existingPdfDocBytes = new Uint8Array(buffer);
  const pdfDoc = PDFLib.PDFDocumentFactory.load(existingPdfDocBytes);
  return pdfDoc;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM