将ttf/woff/woff2文件重命名为带有脚本的PostScript字体名称

6
我是一名印刷排版师,使用了许多字体,但有些字体的文件名不正确或不完整。我使用Mac,尝试使用HazelAppleScriptAutomator工作流程来自动重命名这些文件*。我需要一个脚本,将Finder中ttfwoffwoff2文件的现有文件名替换为字体的postscriptName。我知道有工具(fc-scan/fontconfigTTX等)可以检索我需要的PostScript名称值,但缺乏编写符合我的要求的脚本的编程技能。我只能设置一个监视目录,当添加符合某些参数的任何文件时运行脚本。

*澄清一下,我只是在谈论更改文件名,而不是字体内存储的实际名称。此外,如果可能的话,我可以接受任何兼容语言的脚本或脚本工作流程,例如this post引用通过osascript将AppleScript 嵌入Shell脚本。

我参考的StackExchange帖子:
如何从OTF或TTF文件中获取字体名称?
如何在OS X中获取TTF字体的PostScript名称?
如何更改字体名称?
自动重命名macOS中的文件

其他资源:
https://github.com/dtinth/JXA-Cookbook/wiki/Using-JavaScript-for-Automation
https://github.com/fonttools/fonttools
https://github.com/devongovett/fontkit
https://www.npmjs.com/package/rename-js
https://opentype.js.org/font-inspector.html
http://www.fontgeek.net/blog/?p=343
https://www.lantean.co/osx-renaming-fonts-for-free

编辑:按照要求添加以下内容。
1) 展示了一个相对典型的网络字体截图,说明字体系列和风格名称的表单字段通常是不完整的、空白的或包含非法字符的。
2) 所示woff文件(同时也是base64)。 截图 提前感谢大家!


在我们深入探讨之前...你到底在做什么需要重命名文件的事情?我所知道的几乎所有技术都会从实际的OpenType元数据中读取字体系列名称,而不是文件名(这对于解析器来说将是极其错误的),因此根据我对OpenType规范和OpenType字体的了解,没有任何理由这样做。你能解释一下这里发生了什么吗? - Mike 'Pomax' Kamermans
是的,如果安装了,大多数字体名称将正确显示,而不管文件名如何。但这需要时间来安装和检查这些文件,并且它无法帮助组织我的文件系统。此外,在Web字体中,常常缺少字体系列和/或风格名称,但PostScript名称完好无损,这就是我选择该信息的原因。我知道可以通过转换器运行相关的字体文件,输出具有更准确名称的新文件,但在转换过程中可能会出现许多错误或遗失。 - Moscarda
不是真的,如果你需要处理大量字体,你应该使用字体管理器,而不是操作系统提供的任何糟糕的字体管理工具。这样可以让你批量检查、选择性安装等等,而不必让操作系统做一些愚蠢的事情(比如“必须把它们放在C:\Windows\Fonts目录中”等等)。至于“通过转换器运行”,实际上,只要使用正确的工具,就很少会出现问题。你需要使用TTX,它可以进行适当的往返转换,并且非常适合将PostScript名称批量复制到名称表中作为家族字符串ID。 - Mike 'Pomax' Kamermans
是的,这是一个基于Python的应用程序,你只需要编写更多的Python代码,使用TTX作为库调用来将字体转换为XML,使用基本的XML解析器更新名称表,然后根据找到的PostScript名称将XML转换回字体即可。 - Mike 'Pomax' Kamermans
虽然我稍微涉猎了一下编程,但我绝不是程序员。我不指望这里的任何人为我做所有的工作,但你能指点我一下,让我知道如何入门吗?我对Python和XML有些了解,并且我知道TTX的用途,但我不知道如何将它们组合成一个单一的脚本。我相信对于程序员来说这很简单,而我想学习,但我肯定更多地是创意人员而不是编码人员。非常感谢任何和所有的帮助! - Moscarda
显示剩余2条评论
1个回答

7

