【问题标题】:Replace fonts in Keynote with JXA用 JXA 替换 Keynote 中的字体
【发布时间】:2017-08-12 12:00:36
【问题描述】:

我正在尝试在 Keynote 中查找/替换有问题的字体,并找到 this script 使用 JXA 更改字体,但需要扫描每个字符和文本对象以查找有问题的字体。

我已经尝试过这样开始,但条件不起作用。救命!

PROBLEM_FONT = 'Arial'
REPLACEMENT_FONT = 'Helvetica'

document = Application('Keynote').documents[0]
for slide in document.slides
  for textItem in slide.textItems
    if textItem.objectText.font == PROBLEM_FONT
        textItem.objectText.font = REPLACEMENT_FONT

【问题讨论】:

    标签: javascript applescript automator javascript-automation keynote


    【解决方案1】:

    您提到的 GitHub 要点是用 CoffeeScript 编写的,而不是 JavaScript。它需要被编译(转换)为 JavaScript。您的脚本是另一个脚本的摘录,也是用 CoffeeScript 编写的。

    这里是一个快速的香草 JS 版本的脚本:

    var PROBLEM_FONT = 'Arial';
    var REPLACEMENT_FONT = 'Helvetica';
    var slides = Application('Keynote').documents[0].slides;
    
    for (var i = 0; i < slides.length; i++) {
        var slide = slides[i];
        for (var j = 0; j < slide.textItems.length; j++) {
            var textItem = slide.textItems[j];
            if (textItem.objectText.font === PROBLEM_FONT) {
                textItem.objectText.font = REPLACEMENT_FONT;
            }
        }
    }
    

    重要提示:Arial 的字体名称在“幕后”是不同的;例如,斜体 Arial 被列为“Arial-ItalicMT”。您的脚本没有考虑到这一点,这可能是条件语句失败的原因。

    您可能希望像这样添加子字符串检查:

    (未经测试,但希望你明白)

    var PROBLEM_FONT = 'Arial';
    var REPLACEMENT_FONT = 'Helvetica';
    var slides = Application('Keynote').documents[0].slides;
    
    for (var i = 0; i < slides.length; i++) {
        var slide = slides[i];
        for (var j = 0; j < slide.textItems.length; j++) {
            var textItem = slide.textItems[j];
            if (textItem.objectText.font.indexOf(PROBLEM_FONT) !== -1) {
                textItem.objectText.font = REPLACEMENT_FONT;
            }
        }
    }
    

    如果有帮助,这里是一个纯 AppleScript 版本,其中包括对字体名称的子字符串检查。我已经在 macOS Sierra 上使用 Keynote 7.0.5 成功测试了这一点。

    tell application "Keynote"
    
        if (front document exists) then
            tell every slide of front document
    
                -- Targeting body text
                tell every text item
                    if (the font of its object text as text) contains "Arial" then
                        set the font of its object text to "Monaco"
                    end if
                end tell
    
                -- Targeting slide titles
                tell default title item
                    if (the font of its object text as text) contains "Arial" then
                        set the font of its object text to "Monaco"
                    end if
                end tell
    
                -- Targeting text boxes within groups
                tell every group
    
                    tell every text item
                        if (the font of its object text as text) contains "Arial" then
                            set the font of its object text to "Monaco"
                        end if
                    end tell
    
                end tell
    
            end tell
        end if
    
    end tell
    

    (我在此示例中使用了 Monaco,以便您可以快速判断脚本是否有效,因为 Helvetica 和 Arial 很难区分。)

    【讨论】:

    • 哇,这太棒了,谢谢!我仍在试图理解的一件事是在 Keynote 中使用 PostScript 名称。具体来说,我正在尝试消除所有“本文档中缺少这些字体”警告,并使用它来查找和替换字体。例如,我想查找“HelveticaNeue-Bold”并将其替换为“TimesNewRoman-Italic”,但由于某种原因,它适用于某些字体,但不适用于其他字体。
    • 很高兴它有帮助。 PostScript 名称总是有点难以处理,没有简单的解决方案。这就是我使用部分名称搜索的原因。如果以上答案对您有用,请将其标记为“正确”。谢谢!
    • 我正在努力解决的一件小事是它似乎跳过了一些文本项?我正在查看 Applescript 文档,只看到“文本项”、“默认标题项”、“默认正文项”作为文本对象,但即使我添加了这些,也有一些文本对象不会受到影响?有什么想法吗?
    • 有例外。例如,分组的文本框是嵌套的且未触及。我在上面编辑了我的答案,以演示如何访问 1 级组。如果需要访问嵌套组(组中的组),则需要重写代码以执行递归循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2023-03-30
    • 2022-08-06
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多