我正在编写一个谷歌应用程序脚本Web应用程序,我遇到了一个问题。
从服务器端,我返回页面的base64编码html代码:
function getRAW() {
var formText = 'https://www.google.com/';
var response = UrlFetchApp.fetch(formText);
var pdf1 = response.getAs('application/pdf');
//var myNewFile = DriveApp.createFile(pdf1);
var blob = response.getBlob()
var bytes = blob.getBytes();
var encoded = Utilities.base64Encode(bytes);
return encoded
}
而且效果很好。现在,从客户端,我想下载base64(是一个html RAW内容(作为pdf文件(或.html,如果可能的话(,但如果我尝试这样做,我会获得一个空白的pdf页面
function downloadRAW() {
var encoded = window.value;
var element = document.createElement('a');
element.setAttribute('href', 'data:application/pdf;base64,' + encoded);
element.setAttribute('download', 'prova');
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
注意,如果我试图获得一个text/plain;base64,
完美工作(返回.txt(文件;但这不是我想要的。
我怎样才能做到这一点?
我相信你的目标和目前的情况如下。
- 您希望将HTML数据转换为PDF数据作为原始HTML代码。
- 从
I want to download the base64 (is an html RAW content) as a pdf file
,我认为PDF数据具有原始HTML代码
- 从
- 您希望让用户将HTML数据下载为PDF文件
- Javascript端的
var encoded = window.value;
是Google Apps Script的getRAW()
函数中encoded
的值
修改点:
- 在这种情况下,为了将原始HTML代码(文本数据(转换为PDF数据,我建议使用谷歌文档。当使用谷歌文档时,文本数据可以转换为PDF数据
当以上几点反映到您的脚本中时,它变成如下。
修改的脚本:
在这种情况下,请在谷歌应用程序脚本端修改getRAW()
,如下所示。
function downloadRAW() {
var formText = 'https://www.google.com/';
var html = UrlFetchApp.fetch(formText).getContentText();
var doc = DocumentApp.create("temp");
doc.getBody().editAsText().setText(html);
doc.saveAndClose();
var file = DriveApp.getFileById(doc.getId());
var blob = file.getBlob();
var bytes = blob.getBytes();
var encoded = Utilities.base64Encode(bytes);
file.setTrashed(true);
return encoded
}
- 在本次修改中,首先将检索到的HTML数据放入作为临时文档创建的Google文档中,然后将Google文档转换为PDF数据并转换为base64数据,并返回数据。并且,临时文档被移除
注意:
从
(or .html if it is possible)
,如果您想将其导出为文本文件,那么以下修改如何?谷歌应用程序脚本端:
function downloadRAW() { var formText = 'https://www.google.com/'; var blob = UrlFetchApp.fetch(formText).getBlob().setContentType("text/html"); var bytes = blob.getBytes(); var encoded = Utilities.base64Encode(bytes); return encoded }
Javascript端:
在这种情况下,请按如下方式修改
element.setAttribute('href', 'data:application/pdf;base64,' + encoded);
。element.setAttribute('href', 'data:text/html;base64,' + encoded);
从你的问题中,我无法理解将Google Apps Script端的
encoded
的值赋予Javascript端的var encoded = window.value;
的方法。因此,如果您想查看此脚本的示例。我觉得这个线索可能有用。参考当HTML的blob转换为
application/json
时,无法检索原始HTML代码。获得渲染结果。请小心。
参考文献:
- 创建类DocumentApp(名称(
- saveAndClose((
- getFileById(id(
即使@Tanaike提出的解决方案非常好,我也不想在用户的Google Drive中使用额外的权限写入文件(因为我的脚本是以"以用户身份运行"的方式执行的(,所以我决定使用JsPDF。
客户端代码:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
function downloadRAWPDF() {
// window.value is a global variable that contains base64 encoded content (passed from server)
var encoded = window.value;
var decoded = atob(encoded);
var doc = new jsPDF();
// Resize text to fit in an A4 page
var splitTitle = doc.splitTextToSize(decoded, 270);
var pageHeight = doc.internal.pageSize.height;
doc.setFontType("normal");
doc.setFontSize("11");
var y = 7;
for (var i = 0; i < splitTitle.length; i++) {
if (y > 280) {
y = 10;
doc.addPage();
}
doc.text(15, y, splitTitle[i]);
y = y + 7;
}
doc.save('myPDF.pdf');
}
服务器端代码(谷歌应用程序脚本(:
// @return RAW Response base64 encoded (without response headers)
function getRAW(formObject) {
// contains the value of an Input Field
var formText = formObject.myInput;
var response = UrlFetchApp.fetch(formText);
var blob = response.getBlob()
var bytes = blob.getBytes();
var encoded = Utilities.base64Encode(bytes);
return encoded
}
要将文件转换为html文件,@Tanaike建议的方法是完美的:data:text/html;base64, + encoded