Tesseract识别图片提取文字&字库训练-程序员宅基地

技术标签: git  java  runtime  

   文中测试了3.0和4.0两个版本。发现3.0识别效率不准确,需要训练词库。4.0识别效率就比较高了,而且支持结果生成pdf、txt等格式。所以推荐使用4.0版本。

  这个工具可以用在爬虫的时候获取验证码进行识别且自动输入验证码的功能。

  git地址:https://github.com/tesseract-ocr/tesseract

  下载地址:https://digi.bib.uni-mannheim.de/tesseract/

1.下载安装

  我下载的是 3.05.01,自带了中文词库。

下载完成后目录结构:

 

2.测试识别

0.准备一张文字图片

1.添加环境变量到path中,可以直接使用tesseract命令。检查是否配置成功

C:\Users\Administrator\Desktop\新建文件夹>tesseract -v
tesseract 3.05.01
 leptonica-1.74.1
  libgif 4.1.6(?) : libjpeg 8d (libjpeg-turbo 1.5.0) : libpng 1.6.20 : libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.3 : libopenjp2 2.1.0

 

查看命令可以携带的参数:

PS C:\Users\Administrator\Desktop\新建文件夹> tesseract
Usage:
  E:\tesseract\Tesseract-OCR\tesseract.exe --help | --help-psm | --help-oem | --version
  E:\tesseract\Tesseract-OCR\tesseract.exe --list-langs [--tessdata-dir PATH]
  E:\tesseract\Tesseract-OCR\tesseract.exe --print-parameters [options...] [configfile...]
  E:\tesseract\Tesseract-OCR\tesseract.exe imagename|stdin outputbase|stdout [options...] [configfile...]

OCR options:
  --tessdata-dir PATH   Specify the location of tessdata path.
  --user-words PATH     Specify the location of user words file.
  --user-patterns PATH  Specify the location of user patterns file.
  -l LANG[+LANG]        Specify language(s) used for OCR.
  -c VAR=VALUE          Set value for config variables.
                        Multiple -c arguments are allowed.
  --psm NUM             Specify page segmentation mode.
  --oem NUM             Specify OCR Engine mode.
NOTE: These options must occur before any configfile.

Page segmentation modes:
  0    Orientation and script detection (OSD) only.
  1    Automatic page segmentation with OSD.
  2    Automatic page segmentation, but no OSD, or OCR.
  3    Fully automatic page segmentation, but no OSD. (Default)
  4    Assume a single column of text of variable sizes.
  5    Assume a single uniform block of vertically aligned text.
  6    Assume a single uniform block of text.
  7    Treat the image as a single text line.
  8    Treat the image as a single word.
  9    Treat the image as a single word in a circle.
 10    Treat the image as a single character.
 11    Sparse text. Find as much text as possible in no particular order.
 12    Sparse text with OSD.
 13    Raw line. Treat the image as a single text line,
                        bypassing hacks that are Tesseract-specific.
OCR Engine modes:
  0    Original Tesseract only.
  1    Cube only.
  2    Tesseract + cube.
  3    Default, based on what is available.

Single options:
  -h, --help            Show this help message.
  --help-psm            Show page segmentation modes.
  --help-oem            Show OCR Engine modes.
  -v, --version         Show version information.
  --list-langs          List available languages for tesseract engine.
  --print-parameters    Print tesseract parameters to stdout.

 

 2.进入cmd,进入到要识别的图片的路径下。

C:\Users\Administrator\Desktop\新建文件夹>tesseract ./1.jpg re
Error opening data file \tesseract\Tesseract-OCR\tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Could not initialize tesseract.

 

发现报错没有语言,解决办法: 将  tesseract 安装目录下的  tessdata 文件夹配置到环境变量  TESSDATA_PREFIX  

C:\Users\Administrator>set TESSDATA_PREFIX
TESSDATA_PREFIX=E:\tesseract\Tesseract-OCR\tessdata

3.再次测试

C:\Users\Administrator\Desktop\新建文件夹>tesseract ./1.png re
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

   会生成一个re.txt文件,内容如下:(发现中文乱码)

 4.解决中文乱码问题:加 -l 参数指定语言即可

