DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 17
在线用户: 13
导航: 论坛 -> 发布代码 斑竹:liumazi,ruralboy  
作者:
男 robin_tlh (robinttt) ▲▲▲▲△ -
普通会员
2023/9/10 20:16:41
标题:
读写字体文件嵌入性的函数 浏览:633
加入我的收藏
楼主: WPS自从更新到某个版本后,导出PDF时如发现字体受限(比如FZ)则无法正常导出。墙内墙外查了好几天,总算研究出读写字体文件嵌入性的方法。
以下代码仅限内部交流,修改字体收到律师函概不负责哦~

Function ReadFontFsType(SrcPath: String): Integer;
Var
  i, OffSet: Integer;
  Stream: TFileStream;
  Buffer: TBytes;
Begin
  // -1:不是字体文件或不是0248;0:可安装;2:受限制的许可证;4:打印和预览;8:可编辑
  Result := -1;
  SetLength(Buffer, 4);
  Stream := TFileStream.Create(SrcPath, fmOpenRead);
  Stream.Position := 0;
  For i := 0 To Stream.Size - 5 Do Begin
    Stream.Seek(i, soFromBeginning);
    Stream.ReadBuffer(Buffer, 4);
    If (Buffer[0] = $4F) And (Buffer[1] = $53) And (Buffer[2] = $2F) And (Buffer[3] = $32) Then Begin
      Stream.Seek(4, soFromCurrent);
      Stream.ReadBuffer(Buffer, 4);
      OffSet := Buffer[0] * 16777216 + Buffer[1] * 65536 + Buffer[2] * 256 + Buffer[3] + 9;
      // Read FsType Code
      Stream.Seek(OffSet, soFromBeginning);
      SetLength(Buffer, 1);
      Stream.ReadBuffer(Buffer, 1);
      Result := Buffer[0];
      Break;
    End;
  End;
  Stream.Free;
End;

Function WriteFontFsType(SrcPath: String; FsType: Integer): Integer;
Var
  i, OffSet: Integer;
  Stream: TFileStream;
  Buffer: TBytes;
Begin
  // -1:不是字体文件或不是0248;0:待写入数据与源文件一致;1-写入成功
  //注意:写入成功,系统注销后生效
  Result := -1;
  SetLength(Buffer, 4);
  Stream := TFileStream.Create(SrcPath, fmOpenReadWrite);
  Stream.Position := 0;
  For i := 0 To Stream.Size - 5 Do Begin
    Stream.Seek(i, soFromBeginning);
    Stream.ReadBuffer(Buffer, 4);
    If (Buffer[0] = $4F) And (Buffer[1] = $53) And (Buffer[2] = $2F) And (Buffer[3] = $32) Then Begin
      Stream.Seek(4, soFromCurrent);
      Stream.ReadBuffer(Buffer, 4);
      OffSet := Buffer[0] * 16777216 + Buffer[1] * 65536 + Buffer[2] * 256 + Buffer[3] + 9;
      // Read FsType Code
      Stream.Seek(OffSet, soFromBeginning);
      SetLength(Buffer, 1);
      Stream.ReadBuffer(Buffer, 1);
      // Write FsType Code
      If Buffer[0] In [0, 2, 4, 8] Then Begin
        If Buffer[0] = FsType Then Begin
          Result := 0;
        End Else Begin
          Result := 1;
          Stream.Seek(OffSet, soFromBeginning);
          Stream.WriteBuffer(FsType, 1);
        End;
      End;
      Break;
    End;
  End;
  Stream.Free;
End;
----------------------------------------------
快乐工作,快乐生活
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2023/9/10 21:23:14
1楼: 不明,觉厉
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS