【问题标题】:How can I define the encoding of strings in JavaScript script in Adobe Acrobat DC如何在 Adob​​e Acrobat DC 中定义 JavaScript 脚本中的字符串编码
【发布时间】:2020-06-10 18:37:31
【问题描述】:

我在 Adob​​e Acrobat DC 中使用 JavaScript 批量填写可填写的 PDF 表单,并为制表符分隔文件中的每个条目制作副本。

文件为 UTF-8 字符(捷克语)č ř 和 š 在打开文本文件时可见。

当我手动复制和粘贴 PDF 表单中的字符时,我可以看到这些字符。

但是,当我运行 JavaScript 操作时,这些字符没有正确插入。取而代之的是一些奇怪的字符。

JavaScript 是这样的:

var fileName = "/Users/username/tmp/data.txt";  // the tab delimited text file containing the data
var outputDir = "/Users/username/tmp/";    // make sure this ends with a '/'

var err = 0;
var idx = 0;
while (err == 0) {
    err = this.importTextData(fileName, idx); // imports the next record
    if (err == -1)
        app.alert("Error: Cannot Open File");
    else if (err == -2)
        app.alert("Error: Cannot Load Data");
    // else if (err == -3)
        // We are not reporting this error because it does
        // indicate the end of our data table: We've exhausted
        // all rows in the data file and therefore are done with
        // processing the file. Time to exit this loop. 
        // app.alert("Error: Invalid Row");
    else if (err == 1)
        app.alert("Warning: User Cancelled File Select");
    else if (err == 2)
        app.alert("Warning: User Cancelled Row Select");
    else if (err == 3)
        app.alert("Warning: Missing Data");
    else if (err == 0) {
        this.saveAs(outputDir + this.getField("Text1").value + "_" + this.getField("Text2").value + ".pdf"); // saves the file
        idx++;
    }
}```

Please note that credit for this JavaScript goes to Karl Heinz Kremer from http://khkonsulting.com/2015/10/batch-import-excel-data-into-pdf-forms/


【问题讨论】:

  • 出于多种原因,我真的不喜欢 Doc.importTextData 功能。无法控制编码只是其中之一。相反,请使用 Util.readFileIntoStream 然后 Util.stringFromStream 您可以设置编码,然后将文本解析为行和字段以填充您的表单。
  • @joelgeraci 非常感谢您的建议。我会关注并支持它。我也会阅读文档。但如果你有经验,你能举个例子吗?
  • 我将整理一个示例并将其托管在某个地方。

标签: javascript utf-8 adobe acrobat


【解决方案1】:

出于多种原因,我真的不喜欢 Doc.importTextData 功能。无法控制编码只是其中之一。相反,使用 Util.readFileIntoStream() 然后 Util.stringFromStream() 您可以在其中设置编码,然后将文本解析为行和字段以填充您的表单

由于使用路径保存文件的安全限制,此脚本必须从 Acrobat JavaScript 控制台运行。 XLS 中的列名和 PDF 中的字段名必须完全匹配。将 XLS 导出为 CSV UTF-8。字段名称区分大小写。 PDF 中没有对应字段的列将被忽略。

使用:打开您的表单模板,然后从控制台运行此代码。

console.clear();
var baseFileName = this.documentFileName.replace(".pdf", "");
var fileStream = util.readFileIntoStream();
var fileString = util.stringFromStream(fileStream, "utf-8");

var rows = fileString.split("\n");
var columns = rows[0].split(",");

for (var i = 1; i < rows.length; i++) {
    var row = rows[i].split(",");
    for (var j = 0; j < columns.length; j++) {
        var fieldName = columns[j].replace(/[^\x00-\x7F]/g, "");
        var value = row[j];
        console.println(fieldName+": "+value)
        try {
            var field = this.getField(fieldName);
            field.value = value;
        }
        catch (err) { }
    }
    // Customize this area for your own needs. This area builds the output filename.
    var outputFileName = this.getField("last_name").value + "_" + this.getField("first_name").value;
    // Save the file as a copy so that the template can be reused 
    this.saveAs({
        cPath: outputFileName+ ".pdf",
        bCopy: true
    })
}
this.resetForm();

我发布了一组工作示例文件here

【讨论】:

  • 好的,这很完美。和很好的解决方案。输出文件虽然是可编辑的。我必须手动将它们展平吗?
  • 您可以修改此脚本以打开输出文件,然后使用 Doc.flattenPages() 或者您可以只修改模板表单,使字段为只读。只读标志仅适用于用户交互。它们仍然可以通过此脚本进行编辑。
猜你喜欢
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多