(1)查看支持的语言

C:\Users\Administrator\Desktop\新建文件夹>tesseract --list-langs
List of available languages (107):
afr
amh
ara
。。。

 

(2)使用  chi_sim 识别图片

C:\Users\Administrator\Desktop\新建文件夹>tesseract -l chi_sim ./1.png re
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

 3.测试复杂的中文识别---词库训练

 1.原来图片如下

 

 

2. 识别之后的内容如下

 

3.解决上面的问题---利用jTessBoxEditor工具进行Tesseract3.02.02样本训练

  此工具基于java运行,所以需要安装java环境。

1.下载   jTessBoxEditor :http://tenet.dl.sourceforge.net/project/vietocr/jTessBoxEditor/jTessBoxEditor-1.5.zip

2.解压运行

$ java -jar jTessBoxEditor.jar

 

 

3. 将上面的图片转换成tif格式,用于后面生成box文件。可以通过画图,然后另存为tif即可

tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言 fontname是字体 
比如我们要训练自定义字库 mylan 字体名normal
那么我们把图片文件重命名 mylan.normal.exp0.jpg在转tif。(画图工具中另存为就可以)

 

4.生成box文件。

tesseract mylan.normal.exp0.jpg mylan.normal.exp0 -l chi_sim batch.nochop makebox

 

box文件和对应的tif一定要在相同的目录下,不然后面打不开。会生产一个box文件。

 

 

5.打开jTessBoxEditor矫正错误并训练

 打开train.bat

 

 找到tif图,打开,并校正。(校正完保存即可)

 

 6、训练。

(1) 只要在命令行输入命令即可。(执行第一条命令会生产.tr文件,也可以先执行一次然后删掉tr测试是否可以训练)

tesseract  mylan.normal.exp0.jpg mylan.normal.exp0  nobatch box.train


unicharset_extractor mylan.normal.exp0.box

或者输入两个合并执行的命令:

tesseract  mylan.normal.exp0.jpg mylan.normal.exp0  nobatch box.train && unicharset_extractor mylan.normal.exp0.box

 

 如下证明全部识别完毕:

 

(2)新建一个font_properties文件

里面内容写入 normal 0 0 0 0 0 表示默认普通字体 (要求normal与上面的字体名称必须一致),下面是命令直接重定向(注意重定向>和>>的区别是>是覆盖模式,>>是追加模式):

echo normal 0 0 0 0 0 >> font_properties

 

(3)继续敲命令:

shapeclustering -F font_properties -U unicharset mylan.normal.exp0.tr

mftraining -F font_properties -U unicharset -O unicharset mylan.normal.exp0.tr

cntraining mylan.normal.exp0.tr

或者一次性执行下面命令:

shapeclustering -F font_properties -U unicharset mylan.normal.exp0.tr && mftraining -F font_properties -U unicharset -O unicharset mylan.normal.exp0.tr && cntraining mylan.normal.exp0.tr

 

最后会生成五个文件,把目录下的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件前面都加上normal.

如图:

或者执行如下命令进行重命名:

mv ./unicharset ./normal.unicharset && mv ./inttemp ./normal.inttemp && mv ./pffmtable ./normal.pffmtable && mv ./shapetable ./normal.shapetable && mv ./normproto ./normal.normproto

 

(4)命令行输入,合并五个文件:

combine_tessdata normal.

得到训练好的字库。

 

(5)把 normal.traineddata 复制到Tesseract-OCR 安装目录下的tessdata文件夹中

或者执行以下命令即可:( TESSDATA_PREFIX 是配置的环境变量)

mv ./normal.traineddata $TESSDATA_PREFIX

或者执行复制命令:

cp ./normal.traineddata $TESSDATA_PREFIX

 

 7.测试:

识别命令:(可以使用两种语言,也可以使用一种语言)

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract mylan.normal.exp0.jpg result -l normal
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract mylan.normal.exp0.jpg result2 -l normal+chi_sim
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

 

