zoukankan      html  css  js  c++  java
  • java结合Python解析猫眼字体

    公司框架用java开发的,java解析woff字体的文档很少,所以用Python的模块解析字体,嵌入到java中。下面是大体思路:

    1.把字体下载到本地,data url 格式

        猫眼的字体是data url 格式,格式是data:application/font-woff;charset=utf-8;base64,   +base64编码字符串,是把文件用base64编码成字符串写入到网页中,所以只需要用base64解码后边的字符串。Base64包是jdk 1.8新出的

       String     dade="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";
            final Base64.Decoder decoder = Base64.getDecoder();
            try {
       //System.out.println(new String(decoder.decode(dade), "UTF-8"));
              byte bt[] = new byte[1024]; 
        bt =decoder.decode(dade);
        FileOutputStream in = new FileOutputStream("C:\Users\user\Desktop\maoyan.woff"); 
        in.write(bt, 0, bt.length); 
         in.close(); 
      } catch (UnsupportedEncodingException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            }

    2.Python 解析字体(py文件)

    from fontTools.ttLib import TTFont
    import sys
    import requests
    #maoyan=sys.argv[1]
    baseFont = TTFont('C:\Users\user\Desktop\base.woff')
    maoyanFont = TTFont('C:\Users\user\Desktop\maoyan.woff')
    uniList = maoyanFont['cmap'].tables[0].ttFont.getGlyphOrder()
    numList = []
    baseNumList = ['.', '3', '5', '1', '2', '7', '0', '6', '9', '8', '4']
    baseUniCode = ['x', 'uniEF2A', 'uniE345', 'uniE175', 'uniEE86', 'uniE5D2', 'uniF7D8',
    'uniF06F', 'uniE252', 'uniF3FE', 'uniE806']
    for i in range(1, 12):
    maoyanGlyph = maoyanFont['glyf'][uniList[i]]
    for j in range(11):
    baseGlyph = baseFont['glyf'][baseUniCode[j]]
    if maoyanGlyph == baseGlyph:
    numList.append(baseNumList[j]+':'+uniList[i])
    break
    uniList[1] = 'uni0078'
    print(numList)

    3.java中嵌入Python,网上有很多方法,我使用的方法需要在Python中print出结果,java代码以输出流的方式得到打印的结果。传参的话需要在Python代码中接收参数。

    //可以在后边加参数 如: String[] argss = new String[] { "D:\python\python.exe", "C:\Users\user\Desktop\test.py","arg1","arg2"};
            String[] argss = new String[] { "D:\python\python.exe", "C:\Users\user\Desktop\test.py"};
            Process pr;
            //需要print出来java接受
      try {
       pr = Runtime.getRuntime().exec(argss);
        BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
              String line;
              String result = "";
              while ((line = in.readLine()) != null) {
                result += line;
                System.out.println(result);
              }
              in.close();
              try {
         pr.waitFor();
        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }

    4.以上方法是对两个字体文件进行字形名称进行比较。58页面的字体是没有字形名称的,通过python的 baseFont = TTFont('D:pythonworkspace\58.ttf'),研究发现页面中展示的是十进制转十六进制的一种编码。

     https://www.jianshu.com/p/5a626b3422ac

    
    
    
    
  • 相关阅读:
    Luogu P1247 取火柴游戏
    Luogu P2148 [SDOI2009]E&D
    Luogu P3305 [SDOI2013]费用流 二分 网络流
    NTT学习笔记
    Luogu P4015 运输问题
    Lucas定理学习笔记(没有ex_lucas)
    Luogu P2613 【模板】有理数取余
    欧拉定理与扩展欧拉定理学习笔记
    BSGS与exBSGS学习笔记
    Luogu P3868 [TJOI2009]猜数字
  • 原文地址:https://www.cnblogs.com/srp750115867/p/9451092.html
Copyright © 2011-2022 走看看