我正在使用PDFKit阅读现有的PDF。我得到了一个页面的attributedString,但字符串中的字体与PDF中的实际字体不匹配:
PDF中的字体(根据几个不同的应用程序)是:
CourierFinalDraft (TypeType Roman) Embedded Subset
CourierFinalDraft-Bold (TrueType Roman) Embedded Subset
CourierFinalDraft-Italic (TrueType Roman) Embedded Subset我获取字体的Swift代码是:
guard let page = pdf.page(at: pageNo) else { return }
guard let content = page.attributedString else { return }
content.enumerateAttributes(in: range, options:[]) {(dict: [String:Any], range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
let font = dict[NSFontAttributeName] as! UIFont
}所有文本都在一个范围内返回。返回的字体如下:
font-family: "Times New Roman"
font-name: "TimesNewRomanPSMT"因此,粗体和斜体文本返回的范围与普通文本相同,我无法区分它们,这就是我正在尝试做的。以及我还查看的字体名称:
font.fontDescriptor.symbolicTraits.contains(.traitItalic)但当然,这总是假的,因为所有文本都在相同的范围内返回,就好像它是正常的一样。
这是使用XCode模拟器,如果这是相关的话。PDF可以在模拟器中的Safari上正确呈现(包括粗体和斜体)。不幸的是,我不能在真正的iPhone上试用它。
发布于 2021-09-13 15:17:08
这个问题有几年了,但我发现我必须制作数据的可变副本以便与其交互,然后使用可用的信息来修改底层字体并重新显示它。
let str = content.mutableCopy() as! NSMutableAttributedString
str.beginEditing()
str.enumerateAttribute(.font,
in: NSRange(location: 0, length: str.length),
options: []) { value, range, _ in
guard let value = value as? UIFont else {
return
}
let isBold = value.fontDescriptor.symbolicTraits.contains(.traitBold)
let font = // Your font logic here based on traits
str.removeAttribute(.font, range: range)
str.addAttribute(.font, value: font, range: range)
str.addAttribute(.paragraphStyle, value: style, range: range)
}
str.endEditing()对于更大的pdf,我还没有讨论过性能问题,但它似乎不会占用10-20页的pdf太多的资源。对于更多的页面,我很可能会创建一个实际的分页机制,然后针对每个页面进行动态调整,而不是循环整个pdf文件。
https://stackoverflow.com/questions/50554922
复制相似问题