如何修改Google Apps Script,实现网页转类浏览器打印的纯文本PDF
问题
需要将Google Sheet中的批量URL转换为适合文本分析的纯文本PDF文件。现有Google Apps Script代码生成的PDF包含多余页眉、HTML元素,体验较差;而浏览器直接打印网页能得到干净的纯文本样式PDF。如何修改代码实现类似浏览器打印的效果?
原使用代码:
function saveURLAsPDF() { var ss = SpreadsheetApp.openById("1_4rjweZYHTTed6j740rVSZIFVPsrww6KvKwFikmlOzM") var sheetName = "Sheet1" var sheet = ss.getSheetByName(sheetName) var data = sheet.getDataRange().getValues() var links = data.map(function(e){return e[0]}) //Logger.log(links) // DEBUG // Create a new folder var parentFolderId = "1ASMLEDl8rYEQG595TZYtZ9DVUa2u97n_" var parentFolder = DriveApp.getFolderById(parentFolderId); var pdfFolder = parentFolder.createFolder("PDFS"); // create arrays to track errors, file url, and file name var errors = [] var pdfURL = [] var fileName = [] for (var i=0;i<links.length;i++){ //Logger.log("DEBUG: i"+i+", url:"+links[i]) var url = links[i] var parseID = url.toString().split("/")[7] //Logger.log(parseID) var pdfName = +(i+1)+"-"+parseID+".pdf" //Logger.log("i:"+i+", name: "+pdfName) try{ var response = UrlFetchApp.fetch(url); var htmlBody = response.getContentText(); var blob = Utilities.newBlob(htmlBody,'text/html').getAs('application/pdf').setName(pdfName); var newFile = pdfFolder.createFile(blob); var fileURL= newFile.getUrl() errors.push(['OK']) pdfURL.push([fileURL]) fileName.push([pdfName]) } catch (error){ errors.push(["failed"]) pdfURL.push([" "]) fileName.push([" "]) } } sheet.getRange(1,2,links.length,1).setValues(errors) sheet.getRange(1,3,links.length,1).setValues(fileName) sheet.getRange(1,4,links.length,1).setValues(pdfURL) }
测试用Google Sheet:ID为1_4rjweZYHTTed6j740rVSZIFVPsrww6KvKwFikmlOzM的表格
问题表现:生成的PDF包含冗余元素,与浏览器打印的纯文本效果差异明显
解决方案
核心思路是模拟浏览器打印时的样式重置,通过注入自定义CSS隐藏冗余元素、优化排版,同时用HtmlService.createHtmlOutput替代直接转换原始HTML,还原浏览器级别的渲染效果。
修改后的代码
function saveURLAsPDF() { var ss = SpreadsheetApp.openById("1_4rjweZYHTTed6j740rVSZIFVPsrww6KvKwFikmlOzM") var sheetName = "Sheet1" var sheet = ss.getSheetByName(sheetName) var data = sheet.getDataRange().getValues() var links = data.map(function(e){return e[0]}) var parentFolderId = "1ASMLEDl8rYEQG595TZYtZ9DVUa2u97n_" var parentFolder = DriveApp.getFolderById(parentFolderId); var pdfFolder = parentFolder.createFolder("PDFS"); var errors = [] var pdfURL = [] var fileName = [] // 自定义打印样式:隐藏冗余元素、优化文本排版 var printStyle = ` <style> @page { margin: 1cm; size: A4; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 100%; padding: 0.5cm; } /* 隐藏常见冗余元素,可根据目标网页调整选择器 */ header, footer, nav, aside, .ad-banner, .sidebar, .menu-bar { display: none !important; } /* 保证内容自适应页面 */ img { max-width: 100%; height: auto; } table { width: 100%; border-collapse: collapse; margin: 1em 0; } th, td { border: 1px solid #ddd; padding: 0.5em; } </style> `; for (var i=0;i<links.length;i++){ var url = links[i] var parseID = url.toString().split("/")[7] var pdfName = (i+1)+"-"+parseID+".pdf" try{ var response = UrlFetchApp.fetch(url); var htmlBody = response.getContentText(); // 将自定义样式插入HTML头部 var modifiedHtml = htmlBody.replace('</head>', printStyle + '</head>'); // 用HtmlService模拟浏览器渲染,设置接近A4的尺寸 var htmlOutput = HtmlService.createHtmlOutput(modifiedHtml) .setWidth(800) .setHeight(1130); var blob = htmlOutput.getAs('application/pdf').setName(pdfName); var newFile = pdfFolder.createFile(blob); var fileURL= newFile.getUrl() errors.push(['OK']) pdfURL.push([fileURL]) fileName.push([pdfName]) } catch (error){ errors.push(["failed"]) pdfURL.push([" "]) fileName.push([" "]) } } sheet.getRange(1,2,links.length,1).setValues(errors) sheet.getRange(1,3,links.length,1).setValues(fileName) sheet.getRange(1,4,links.length,1).setValues(pdfURL) }
关键修改说明
- 注入自定义CSS:通过
@page规则定义PDF页面边距和尺寸,重置全局样式消除默认间距,同时隐藏网页中常见的冗余模块(如导航栏、广告栏等),可根据目标网页的实际结构调整CSS选择器。 - 使用HtmlService渲染:替代直接用
Utilities.newBlob转换HTML,HtmlService模拟Chrome浏览器的渲染逻辑,生成的PDF排版更接近浏览器打印效果。 - 设置渲染尺寸:通过
setWidth和setHeight设置与A4纸匹配的渲染尺寸,保证内容排版的一致性。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