结果:(上面的   result   是指定生成的txt文件的前缀   )

 

补充:用notepad++打开之后会发现有换行:

 

  这个需要大量的训练词库。不知道是否有更好的解决办法。

 

补充:一个Java程序调用runtime执行本地命令,并读取生成的文件内容:

package cn.xm.exam.test;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.apache.xmlbeans.impl.common.IOUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ibm.wsdl.util.IOUtils;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(Test.class);

    public static void main(String[] args) throws IOException {
        // 执行命令生成文件
        String cmd = "E:/tesseract/Tesseract-OCR/tesseract.exe G://test.jpg G://tmp -l normal+chi_sim";
        boolean exec = exec(cmd);
        if (exec) {
            String readFileToString = FileUtils.readFileToString(new File("G://tmp.txt"));
            System.out.println(readFileToString);
        }
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();
            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        return true;
    }
}

结果:(会将换行也读取出来)

1 23456
这是一告测试中文
不能告诉@154856.text
电话:1 8434391 711

 

=====下面研究 Tesseract  4.0版本的使用(推荐使用这个版本)=========

  官方对  Tesseract4.0 版本做了很多的改进,而且自带的语言库也增加了很多。下面研究在4.0版本的识别。经过研究,4.0版本是可以直接拿来就用的,都不用训练词。识别为pdf的准确率更加高,所以在实际中可以识别为pdf然后用apache-tika提取pdf的内容。这样识别率更加的高效。

1. 下载安装

2.修改环境变量为最新的4.0版本并测试

$ tesseract --version
tesseract v4.0.0.20181030
 leptonica-1.76.0
  libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.3) : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.2.0

 

3.接下来还是对上面的带中文的进行识别

tesseract ./1.jpg result -l chi_sim

 

结果:(识别率已经非常准确了)

 

 4.测试将识别结果直接提取为字符串、存储为pdf(双层pdf)或者xml

(1)直接提取为文本

$ tesseract ./1.jpg stdout -l chi_sim
123456
这是一个测试中文

不能告诉@154856 .text
电话:18434391711

 

(2)提取为pdf

   在4.0之后可以自动将识别结果提取为pdf\txt\xml等格式的数据。

Administrator@MicroWin10-1535 MINGW64 ~/Desktop/新建文件夹
$ tesseract ./1.jpg result -l chi_sim pdf
Tesseract Open Source OCR Engine v4.0.0.20181030 with Leptonica

 结果:

(3)当然可以一次性提取为多个文件,只需要在后面空格分割就可以了

tesseract ./0101.jpg result -l chi_sim pdf txt

 

结果会生成三个文件

 

5.测试识别复杂的中文图片

图片内容如下:

(1)直接提取内容到输出控制台

$ tesseract ./0101.jpg stdout -l chi_sim


一个车者对禅师说: “我放不下一-些事放不下一些人。”

禅师说没有什么东西是真正放不下的。苦者说: 可我就信信放不下.

禅师递给他一个水杯然后就入里面侠     -直例到水溢出来。贡者被通到马_上松开了手,水杯掉在
地上摔坏了。

禅师说:其实,这个世界_上没有什么事是放不下的,痛了,你自然就会放下

土者说到“我能换个水杯吗?

禅师微微一笑道:“可以”他从包里拿出一一个水杯 ,说到再试试吧 , 禅师又往水杯里倒水,水溢出
来 , 这次他没有放手

祥岳问道:“不汤吗”?苦者说“和”

禅师又问“为何不放手?”葫者说道“这水杯是她送的。禅师回头叹“番狗是真的牛通

 

 

(2)查看提取tx和pdf的效率

$ tesseract ./0101.jpg result -l chi_sim pdf txt

 

txt和控制台的结果一样:

 

pdf识别结果更加准确:(接近百分之百)

 

   经过上面的实验发现啊,pdf的识别是识别的双层pdf,我自己的一种思路就是:将识别结果存到pdf,然后用ApacheTika提取pdf的内容,这样识别效率应该会更加准确。

 

6. java中调用runtime获取识别结果和提取为pdf之后用ApacheTika提取pdf内容

(1)读取内容到字符串中

package zd.dms.utils.ebuy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.tika.exception.TikaException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(PlainTest.class);

    public static void main(String[] args) throws IOException, SAXException, TikaException {
        // 执行命令生成文件
        String cmd = "E:/tesseract4/Tesseract-OCR/tesseract.exe G://0101.jpg stdout -l chi_sim";
        boolean exec = exec(cmd);
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        String result = "";
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();

            // 获取其正常的输出流
            InputStream inputStream = process.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader br = new BufferedReader(inputStreamReader);
            String line = null;
            while ((line = br.readLine()) != null) {
                result += line;
            }

        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        // result就是获取到的结果
        System.out.println(result);
        return true;
    }
}

结果:

  一个车者对禅师说: “我放不下一-些事放不下一些人。”禅师说没有什么东西是真正放不下的。苦者说: 可我就信信放不下.禅师递给他一个水杯然后就入里面侠     -直例到水溢出来。贡者被通到马_上松开了手,水杯掉在地上摔坏了。禅师说:其实,这个世界_上没有什么事是放不下的,痛了,你自然就会放下土者说到“我能换个水杯吗?禅师微微一笑道:“可以”他从包里拿出一一个水杯 ,说到再试试吧 , 禅师又往水杯里倒水,水溢出来 , 这次他没有放手祥岳问道:“不汤吗”?苦者说“和”禅师又问“为何不放手?”葫者说道“这水杯是她送的。禅师回头叹“番狗是真的牛通     

 

(2)读取内容到pdf中然后tika读取pdf

package zd.dms.utils.ebuy;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.BodyContentHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

@SuppressWarnings("all")
public class PlainTest {
    private static final Logger logger = LoggerFactory.getLogger(PlainTest.class);

    public static void main(String[] args) throws IOException, SAXException, TikaException {
        // 执行命令生成文件
        String cmd = "E:/tesseract4/Tesseract-OCR/tesseract.exe G://0101.jpg G://result -l chi_sim pdf";
        boolean exec = exec(cmd);
        if (exec) {
            BodyContentHandler handler = new BodyContentHandler();
            Metadata metadata = new Metadata();
            FileInputStream inputstream = new FileInputStream(new File("G://result.pdf"));
            ParseContext pcontext = new ParseContext();

            // parsing the document using PDF parser
            PDFParser pdfparser = new PDFParser();
            pdfparser.parse(inputstream, handler, metadata, pcontext);

            // getting the content of the document
            System.out.println("Contents of the PDF :" + handler.toString());
        }
    }

    public static boolean exec(String command) {
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug("exec cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();
            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error(" exec {} error", command, e);
            return false;
        }

        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  exec {}", command, e);
            return false;
        }

        if (exitStatus != 0) {
            logger.error("exec cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("exec cmd exitStatus {}", exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        return true;
    }
}

结果:

个对禅师说 “我放 不 一-些事放不一 。”
禅师说没有什么东西是真正不下的 者可我信不.
禅师递给一水杯然后入里面侠 -直例到水溢出来 者通到马上松了手,水掉
摔了。
禅师 :其,这个世界上没有什么事是不下 , 痛了 , 你自然就放下
者到 “我能换个水杯?
禅师微微笑 :“可以”他里拿出一水,说到再试试吧 , 禅师又往水杯里倒水 ,水溢出

 

来 , 这次他没有放手
祥岳 问 不汤”? 者 “和”
禅师又 何不放手?”者 “这水杯她送的 禅师回头 “番真牛通

 

 

  git上面的文档对4.0最新的每个命令都有介绍,参照git上的doc文件夹下面对每个文件的介绍:https://github.com/tesseract-ocr/tesseract/tree/master/doc

 

转载于:https://www.cnblogs.com/qlqwjy/p/10273543.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30426065/article/details/98838892

智能推荐

leetcode 172. 阶乘后的零-程序员宅基地

文章浏览阅读63次。题目给定一个整数 n,返回 n! 结果尾数中零的数量。解题思路每个0都是由2 * 5得来的,相当于要求n!分解成质因子后2 * 5的数目,由于n中2的数目肯定是要大于5的数目,所以我们只需要求出n!中5的数目。C++代码class Solution {public: int trailingZeroes(int n) { ...

Day15-【Java SE进阶】IO流(一):File、IO流概述、File文件对象的创建、字节输入输出流FileInputStream FileoutputStream、释放资源。_outputstream释放-程序员宅基地

文章浏览阅读992次,点赞27次,收藏15次。UTF-8是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。文件字节输入流:每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1。注意1:字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码。定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。UTF-8字符集:汉字占3个字节,英文、数字占1个字节。GBK字符集:汉字占2个字节,英文、数字占1个字节。GBK规定:汉字的第一个字节的第一位必须是1。_outputstream释放

jeecgboot重新登录_jeecg 登录自动退出-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏3次。解决jeecgboot每次登录进去都会弹出请重新登录问题,在utils文件下找到request.js文件注释这段代码即可_jeecg 登录自动退出

数据中心供配电系统负荷计算实例分析-程序员宅基地

文章浏览阅读3.4k次。我国目前普遍采用需要系数法和二项式系数法确定用电设备的负荷,其中需要系数法是国际上普遍采用的确定计算负荷的方法,最为简便;而二项式系数法在确定设备台数较少且各台设备容量差..._数据中心用电负荷统计变压器

HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板_网页设计成品百度网盘-程序员宅基地

文章浏览阅读7k次,点赞4次,收藏46次。HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作业_网页设计成品百度网盘

【Jailhouse 文章】Look Mum, no VM Exits_jailhouse sr-iov-程序员宅基地

文章浏览阅读392次。jailhouse 文章翻译,Look Mum, no VM Exits!_jailhouse sr-iov

随便推点

chatgpt赋能python:Python怎么删除文件中的某一行_python 删除文件特定几行-程序员宅基地

文章浏览阅读751次。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。AI职场汇报智能办公文案写作效率提升教程 专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。_python 删除文件特定几行

Java过滤特殊字符的正则表达式_java正则表达式过滤特殊字符-程序员宅基地

文章浏览阅读2.1k次。【代码】Java过滤特殊字符的正则表达式。_java正则表达式过滤特殊字符

CSS中设置背景的7个属性及简写background注意点_background设置背景图片-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏17次。css中背景的设置至关重要,也是一个难点,因为属性众多,对应的属性值也比较多,这里详细的列举了背景相关的7个属性及对应的属性值,并附上演示代码,后期要用的话,可以随时查看,那我们坐稳开车了······1: background-color 设置背景颜色2:background-image来设置背景图片- 语法:background-image:url(相对路径);-可以同时为一个元素指定背景颜色和背景图片,这样背景颜色将会作为背景图片的底色,一般情况下设置背景..._background设置背景图片

Win10 安装系统跳过创建用户,直接启用 Administrator_windows10msoobe进程-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏8次。Win10 安装系统跳过创建用户,直接启用 Administrator_windows10msoobe进程

PyCharm2021安装教程-程序员宅基地

文章浏览阅读10w+次,点赞653次,收藏3k次。Windows安装pycharm教程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入下载安装PyCharm1、进入官网PyCharm的下载地址:http://www.jetbrains.com/pycharm/downl_pycharm2021

《跨境电商——速卖通搜索排名规则解析与SEO技术》一一1.1 初识速卖通的搜索引擎...-程序员宅基地

文章浏览阅读835次。本节书摘来自异步社区出版社《跨境电商——速卖通搜索排名规则解析与SEO技术》一书中的第1章,第1.1节,作者: 冯晓宁,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.1 初识速卖通的搜索引擎1.1.1 初识速卖通搜索作为速卖通卖家都应该知道,速卖通经常被视为“国际版的淘宝”。那么请想一下,普通消费者在淘宝网上购买商品的时候,他的行为应该..._跨境电商 速卖通搜索排名规则解析与seo技术 pdf

推荐文章

热门文章

相关标签