关于网站自定义字体css加密篇

2023-11-06

平常在浏览网页时会发现有很多网页的文字是无法直接复制的,例如这个:中国供应商网

最新采购-采购中心-中国供应商

其实这就是一种网站自定义的字体,

@font-face{

font-family:

src:

其中font-family就是你自定义的字体名称,而src则是存放字体的路径。

这个网站其实我们可以很清楚的看到是ttf形式的文件,并且采用了base64加密。而后面的那一长串就是经过加密后的文件。所以我们第一步采用base64解码。

bs = base64.b64decode()

将解码后的文件命名并保存

with open("filename.ttf", mode="wb") as f:

     f.write()

因为文件是ttf形式的,所以我们需要打开文件并保存为xml形式,

font = TTFont('filename.ttf')

font.saveXML('filename.xml')

第一步就完成了,

我们打开所得到的xml文件后会发现这样一个字段:CharString name="uni1005b",uni1005b会不会就是我们所需要的unicode与字符的对应关系呢。其中有两个字符串引起了我的注意,rlineto和rmoveto。这可能是一种坐标的表示,我们导入reportlab和fontTools.pens来画一下

from fontTools.pens.basePen import BasePen
from reportlab.graphics.shapes import Path
from reportlab.lib import colors
from reportlab.graphics import renderPM
from reportlab.graphics.shapes import Group, Drawing, scale
import base64

fontTools是python的一个对字体进行解析的第三方库,Pen是一个用于标准化的”画”出轮廓的对象,或者是数据和实际轮廓间的媒介。具体来说,Pen对象的子类包含将上述两种轮廓数据转化为画线、移动等模拟实际轮廓的方法。在fontTools的pen库中包含将轮廓数据转化为qt、reportLab等第三方库中实例的Pen子类。总体的思路就是先定义rlineto和rmoveto两种方法,根据坐标画出所有的图,再将画出的图像利用tesseract-ocr识别,就可以找到所有unicode和字符的对应关系了。

class ReportLabPen(BasePen):
    """A pen for drawing onto a reportlab.graphics.shapes.Path object."""

    def __init__(self, glyphSet, path=None):
        BasePen.__init__(self, glyphSet)
        if path is None:
            path = Path()
        self.path = path

    def _moveTo(self, p):
        (x, y) = p
        self.path.moveTo(x, y)

    def _lineTo(self, p):
        (x, y) = p
        self.path.lineTo(x, y)

    def _curveToOne(self, p1, p2, p3):
        (x1, y1) = p1
        (x2, y2) = p2
        (x3, y3) = p3
        self.path.curveTo(x1, y1, x2, y2, x3, y3)

    def _closePath(self):
        self.path.closePath()


def ttfToImage(fontName, imagePath, fmt="png"):
    font = TTFont(fontName)
    gs = font.getGlyphSet()
    glyphNames = font.getGlyphNames()
    for i in glyphNames:
        if i[0] == '.':  # 跳过'.notdef', '.null'
            continue
        g = gs[i]
        pen = ReportLabPen(gs)
        g.draw(pen)

        w, h = g.width, g.width + 500

        g = Group(pen.path)
        g.translate(0, 200)
        d = Drawing(w, h)
        d.add(g)
        print(d)
        imageFile = imagePath + "/" + i + ".png"
        renderPM.drawToFile(d, imageFile, fmt)

值得一提的是tesseract-ocr是一个很强大的图片识别工具,安装和使用方法可以自行了解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于网站自定义字体css加密篇 的相关文章

随机推荐

  • layui的框架导入

    目录 1 导入步骤 2 框架包含的组件 1 导入步骤 1 1 下载框架包 http www layui com 1 2 将layui文件夹拷入项目位置 1 3 页面中导入 layui all js layui css 和 jquery 即可
  • docker启动Nacos docker run requires at least 1 argument.

    nacos启动命令 docker run d e PREFER HOST MODE ip e MODE standalone e SPRING DATASOURCE PLATFORM mysql e MYSQL SERVICE HOST 4
  • glide的基本使用及进阶使用

    glide生命周期管理 内存管理 缓存机制 加载器 观察者模式 前言 本系列博文主要通过借鉴其他优秀博文以及自己的实际开发经验综合得出 主要分析glide相关使用 机制以及设计模式等内容 相信这篇博文会让你对glide有更加深入的理解 本篇
  • 如何手动优化xp系统

    1 删除系统备份的文件 直接在 开始 菜单的 运行 对话框中 输入sfc exe purgecache就可以了 2 删除系统中的帮助文件 如果你没有看帮助的习惯 况且在有时候误操作的时候 常把帮助对话框调出来 就删除了吧 免得浪费空间 找到
  • python项目快速生产依赖库列表

    安装pipreqs库 pip install pipreqs 在项目工程根目标执行以下命令 生成requirements txt pipreqs encoding utf8
  • Debian 8.2 安装docker

    一 安装docker io包之前 需要先设置使用backports源 编辑 etc apt sources list文件 加入下面这一句 deb http http debian net debian jessie backports ma
  • Python进阶-函数、模块和包

    使用如下方法 可以使函数接受不定数目的参数 def add x args total x for arg in args total arg return total 这样定义的函数不能使用关键词传入参数 要使用关键词 可以这样 def a
  • 【Dongle】【数据结构】Linklist L、Linklist *L、Node *p 和Node p

    最近在做数据结构导论试题的时候无意中发现答案中有用到这些东西的Linklist L Linklist L Node p 和Node p 不过不清楚都具体指什么 故而从网上查找了一番 先定义一个单链表结构体 typedef struct no
  • 01-linux下Postgresql的安装

    1 看官网 https www postgresql org download 2 选择系统 这里选择Red Hat family Linux including CentOS Fedora Scientific Oracle varian
  • 量子计算机编程_对量子计算机进行编程

    量子计算机编程 Quantum computing is one of the most rapidly advancing technologies Many companies and research labs are racing
  • AI常见部署方式

    文章目录 1 AI部署简介 2 具体部署 1 AI部署简介 没人告诉你的大规模部署AI高效流程 对大部分 TensorFlow 模型来说 部署流程是相同的 1 将图像固化为 Protobuf 二进制文件 2 调整推断代码 使它可以处理固化的
  • PageHelper 分页原理

    本文主要介绍了开源的mybatis分页插件 PageHelper 工作原理 现在的项目开发基本离不开Mybatis 一方面是借助增强版的 Mybatis Plus节省许多基础 SQL 的编写时间 另一方面借助其强大的条件构造器可以缩减大多数
  • 最近比较火的圣诞树源码来了,直接用记事本打开就OK了。

    代码如下
  • 东北三省计算机专业好的学校,东北地区最厉害的5所大学,哈工大公认最强,第三所非常低调!...

    东北地区是我国的重工业基地 这里也是我国的高等教育发达的地方 后来随着我国经济重心转移 东北地区经济下滑 这里的高校也逐渐的被人冷落 其实这些高校实力很强 而且因为重工业发展的原因 理科很占优势 至今仍然是国家重点布局的战略院校 今天要给大
  • SLAM笔记(四)运动恢复结构的几何数学(本征矩阵、单应矩阵、基础矩阵)

    1 间接法进行运动恢复的前提假设 对于结构与运动或视觉三维重建中 通常假设已经通过特征匹配等方法获取了匹配好的点对 先求出匹配点对再获取结构和运动信息的方法称作间接法 间接法最重要的三个假设是 1 拥有一系列两帧之间的匹配点对 但同时假设匹
  • caffe windows学习:第一个测试程序

    caffe windows编译成功后 就可以开始进行测试了 如果还没有编译成功的 请参考 caffe windows 学习第一步 编译和安装 vs2012 win 64 一般第一个测试都是建议对手写字体minist进行识别 这个测试放在根目
  • 图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现

    老猿Python博文目录 https blog csdn net LaoYuanPython 仿射变换博文传送门 带星号的为付费专栏文章 图像仿射变换原理1 齐次坐标来龙去脉详解 图像仿射变换原理2 矩阵变换 线性变换和图像线性变换矩阵 图
  • 什么是模态分析

    本文内容来自微信公众号 模态空间 你能为我解释模态分析吗 好 需要花费一点时间 但是任何人都能明白 你不是第一个要求我用通俗易懂的语言解释模态分析的人 这样一来 任何人都能明白模态分析 简单地说 模态分析是一种处理过程 是根据结构的固有特性
  • vue3中的this.$set怎么写呢?

    vue3中的this set怎么写呢 在vue2中我们常常会遇到明明已经改变了数据视图却没有实时更新这样的问题 举例
  • 关于网站自定义字体css加密篇

    平常在浏览网页时会发现有很多网页的文字是无法直接复制的 例如这个 中国供应商网 最新采购 采购中心 中国供应商 其实这就是一种网站自定义的字体 font face font family src 其中font family就是你自定义的字体