以pdf JavaScript形式下载base64时出现问题



我正在编写一个谷歌应用程序脚本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

最新更新