Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将base64下载为pdf JavaScript时出现问题_Javascript_Pdf_Google Apps Script - Fatal编程技术网

将base64下载为pdf JavaScript时出现问题

将base64下载为pdf JavaScript时出现问题,javascript,pdf,google-apps-script,Javascript,Pdf,Google Apps Script,我正在写一个谷歌应用程序脚本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.create

我正在写一个谷歌应用程序脚本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原始内容)作为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);
}
注意,如果我试图获得
文本/纯文本;base64,
工作正常(返回一个.txt文件);但这不是我想要的


我怎样才能实现它?

我相信你的目标和你目前的情况如下

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
}
  element.setAttribute('href', 'data:text/html;base64,' + encoded);
  • 您希望将HTML数据转换为PDF数据作为原始HTML代码。
    • 我想从
      下载base64(是一个html原始内容)作为pdf文件
      ,我认为pdf数据具有原始html代码
  • 您希望让用户以PDF文件的形式下载HTML数据
  • var encoded=window.value是来自Google Apps脚本的
    getRAW()
    函数的
    encoded
    的值
修改点:
  • 在本例中,为了将原始HTML代码(文本数据)转换为PDF数据,我建议使用Google文档。使用Google文档时,文本数据可以转换为PDF数据
当上述各点反映到脚本中时,它将变成如下所示

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
}
  element.setAttribute('href', 'data:text/html;base64,' + encoded);
修改脚本: 在这种情况下,请在Google Apps脚本端修改
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
}
  element.setAttribute('href', 'data:text/html;base64,' + encoded);
  • 在这个修改中,首先,检索到的HTML数据被放入作为临时文档创建的Google文档中,然后,Google文档被转换为PDF数据并转换为base64数据,然后返回数据。并且,移除临时文档
注:
  • (或.html,如果可能)
    ,如果您想将其导出为文本文件,下面的修改如何

    • 谷歌应用程序脚本端:

        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方面:

        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
        }
      
      • 在这种情况下,请修改
        element.setAttribute('href','data:application/pdf;base64',+encoded)如下所示

        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
        }
        
          element.setAttribute('href', 'data:text/html;base64,' + encoded);
        
  • 从你的问题中,我无法理解如何将Google Apps脚本端的
    encoded
    值赋予
    var encoded=window.value。因此,如果您想查看这个示例脚本。我想这条线可能有用

  • 当HTML块转换为
    application/json
    时,无法检索原始HTML代码。得到了渲染结果。请小心这个

参考资料:

即使@Tanaike提出的解决方案非常好,我也不想在用户的Google驱动器中使用额外的文件写入权限(因为我的脚本是以“以用户身份运行”的方式执行的),所以我决定使用

客户端代码:

<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');
}

要将文件转换为html文件,@Tanaike建议的方法非常完美:
data:text/html;base64,+编码的

PDF是二进制文件,而不是base64encoded@freefaller所以我想我不能这么做。。。如果我将pdf1(代码的第一部分)返回给客户端,有没有办法使其可下载?(这是application/pdf中的一个blob)对不起,我对应用程序脚本一无所知,但是当我处理二进制文件(来自服务器端的.Net应用程序)时,我将头值设置为包含“附件”。可能值得检查,特别是
下载
属性谢谢你的帮助,我找到了一些使用库实现我想要的解决方案,我将在这里发布解决方案。您提出的解决方案很好,使用谷歌文档保存并转换为PDF的方式非常聪明!我在JavaScript客户端代码中使用了window.value作为全局变量,目前正在搜索一些workaround@Fabio谢谢你的回复。很抱歉,我的回答对你的情况没有帮助。这是因为我的技术差。我再次道歉。但是,我认为我的方法可能对其他用户有用。所以,在这种情况下,我想留下我的答案。别担心,你的方法很好,很聪明,你的回答很详细,有人可以利用它,所以留下你的答案。再次感谢您的帮助!