通过 Apps 脚本中的 UrlFetchApp 打印 PDF 时出现问题:Gujarati (Shruti) 字体呈现额外的行间距和空格

问题描述 投票:0回答:1

在 Google Sheets 中,当我们使用 Apps Script 内置方法中的 UrlFetchApp 将范围打印为 PDF 时,古吉拉特语 (Shruti) 字体比工作表占用更多空间;当我们使用“打印”按钮或“Ctr + P”打印相同的范围时,它会打印具有正确空格的字体。

我观察到这两种方法都完美地呈现了英文字体。但是,当通过 UrlFetchApp 打印 PDF 时,古吉拉特字体的行间距更大,占用的尺寸也更大。

是否有任何选项或任何其他方法,我可以通过 Apps 脚本使用他们的“Ctr + P”功能?

有没有其他方法可以像“Ctr + P”那样以占用更少空间的方式渲染古吉拉特字体?

示例: 查看此 Google 电子表格(您是编辑者)

步骤:

  1. 选择范围“A1:A13”,然后单击打印按钮或Ctr + P,选择“选定的单元格”进行打印。
  2. 通过扩展 > 打印 > 下载范围 A1:A13 打印范围。 (Apps 脚本项目和代码位于电子表格中)
  3. 比较 PDF 和工作表。
google-apps-script google-sheets pdf-generation
1个回答
0
投票

建议:

我无法想出一种方法将文本换行应用于生成的 PDF 文件,但我注意到将文件复制到 Google 文档并生成下载 URL 可以保留表格格式,即使使用古吉拉特语 (Shruti) 字体也是如此。这是我煮的。

function onOpen() {
  SpreadsheetApp.getUi()
    .createAddonMenu()
    // .addItem('Export all sheets', 'exportAsPDF')
    // .addItem('Export all sheets as separate files', 'exportAllSheetsAsSeparatePDFs')
    // .addItem('Export current sheet', 'exportCurrentSheetAsPDF')
    // .addItem('Export selected area', 'exportPartAsPDF')
    // .addItem('Export predefined area', 'exportNamedRangesAsPDF')
    .addItem('Download range A1:A13', 'downloadSpecificRangeAsPDF')
    .addToUi()
}

function downloadSpecificRangeAsPDF() {

  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheet = ss.getSheetByName("Print this using url and using default function");
  var specificRangeA1 = 'A2:A13';
  var range = sheet.getRange(specificRangeA1);
  var backgrounds = range.getBackgrounds();
  var fontfamily = range.getFontFamilies().flat();
  var fontstyles = range.getFontStyles();
  var fontweight = range.getFontWeights();
  var fontsize = range.getFontSizes().flat();
  var fontcolor = range.getFontColorObjects().flat();
  var values = range.getValues();  
  var sheetName = ss.getName();
  
  var docId = DocumentApp.create(sheetName).getId();
  var doc = DocumentApp.openById(docId);
  var docUrl = doc.getUrl();
  console.log(docUrl);
  var fileName = doc.setName(sheetName);
  var body = doc.getBody();
  var table = body.appendTable(values);

  console.log(fontstyles);

  for(let i = 0; i < table.getNumRows(); i++){
    var style = {};
    style[DocumentApp.Attribute.FONT_FAMILY] = fontfamily[i]; 
    style[DocumentApp.Attribute.FONT_SIZE] = fontsize[i]; 
    style[DocumentApp.Attribute.FOREGROUND_COLOR] = fontcolor[i].asRgbColor().asHexString();
    style[DocumentApp.Attribute.BOLD] = fontweight[i] == 'bold' ? true: false;
    console.log(style)
    table.getCell(i,0).setBackgroundColor(backgrounds[i]);

    if(style.FOREGROUND_COLOR != '#ff000000'){
    table.getRow(i).setAttributes(style);
    }

  }
  doc.saveAndClose(); 
  const url = "https://docs.google.com/document/d/" + docId + "/export" +
      "?format=pdf"

  downloadPDF(fileName, url, header = "Downloading: " + fileName)
  
}

function downloadPDF(fileName, url, header){
  
  fileName += '.pdf';
  var res = UrlFetchApp.fetch(url, {
    headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
    muteHttpExceptions: true,
  });

  SpreadsheetApp.getUi().showModelessDialog(
    HtmlService.createHtmlOutput(
      '<a target ="_blank" download="' +
      fileName +
      '" href = "data:application/pdf;base64,' +
      Utilities.base64Encode(res.getContent()) +
      '">Click here</a> to download, if download did not start automatically' +
      ' \
  var a = document.querySelector("a"); \
  a.addEventListener("click",()=>{setTimeout(google.script.host.close,300)}); \
  a.click(); \
  '
  
    ).setHeight(50),
    header? header : 'Downloading PDF..'
  );

}

它的作用是创建一个 Google 文档,然后我更改 URL 以使用创建的 Google 文档将其下载为 PDF。

截图:

© www.soinside.com 2019 - 2024. All rights reserved.