PDFPage.attributedString 返回错误的字体



我正在使用PDFKit阅读现有的PDF。我得到了一个页面的属性字符串,但字符串中的字体与 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)

但当然,这始终是 False,因为所有文本都以相同的范围返回,就好像它是正常的一样。

这是使用XCode模拟器,以防相关。PDF 确实在模拟器的 Safari 上正确呈现(包括粗体和斜体(。不幸的是,我无法在真正的iPhone上尝试一下。

这个问题已经有几年了,但我发现我必须制作数据的可变副本才能与之交互,然后使用可用信息来修改底层字体并重新显示它。

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文件。

最新更新