由于您在问题中提到了Automator,我想尝试使用它来重命名文件,以及标准的Mac bash获取字体名称来解决这个问题。希望这能比学习一种完整的编程语言更好。

我不知道您的工作流程是什么,所以我会把任何偏差留给您,但这是一种选择字体文件并从服务中将文件重命名为字体的Postscript名称的方法……基于苹果的元数据,特别是“com_apple_ats_name_postscript”。这是使用终端上的“mdls”从字体文件检索到的数据之一。要专注于Postscript名称,请在输出中使用grep查找name_postscript。为简单起见,在此处我将排除所选文件的路径。

字体名称获取

所以…运行这个命令…

mdls GenBkBasBI.ttf | grep -A1 name_postscript

…生成包含FontBook的Postscript名称的此输出。grep中的“A1”返回找到的行和其后的第一行,即包含实际字体名称的行。

com_apple_ats_name_postscript  = (
    "GentiumBookBasic-BoldItalic"

使用更多的bash命令(tr,tail)来清理它...

tr -d \  | tail -n 1 | tr -d \"

按顺序,这些会去除空格、除最后一行外的所有行以及引号。因此,在第一个“tr”实例中,反斜杠后面有一个额外的空格。
在单行中,它看起来像这样...
mdls GenBkBasBI.ttf | grep -A1 name_postscript | tr -d \  | tail -n 1 | tr -d \" 

...并且产生了这个...

GentiumBookBasic-BoldItalic

现在,这是包含上述bash命令的工作流程。我从这个问题的答案中得到了使用变量的想法... Apple Automator“New PDF from Images” maintaining same filename 自动化工作流程 自动化工作流程截图 顶部:服务接收'Finder'中选择的“文件或文件夹”。
  1. 获取所选查找器项目
这(或获取指定的...)是为了允许测试。通过将其用作服务来避免这种情况。
  1. 设置变量(文件)的值
这是为了记住要重命名的文件。
  1. 运行Shell脚本
这就是我们使用bash的地方。$ f是所选/指定的文件。我正在运行'zsh',出于某种原因。您可以将其设置为您正在运行的任何内容,可能是'bash'。
  1. 设置变量的值(文本)

将bash输出分配给变量。这将由最后一个操作用于新文件名。

  1. 获取变量的值(文件)

召回指定/选择的文件以进行重命名。

  1. 重命名Finder项目:名称单个项目

我将其设置为“仅基本名称”,因此它将保留扩展名不变。在此处输入第4步骤中的“文本”变量。


哇,这听起来很不错...但我有几个问题... 1)你提到了FontBook:在安装字体之前更改名称是否不可能?除非无法避免,否则我宁愿不在我的工作流程中使用FontBook。2)几年前我尝试过zsh,但当我发现两者之间的格式差异可能会导致一些脚本出错时,我很快就切换回了bash。你是说在这种情况下差异不重要吗?3)你介意上传你测试答案时创建的最终Workflow/Service吗?谢谢! - Moscarda
Font Book不是工作流程的一部分。我只提到它是为了展示mdls命令的输出与其一致。没有任何需要“安装”的东西。bash/zsh部分是一个单行命令。我想象不出它会有什么区别。但你可以自己运行该命令以确认它是否生成了正确的输出。我认为我不能上传任何声誉为1的东西。甚至连截图都不行 :) 所以从这一点上开始,你就得靠自己了。但重新创建服务不应该超过两分钟。干杯。 - Mockman
这个字段的名称是什么?你能给我指出一个示例网页字体和相应的名称吗? - Mockman
我简直不敢相信我忘了这个。我会上传一张图片和一个示例。许多但并非所有有问题的Web字体都是商业字体,这可能解释了缺少信息-它们不需要桌面字体那么多的信息。但需要明确的是,我只是试图整理我自己或客户已购买的字体。我从未修改或反向工程化任何违反其最终用户许可协议的内容。 - Moscarda
这是实际文件的链接,我没有意识到不能直接添加它们。woff - Moscarda
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接