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

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

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

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

@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是一个很强大的图片识别工具,安装和使用方法可以自行了解。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值