首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDFPage.attributedString返回错误的字体

PDFPage.attributedString返回错误的字体
EN

Stack Overflow用户
提问于 2018-05-28 01:51:11
回答 1查看 194关注 0票数 2

我正在使用PDFKit阅读现有的PDF。我得到了一个页面的attributedString,但字符串中的字体与PDF中的实际字体不匹配:

PDF中的字体(根据几个不同的应用程序)是:

代码语言:javascript
复制
CourierFinalDraft        (TypeType Roman) Embedded Subset
CourierFinalDraft-Bold   (TrueType Roman) Embedded Subset
CourierFinalDraft-Italic (TrueType Roman) Embedded Subset

我获取字体的Swift代码是:

代码语言:javascript
复制
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
    }

所有文本都在一个范围内返回。返回的字体如下:

代码语言:javascript
复制
font-family: "Times New Roman"
font-name: "TimesNewRomanPSMT"

因此,粗体和斜体文本返回的范围与普通文本相同,我无法区分它们,这就是我正在尝试做的。以及我还查看的字体名称:

代码语言:javascript
复制
font.fontDescriptor.symbolicTraits.contains(.traitItalic)

但当然,这总是假的,因为所有文本都在相同的范围内返回,就好像它是正常的一样。

这是使用XCode模拟器,如果这是相关的话。PDF可以在模拟器中的Safari上正确呈现(包括粗体和斜体)。不幸的是,我不能在真正的iPhone上试用它。

EN

回答 1

Stack Overflow用户

发布于 2021-09-13 15:17:08

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

代码语言:javascript
复制
    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文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50554922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档