كيفية تحويل HTML إلى PDF باستخدام جوجل سكريبت

باستخدام Google Apps Script، يمكنك بسهولة تحويل أي محتوى HTML إلى ملف PDF. يمكن حفظ ملف PDF المحول إما في مجلد في Google Drive، أو يمكنك إرسال الملف بالبريد الإلكتروني كمرفق أو استخدام خدمة UrlFetchApp الخاصة بـ Apps Script لنشر ملف PDF إلى خدمة خارجية مثل Amazon S3 أو Dropbox.
/* This function will convert HTML content to a PDF file,
and also send it as an email attachment */
const convertHTMLtoPDF = () => {
const htmlContent = `
<p>All standard HTML5 tags are supported during conversion
including <b>bold</b>, <i>italic</i>, <u>underline</u>, tables,
and <a href="https://digitalinspiration.com/">inline URLs</a></p>`;
const blob = Utilities.newBlob(htmlContent, MimeType.HTML);
blob.setName('file.pdf');
const recipientEmail = 'amit@labnol.org';
const emailSubject = 'The PDF file is attached';
MailApp.sendEmail({
to: recipientEmail,
subject: emailSubject,
htmlBody: htmlContent,
attachments: [blob.getAs(MimeType.PDF)],
});
};
يوصى بهذا الأسلوب لأنه لا يتطلب الوصول إلى أي نطاقات OAuth حساسة ويستخدم خدمات الأدوات المساعدة في Apps Script لإنشاء كائن Blob من سلسلة HTML.
إنشاء ملفات PDF باستخدام Google Drive
يمكنك أيضًا استخدام البرنامج النصي Advanced Drive Service of Apps لتحويل محتوى HTML إلى PDF باستخدام مستند Google في خطوة متوسطة.
تتمثل الفكرة في إنشاء مستند Google في Drive باستخدام محتوى HTML الخاص بك ثم تصدير هذا المستند كملف PDF وإلقاء المستند المؤقت في سلة المهملات. أو يمكنك تجاوز محتوى مستند HTML باستخدام PDF blob.
للبدء، انتقل إلى محرر Apps Script، وافتح ملف appsscript.json
ملف البيان ونطاق التحديث كما هو موضح أدناه:
{
"dependencies": {
"enabledAdvancedServices": [
{
"userSymbol": "Drive",
"serviceId": "drive",
"version": "v2"
}
]
},
"oauthScopes": ["https://www.googleapis.com/auth/drive.file"],
"runtimeVersion": "V8",
"timeZone": "Asia/Kolkata",
"exceptionLogging": "STACKDRIVER"
}
بعد ذلك، داخل محرر الكود الرئيسي، قم بلصق المقتطف التالي. يستغرق الأمر نهجًا من ثلاث خطوات:
- تحويل سلسلة HTML إلى blob
- قم بتحويل Blob إلى مستند Google
- قم بتصدير مستند Google كملف PDF وقم بإزالة الملف الذي تم إنشاؤه في الخطوة 2.
const convertHTMLtoPDF = () => {
const htmlContent = `
<p>All standard HTML5 tags are supported during conversion
including <b>bold</b>, <i>italic</i>, <u>underline</u>, tables,
and <a href="https://digitalinspiration.com/">inline URLs</a></p>`;
const { id, exportLinks } = Drive.Files.insert(
{ mimeType: MimeType.GOOGLE_DOCS },
htmlBlob: Utilities.newBlob(htmlContent, MimeType.HTML)
);
const pdfExportLink = exportLinks[MimeType.PDF];
const blob = UrlFetchApp.fetch(pdfExportLink, {
headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` },
}).getBlob();
Drive.Files.trash(id);
const { alternateLink } = Drive.Files.insert({ title: "file.pdf" }, blob);
Logger.log("View file %s", alternateLink);
};
نصيحة: نحن نستخدم drive.file
نطاق أقل في ملف البيان، ولكن إذا كنت ترغب في حفظ الملفات في مجلدات محددة في Google Drive، أو مساحات Drive المشتركة، فاستخدم النطاق الأوسع googleapis.com/auth/drive
نِطَاق.
قم بتحويل HTML إلى PDF باستخدام Chrome Puppeteer
إذا كنت ترغب في إنشاء محرك تحويل HTML إلى PDF مستقل لا يستخدم أيًا من خدمات Google Drive، فيمكن أن يكون Chrome Puppeteer مع Node JS خيارًا جيدًا. يمكنك استضافة الخدمة على وظائف AWS Lambda أو Google Cloud واستدعاء الخدمة من خلال مكالمة HTTP.
const express = require('express');
const chromium = require('chrome-aws-lambda');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
const html2pdf = async (html) => {
const browser = await chromium.puppeteer.launch({
args: chromium.args,
executablePath: await chromium.executablePath,
headless: true,
ignoreHTTPSErrors: true,
});
const page = await browser.newPage();
await page.setContent(html, {
waitUntil: ['networkidle0', 'load', 'domcontentloaded'],
timeout: 30000,
});
const pdf = await page.pdf({
format: 'A4',
printBackground: true,
});
await browser.close();
return pdf;
};
app.post("https://www.labnol.org/pdf", async (request, response) => {
try {
const { content } = request.body;
const pdf = await html2pdf(content);
response.contentType('application/pdf');
response.status(200).send(pdf);
} catch (f) {
response.status(500).send(f.message);
}
});
const PORT = process.env.PORT || 8080;
app.listen(PORT, async () => {
console.log(`App listening on port ${PORT}`);
});