├── .gitignore ├── plugin ├── poppler-0.68.0 │ └── bin │ │ ├── zlib1.dll │ │ ├── README-XPDF │ │ ├── jpeg62.dll │ │ ├── pdfinfo.exe │ │ ├── pdftops.exe │ │ ├── freetype6.dll │ │ ├── libcairo-2.dll │ │ ├── libexpat-1.dll │ │ ├── libtiff3.dll │ │ ├── pdfdetach.exe │ │ ├── pdffonts.exe │ │ ├── pdfimages.exe │ │ ├── pdftocairo.exe │ │ ├── pdftohtml.exe │ │ ├── pdftoppm.exe │ │ ├── pdftotext.exe │ │ ├── pdfunite.exe │ │ ├── libpng16-16.dll │ │ ├── libstdc++-6.dll │ │ ├── pdfseparate.exe │ │ ├── libfontconfig-1.dll │ │ ├── libgcc_s_dw2-1.dll │ │ ├── libpixman-1-0.dll │ │ ├── libpoppler-79.dll │ │ ├── libpoppler-cpp-0.dll │ │ ├── AUTHORS │ │ ├── BINARIES │ │ ├── README │ │ ├── COPYING │ │ └── COPYING3 └── pytesseract │ ├── __pycache__ │ ├── __init__.cpython-38.pyc │ └── pytesseract.cpython-38.pyc │ ├── __init__.py │ └── pytesseract.py ├── requirements.txt ├── config.yaml ├── README.md ├── run.py ├── Universal.py ├── LICENSE └── result └── 美赛各奖项计数条形图.svg /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | 3 | #ignore picture 4 | result/Award picture/ -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/zlib1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/zlib1.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/README-XPDF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/README-XPDF -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/jpeg62.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/jpeg62.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdfinfo.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdfinfo.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdftops.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdftops.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/freetype6.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/freetype6.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libcairo-2.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libcairo-2.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libexpat-1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libexpat-1.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libtiff3.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libtiff3.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdfdetach.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdfdetach.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdffonts.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdffonts.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdfimages.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdfimages.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdftocairo.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdftocairo.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdftohtml.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdftohtml.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdftoppm.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdftoppm.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdftotext.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdftotext.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdfunite.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdfunite.exe -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libpng16-16.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libpng16-16.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libstdc++-6.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libstdc++-6.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/pdfseparate.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/pdfseparate.exe -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | loguru==0.7.0 2 | matplotlib 3 | numpy 4 | pandas 5 | pdf2image==1.16.3 6 | Pillow==9.1.0 7 | PyYAML==6.0 8 | Requests==2.30.0 9 | -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libfontconfig-1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libfontconfig-1.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libgcc_s_dw2-1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libgcc_s_dw2-1.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libpixman-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libpixman-1-0.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libpoppler-79.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libpoppler-79.dll -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/libpoppler-cpp-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/poppler-0.68.0/bin/libpoppler-cpp-0.dll -------------------------------------------------------------------------------- /plugin/pytesseract/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/pytesseract/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /plugin/pytesseract/__pycache__/pytesseract.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leost123456/MCM-ICM-Crawler/HEAD/plugin/pytesseract/__pycache__/pytesseract.cpython-38.pyc -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/AUTHORS: -------------------------------------------------------------------------------- 1 | xpdf is written by Derek Noonburg 2 | 3 | libpoppler is a fork of xpdf-3.00 4 | 5 | Current Maintainer: Albert Astals Cid 6 | -------------------------------------------------------------------------------- /config.yaml: -------------------------------------------------------------------------------- 1 | #注意可能由于国内IP问题,爬取速度会变慢,建议采用代理国外IP进行爬取,速度更快。 2 | 3 | #比赛年份 4 | year : 2024 5 | 6 | #爬取的序号范围(默认为1-31000,即队伍号为2400001-2431000) 7 | index: 1-31000 8 | 9 | #线程数,根据自己的CPU性能进行选择。默认50 10 | n_thread: 50 11 | 12 | #本地代理IP,若无本地代理IP则填None 13 | proxy: http://127.0.0.1:10809 14 | 15 | #你安装的tesseract目录中的tesseract.exe文件的路径(下面是示例) 16 | tesseract_exe: D:\0\other\tesseract\tesseract.exe 17 | 18 | #下载安装的tessdata语言包的路径(下面是示例) 19 | tessdata: D:\0\other\tessdata 20 | -------------------------------------------------------------------------------- /plugin/pytesseract/__init__.py: -------------------------------------------------------------------------------- 1 | # flake8: noqa: F401 2 | from .pytesseract import ALTONotSupported 3 | from .pytesseract import get_languages 4 | from .pytesseract import get_tesseract_version 5 | from .pytesseract import image_to_alto_xml 6 | from .pytesseract import image_to_boxes 7 | from .pytesseract import image_to_data 8 | from .pytesseract import image_to_osd 9 | from .pytesseract import image_to_pdf_or_hocr 10 | from .pytesseract import image_to_string 11 | from .pytesseract import Output 12 | from .pytesseract import run_and_get_output 13 | from .pytesseract import TesseractError 14 | from .pytesseract import TesseractNotFoundError 15 | from .pytesseract import TSVNotSupported 16 | 17 | 18 | __version__ = '0.3.10' 19 | -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/BINARIES: -------------------------------------------------------------------------------- 1 | Version 0.33.0 2 | 3 | Compiled by Alivate Australia 2015 4 | 5 | Unless otherwise stated, the software on this site is distributed in the hope 6 | that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 7 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THERE IS NO 8 | WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT 9 | WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS PROVIDE THE SOFTWARE 10 | "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 11 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 12 | A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF 13 | THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE 14 | COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS 15 | REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, 16 | BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 17 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE 18 | (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE 19 | OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO 20 | OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER HAS BEEN ADVISED OF 21 | THE POSSIBILITY OF SUCH DAMAGES. 22 | 23 | http://blog.alivate.com.au/poppler-windows 24 | -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/README: -------------------------------------------------------------------------------- 1 | This is poppler, a PDF rendering library. 2 | 3 | Poppler is a fork of the xpdf PDF viewer developed by Derek Noonburg 4 | of Glyph and Cog, LLC. The purpose of forking xpdf is twofold. 5 | First, we want to provide PDF rendering functionality as a shared 6 | library, to centralize the maintenance effort. Today a number of 7 | applications incorporate the xpdf code base, and whenever a security 8 | issue is discovered, all these applications exchange patches and put 9 | out new releases. In turn, all distributions must package and release 10 | new version of these xpdf based viewers. It's safe to say that 11 | there's a lot of duplicated effort with the current situation. Even if 12 | poppler in the short term introduces yet another xpdf derived code 13 | base to the world, we hope that over time these applications will 14 | adopt poppler. After all, we only need one application to use poppler 15 | to break even. 16 | 17 | Second, we would like to move libpoppler forward in a number of areas 18 | that don't fit within the goals of xpdf. By design, xpdf depends on 19 | very few libraries and runs a wide range of X based platforms. This 20 | is a strong feature and reasonable design goal. However, with poppler 21 | we would like to replace parts of xpdf that are now available as 22 | standard components of modern Unix desktop environments. One such 23 | example is fontconfig, which solves the problem of matching and 24 | locating fonts on the system, in a standardized and well understood 25 | way. Another example is cairo, which provides high quality 2D 26 | rendering. See the file TODO for a list of planned changes. 27 | 28 | Please note that xpdf, and thus poppler, is licensed under the GPL, 29 | not the LGPL. Consequently, any application using poppler must also 30 | be licensed under the GPL. If you want to incorporate Xpdf based PDF 31 | rendering in a closed source product, please contact Glyph & Cog 32 | (www.glyphandcog.com) for commercial licensing options. Note that 33 | this only allows you to use xpdf in a closed source product, 34 | not poppler itself. 35 | 36 | Kristian Høgsberg, Feb. 27, 2005 37 | 38 | 39 | See the README-XPDF for the original xpdf-3.03 README. 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # :bug:**2024年美赛成绩爬虫和可视化分析** 2 | 3 | :arrow_heading_down:**你可以通过以下两种方式运行本程序** 4 | 5 | #### :golf:**1.一键运行安装包** 6 | 7 | 1. 去release中解压MCM-ICM-Crawler文件,其中已经帮你配置好tesseract目录中的**tesseract.exe文件和**和**tessdata语言包**,你只需要更改config.yaml文件中的比赛年份、爬取序号范围、线程数、代理IP。 8 | 2. 进入终端输入指令 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt安装依赖。 9 | 3. 输入指令python run.py即可运行程序。 10 | 11 | #### :computer:**2.源码运行** 12 | 13 | 需要python版本>=3.8 14 | 15 | 1. git clone https://github.com/leost123456/MCM-ICM-Crawler.git 到本地仓库,或者直接下载源码。 16 | 2. 下载tesseract和其语言包,windows用户可去[**链接**](https://digi.bib.uni-mannheim.de/tesseract/)进行下载,并完成安装。 17 | 3. 完成安装后,在config.yaml文件中填写tesseract目录中的**tesseract.exe文件的路径**、**tessdata语言包**的路径、比赛年份、爬取序号范围、线程数、代理IP。 18 | 4. 在终端中输入指令 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt安装依赖。 19 | 5. 最后输入指令python run.py 程序即可运行。 20 | 21 | #### :o:**3.输出结果** 22 | 23 | 1. 所有成绩奖状图片(将存放在result目录下的Award picture目录中) 24 | 2. 文件数据(包括队伍号、队员名称、指导老师名称、学校、奖项,存放在result目录下的data.csv文件中) 25 | 3. 可视化图片(8张分析图片) 26 | 27 | --- 28 | 29 | ### :black_flag:**结果展示** 30 | 31 | **最终一共获得了28480条数据,可视化如下所示:** 32 | 33 | **1.美赛各奖项计数情况** 34 | 35 | [![image.png](https://i.postimg.cc/GmLkWBzt/image.png)](https://postimg.cc/56rYv2hW) 36 | 37 | **2.美赛各参加学校计数前十五名** 38 | 39 | [![image.png](https://i.postimg.cc/s1dnfmtQ/image.png)](https://postimg.cc/dZ6R42Qw) 40 | 41 | **3.获得Successful Participant奖项最多前十五名学校名称** 42 | 43 | [![Successful-Participant.png](https://i.postimg.cc/d1fHpw69/Successful-Participant.png)](https://postimg.cc/BLxB1Wd8) 44 | 45 | **4.获得Honorable Mention奖项最多前十五名学校名称** 46 | 47 | [![Honorable-Mention.png](https://i.postimg.cc/rpcvNVZ0/Honorable-Mention.png)](https://postimg.cc/gxSSYWWm) 48 | 49 | 5**.获得Meritorious Winner奖项最多前十五名学校名称** 50 | 51 | [![Meritorious-Winner.png](https://i.postimg.cc/SxLPR0Qy/Meritorious-Winner.png)](https://postimg.cc/Yv9RDsmV) 52 | 53 | 6.**获得Finalist奖项最多前十五名学校名称** 54 | 55 | [![Finalist.png](https://i.postimg.cc/vZ5Jnghw/Finalist.png)](https://postimg.cc/k2XY35LT) 56 | 57 | **7.获得Outstanding Winner奖项最多前十五名学校名称** 58 | 59 | [![Outstanding-Winner.png](https://i.postimg.cc/BvMw5x1k/Outstanding-Winner.png)](https://postimg.cc/B8Pg4PpB) 60 | 61 | --- 62 | 63 | ### :key:**免责声明** 64 | 65 | **本项目仅供学习参考,如用于其他违法行为,后果自负,本人概不负责。** -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | import re 2 | import threading #用于多线程操作 3 | import queue 4 | import os 5 | from loguru import logger 6 | from Universal import request_data,extract_data,save_data,plot_data 7 | import yaml 8 | 9 | #主运行函数 10 | def main(): 11 | while not q.empty(): #队列不为空 12 | url_index=q.get() #拿到序号 13 | 14 | if (url_index+1)%1000 ==0: #每进行1000轮保存一次数据 15 | save_data(Team_number_list,Team_members_1_list,Team_members_2_list,Team_members_3_list,Instructor_list, 16 | School_list,Awards_list) 17 | 18 | url=base_url+str(url_index)+'.pdf' #构造url 19 | 20 | #发送请求并转化成图片 21 | image=request_data(url,image_path,proxy) 22 | 23 | #OCR识别并进行数据提取 24 | if image != None : #如果可以正确读取数据 25 | try: 26 | student_name,faculty_name,school,awards=extract_data(tessdata,image,url_index,detect_advisor,student_name_re,faculty_name_re,school_re,awards_re) 27 | except Exception as e: 28 | continue 29 | #下面进行申请获取锁(防止多线程写入混乱) 30 | muti_lock.acquire() 31 | 32 | #存入列表(队伍号、队员1、队员2、队员3、指导教师、学校、奖项) 33 | Team_number_list.append(url_index) 34 | Team_members_1_list.append(student_name[0]) 35 | Team_members_2_list.append(student_name[1]) 36 | Team_members_3_list.append(student_name[2]) 37 | Instructor_list.append(faculty_name) 38 | School_list.append(school) 39 | Awards_list.append(awards) 40 | 41 | #释放锁 42 | muti_lock.release() 43 | logger.success(f'成功提取号码为{url_index}的数据') 44 | else: 45 | continue 46 | 47 | if __name__ == '__main__': 48 | # 导入poppler到系统变量中(用户变量) 49 | # 获取当前系统变量 50 | env = os.environ 51 | # 导入 52 | if 'PATH' in env: 53 | env['PATH'] += f";{os.path.abspath('.')}\\plugin\\poppler-0.68.0\\bin" 54 | else: 55 | env['PATH'] = f"{os.path.abspath('.')}\\plugin\\poppler-0.68.0\\bin" 56 | # 更新(注意只会注入其中一次,运行完毕后删除) 57 | os.environ = env 58 | 59 | # 下面进行读取配置文件 60 | logger.info('正在读取配置文件') 61 | try: 62 | with open('config.yaml', 'r', encoding='utf-8') as f: 63 | config = yaml.safe_load(f) 64 | year = config['year'] # 年份 65 | index = list(filter(None, config['index'].split('-'))) # 总共爬取的队伍序号范围,列表形式['1','24000'] 66 | n_thread = config['n_thread'] # 线程数量 67 | proxy=config['proxy'] #代理 68 | try: 69 | tessdata = config['tessdata'] # 语言包路径 70 | except: 71 | logger.error('tessdata语言包路径有误') 72 | exit() 73 | logger.success('成功读取配置文件,开始进行爬取') 74 | except Exception as e: 75 | logger.error('配置文件有误,请检查') 76 | exit() 77 | 78 | # 创建存储目录 79 | os.makedirs('result', exist_ok=True) #存储图片、数据和数据分析结果 80 | os.makedirs('result\\Award Picture',exist_ok=True) #存储奖状图片 81 | image_path='result\\Award Picture' #存储图片的地址 82 | base_url=rf'https://www.comap-math.com/mcm/{str(year)}Certs/' #基础url 83 | 84 | # 下面设置正则表达式用于文本匹配 85 | detect_advisor = re.compile(r'.*With.*[Student|Faculty].*Advisor.*', re.I | re.S ) #检测文本是否正确 86 | # 1进行匹配学生姓名 87 | student_name_re = re.compile(r'.*The Team [0|O]f(.*)With [Student|Faculty]', re.I | re.S) 88 | # 2进行匹配老师姓名 89 | faculty_name_re = re.compile(r'.*With.*Advisor(.+?)[0|O]f.*Was Designated',re.I | re.S) 90 | # 3进行匹配学校 91 | school_re = re.compile(r'With.*Advisor.*[0|O]f\n(.+?)Was Designated As.*',re.I | re.S | re.DOTALL) 92 | # 4进行匹配奖项 93 | awards_re = re.compile(r'Was Designated As(.*)\n+.+',re.I | re.S | re.DOTALL) 94 | #创建队列 95 | n=int(index[1])-int(index[0])+1 #爬取的总数量 96 | q=queue.Queue(maxsize=n) 97 | #将url数据存入队列中 98 | 99 | for i in range(int(index[0]),int(index[1])): 100 | q.put(2400000+i) 101 | 102 | # 下面创建一个线程锁对象,防止多线程存入结果中发生错乱(通过后续调用acquire和release方法来使用),全局变量用于main() 103 | muti_lock = threading.Lock() 104 | 105 | # 创建存储列表 106 | Team_number_list=[] #存储队伍号 107 | Team_members_1_list=[] #队员1 108 | Team_members_2_list = [] #队员2 109 | Team_members_3_list = [] #队员3 110 | Instructor_list=[] #指导老师 111 | School_list=[] #学校 112 | Awards_list=[] #奖项 113 | 114 | # 下面进行创建多线程操作 115 | thread = [] # 存储所有线程对象 116 | for i in range(n_thread): # 50个线程 117 | t = threading.Thread(target=main, name='LoopThread' + str(i + 1)) # 其中target就是每个线程运行的程序,name就是标记下名字 118 | t.start() 119 | thread.append(t) 120 | 121 | #下面设置等待所有进行结束再运行下一步 122 | for t in thread: 123 | t.join() 124 | 125 | #进行最后一次存储数据 126 | result_csv=save_data(Team_number_list,Team_members_1_list,Team_members_2_list,Team_members_3_list,Instructor_list, 127 | School_list,Awards_list) 128 | logger.success(f'已完成所有数据的爬取,总共爬取到{len(result_csv)}份有效数据,文字信息数据已保存在result/data.csv中,奖状图片已保存在result/Award Picture文件夹下') 129 | logger.info('下面进行数据可视化分析') 130 | plot_data(result_csv) 131 | logger.success('已完成所有数据可视化分析,结果图片保存在result文件夹下') 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /Universal.py: -------------------------------------------------------------------------------- 1 | import random 2 | import requests 3 | import pandas as pd 4 | import matplotlib.pyplot as plt 5 | import re 6 | import numpy as np 7 | from pdf2image import convert_from_bytes 8 | from plugin.pytesseract import pytesseract #用于OCR识别 9 | from PIL import Image 10 | import os 11 | from loguru import logger 12 | from matplotlib import rcParams 13 | 14 | config = {"font.family":'Times New Roman'} # 设置画图字体类型 15 | rcParams.update(config) #进行更新配置 16 | 17 | #下面发送请求并将pdf文件转化为png图片格式 18 | def request_data(url,image_path,proxy): #其中url是传入的url 19 | team_number = url.split('/')[-1].split('.')[0] # 拿到队伍号 20 | # user_agent列表 21 | user_agent_list = [ 22 | 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER', 23 | 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)', 24 | 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0', 25 | 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36', 26 | 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36' 27 | ] 28 | # refere 29 | # 先构造请求头 30 | User_Agent = random.choice(user_agent_list) # 获取随机生成user_agent和referer用于伪装 31 | headers = { 32 | "User-Agent": User_Agent, 33 | } 34 | # 发送请求 35 | try: 36 | response = requests.get(url, headers=headers,proxies={'https':proxy,'http':proxy}) # 发送请求(注意这里的代理) 37 | team_number = url.split('/')[-1].split('.')[0] # 拿到队伍号 38 | if not str(response.status_code).startswith('4'): #不是返回4开头的状态码 39 | # 下面进行将读取的二进制pdf数据存储为png图片格式 40 | image = convert_from_bytes(response.content) # 将读取二进制数据并转化为图片 41 | # 进行读取pdf内容并保存到本地 42 | image[0].save(f'{image_path}\\{str(team_number)}.png', 'PNG') # 将图片进行保存到对应的文件中(png格式,注意只有1页) 43 | image = Image.open(os.path.join(image_path, f'{team_number}.png')) # 导入图像 44 | #logger.success('转化图片成功') 45 | return image 46 | else: 47 | logger.error(f'号码为{team_number}的队伍不存在') 48 | pass 49 | except Exception as e: #网页打不开 50 | logger.error(f'号码为{team_number}的队伍不存在',str(e)) 51 | return None 52 | 53 | #下面进行OCR识别并进行提取需要的数据 54 | def extract_data(tessdata,image,team_number,detect_advisor,student_name_re,faculty_name_re,school_re,awards_re): #输入图像 55 | try: 56 | #进行OCR识别 57 | tessdata_dir_config = f'--tessdata-dir "{tessdata}"' #语言包地址(外部导入) 58 | text=pytesseract.image_to_string(image,config=tessdata_dir_config,lang='eng') #进行OCR识别(英语) 59 | #进行匹配 60 | if detect_advisor.findall(text): #如果是有advisor的 61 | student_name=list(filter(None,student_name_re.search(text).group(1).strip('\n').strip().split('\n'))) #列表形式,并过滤空字符串 学生 62 | faculty_name=faculty_name_re.search(text).group(1).strip('\n') #字符串形式 老师 63 | school = school_re.search(text).group(1).strip('\n') # 字符串形式 学校 64 | else: #有些奖状错误(要重新匹配学生和老师、学校) 65 | # 匹配姓名 66 | name_re1 = re.compile(r'.*The Team [0|O]f(.*)[0|O]f.+Was Designated', re.I | re.S) 67 | name_list = list(filter(None, name_re1.search(text).group(1).strip('\n').strip().split('\n'))) 68 | index=name_list.index('Of') if 'Of' in name_list else name_list.index('of') #查找of的序号 69 | student_name=name_list[:index-1] 70 | faculty_name=name_list[index-1] 71 | school=name_list[index+1] 72 | 73 | awards=awards_re.search(text).group(1).strip('\n').split(sep='\n')[0] #字符串形式 74 | 75 | #对学生列表确保长度为3(添加空白字符串) 76 | student_name+=['']*(3-len(student_name)) 77 | 78 | #logger.success('OCR识别成功,数据提取成功') 79 | 80 | return student_name,faculty_name,school,awards 81 | except Exception as e: 82 | logger.error(f'队伍号为{team_number}的OCR识别和数据提取出错',str(e)) 83 | pass 84 | 85 | #进行保存数据到csv文件中 86 | def save_data(Team_number_list,Team_members_1_list,Team_members_2_list,Team_members_3_list,Instructor_list, 87 | School_list,Awards_list): 88 | result_csv=pd.DataFrame() 89 | result_csv['Team number']=Team_number_list 90 | result_csv['Team members 1'] = Team_members_1_list 91 | result_csv['Team members 2'] = Team_members_2_list 92 | result_csv['Team members 3'] = Team_members_3_list 93 | result_csv['Instructor'] =Instructor_list 94 | result_csv['School'] = School_list 95 | result_csv['Awards'] = Awards_list 96 | result_csv.sort_values(by='Team number',inplace=True,ascending=True) #按队伍号升序 97 | result_csv.to_csv('result\\data.csv',index=None,encoding='utf-8') 98 | return result_csv 99 | 100 | #进行数据分析出图(如果有数据可以单独调用) 101 | def plot_data(result_csv): 102 | result_csv['School'] = result_csv['School'].str.upper() # 全部变为大写 103 | # 奖项名称 104 | Awards_name = ['Not Judged', 'Disqualified - P', 'Unsuccessful - I', 'Successful Participant', 'Honorable Mention', 105 | 'Meritorious Winner', 'Finalist', 'Outstanding Winner'] 106 | # 进行统计各奖项(降序) 107 | values_count = result_csv['Awards'].value_counts() # 字典形式 108 | num_list = [] 109 | for name in Awards_name: 110 | num_list.append(len(result_csv[result_csv['Awards'] == name])) 111 | 112 | # 1绘制奖状数量条形图 113 | height=0.25 #高度(每个条形之间) 114 | index=np.arange(len(num_list)) #特征类别个数 115 | plt.figure(figsize=(8, 6)) 116 | plt.rcParams['axes.unicode_minus']=False #用来正常显示正负号 117 | plt.style.use('seaborn-whitegrid') 118 | plt.tick_params(size=5, labelsize=13) # 坐标轴 119 | plt.barh(index,num_list,height=height,color='#F21855',alpha=1) #从下往上 120 | for i,data in enumerate(num_list): 121 | plt.text(data,index[i]-0.11,round(data,1),fontsize=13,family='Times New Roman') 122 | plt.yticks(index,Awards_name) #设置y轴的标签 123 | plt.xlabel('计数',fontsize=13,family='SimHei') #注意这个还是横轴的 124 | plt.ylabel('奖项',fontsize=13,family='Times New Roman') #竖轴的标签 125 | plt.title('美赛各奖项计数',fontsize=15,family='SimHei') 126 | plt.savefig(r'result/美赛各奖项计数条形图.svg',format='svg',bbox_inches='tight') 127 | plt.show() 128 | 129 | # 2绘制参赛学校数量的条形图(从高到底) 130 | school_count=result_csv['School'].value_counts() 131 | school_name=school_count.keys().tolist()[:15][::-1] #显示前15所学校 132 | school_num=list(school_count.values[:15])[::-1] 133 | height=0.4 #高度(每个条形之间) 134 | index=np.arange(len(school_num)) #特征类别个数 135 | plt.figure(figsize=(8, 6)) 136 | plt.rcParams['axes.unicode_minus']=False 137 | plt.style.use('seaborn-whitegrid') 138 | plt.tick_params(size=5, labelsize=13) # 坐标轴 139 | plt.barh(index,school_num,height=height,color='#bf0000',alpha=1) #从下往上 140 | for i,data in enumerate(school_num): 141 | plt.text(data,index[i]-0.17,round(data,1),fontsize=13,family='Times New Roman') 142 | plt.yticks(index,school_name) #设置y轴的标签 143 | plt.xlabel('计数',fontsize=13,family='SimHei') #注意这个还是横轴的 144 | plt.ylabel('学校名称',fontsize=13,family='SimHei') #竖轴的标签 145 | plt.title('美赛各参加学校参赛计数前十五名',fontsize=15,family='SimHei') 146 | plt.savefig(r'result/美赛各参加学校计数前十五名条形图.svg',format='svg',bbox_inches='tight') 147 | plt.show() 148 | 149 | # 3队伍不同参加人数的计数柱形图(1人,2人,3人) 150 | # 计算每队参赛队员人数 151 | result_csv.fillna(0, inplace=True) # 填补缺失值用于统计 152 | result_csv['total number'] = result_csv['Team members 1'].apply(lambda x: 1 if x != 0 else 0) + \ 153 | result_csv['Team members 2'].apply(lambda x: 1 if x != 0 else 0) + \ 154 | result_csv['Team members 3'].apply(lambda x: 1 if x != 0 else 0) 155 | member_num = result_csv['total number'].value_counts(ascending=True).values[:] if len(result_csv['total number'].value_counts(ascending=True).values) == 3 else result_csv['total number'].value_counts(ascending=True).values[1:4] 156 | index = np.arange(3) # 横轴的特征数,这里有三特征,用于绘制簇状柱形图 157 | feature_index = ['1', '2', '3'] # 横轴x的特征名称 158 | # 进行绘制 159 | plt.figure(figsize=(8, 6)) 160 | plt.style.use('seaborn-whitegrid') 161 | plt.tick_params(size=5, labelsize=13) # 坐标轴 162 | width = 0.6 163 | # 注意下面可以进行绘制误差线,如果是计算均值那种的簇状柱形图的话(注意类别多的话可以用循环的方式搞) 164 | plt.bar(index, member_num, width=width, alpha=0.4, color='#52D896') 165 | for i, data in enumerate(member_num): 166 | plt.text(index[i], data + 0.1, data, horizontalalignment='center', fontsize=13, family='Times New Roman') 167 | plt.xlabel('队伍人数', fontsize=13, family='SimHei') 168 | plt.ylabel('计数', fontsize=13, family='SimHei') 169 | plt.title('队伍中队员人数统计', fontsize=15, family='SimHei') 170 | plt.xticks(index, feature_index) 171 | plt.savefig(f'result\\队伍中队员人数统计.svg', format='svg', bbox_inches='tight') 172 | plt.show() 173 | 174 | # 各个学校获得奖项数量的排名(S、H、M、F、O)(5张图) 175 | # 奖项选择 176 | choose_award = ['Successful Participant', 'Honorable Mention', 'Meritorious Winner', 'Finalist', 177 | 'Outstanding Winner'] 178 | # 颜色列表 179 | color_list = ['#fb9489', '#a9ddd4', '#9ec3db', '#cbc7de', '#fdfcc9'] # 颜色列表 180 | for i, award in enumerate(choose_award): 181 | school_count = result_csv[result_csv['Awards'] == award]['School'].value_counts() # 选出对应奖项的数据 182 | print(school_count) 183 | school_name = school_count.keys().tolist()[:15][::-1] # 显示数量最多前15所学校 184 | school_num = list(school_count.values[:15])[::-1] 185 | height = 0.4 # 高度(每个条形之间) 186 | index = np.arange(len(school_num)) # 特征类别个数 187 | plt.figure(figsize=(8, 6)) 188 | plt.rcParams['axes.unicode_minus'] = False # 用来正常显示正负号 189 | plt.style.use('seaborn-whitegrid') 190 | plt.tick_params(size=5, labelsize=13) # 坐标轴 191 | plt.barh(index, school_num, height=height, color=color_list[i], alpha=1) # 从下往上 192 | for i, data in enumerate(school_num): 193 | plt.text(data, index[i] - 0.17, round(data, 1), fontsize=13, family='Times New Roman') 194 | plt.yticks(index, school_name) # 设置y轴的标签 195 | plt.xlabel('计数', fontsize=13, family='SimHei') # 注意这个还是横轴的 196 | plt.ylabel('学校名称', fontsize=13, family='SimHei') # 竖轴的标签 197 | plt.title(f'获得{award}奖项最多前十五名学校名称', fontsize=15, family='SimHei') 198 | plt.savefig(f'result\\获得{award}奖项最多前十五名学校名称.svg', format='svg', bbox_inches='tight') 199 | plt.show() 200 | 201 | 202 | 203 | 204 | 205 | -------------------------------------------------------------------------------- /plugin/pytesseract/pytesseract.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import re 4 | import shlex 5 | import string 6 | import subprocess 7 | import sys 8 | from contextlib import contextmanager 9 | from csv import QUOTE_NONE 10 | from errno import ENOENT 11 | from functools import wraps 12 | from glob import iglob 13 | from io import BytesIO 14 | from os.path import abspath 15 | from os import environ 16 | from os import extsep 17 | from os import linesep 18 | from os import remove 19 | from os.path import normcase 20 | from os.path import normpath 21 | from os.path import realpath 22 | from pkgutil import find_loader 23 | from tempfile import NamedTemporaryFile 24 | from time import sleep 25 | import yaml 26 | from packaging.version import InvalidVersion 27 | from packaging.version import parse 28 | from packaging.version import Version 29 | from PIL import Image 30 | from loguru import logger 31 | try: 32 | with open(f"{os.path.abspath('.')}\\config.yaml",'r',encoding='utf-8') as f: 33 | config=yaml.safe_load(f) 34 | tesseract_cmd =config['tesseract_exe'] 35 | except Exception as e: 36 | logger.error('tesseract.exe的文件目录有误') 37 | exit() 38 | 39 | numpy_installed = find_loader('numpy') is not None 40 | if numpy_installed: 41 | from numpy import ndarray 42 | 43 | pandas_installed = find_loader('pandas') is not None 44 | if pandas_installed: 45 | import pandas as pd 46 | 47 | DEFAULT_ENCODING = 'utf-8' 48 | LANG_PATTERN = re.compile('^[a-z_]+$') 49 | RGB_MODE = 'RGB' 50 | SUPPORTED_FORMATS = { 51 | 'JPEG', 52 | 'JPEG2000', 53 | 'PNG', 54 | 'PBM', 55 | 'PGM', 56 | 'PPM', 57 | 'TIFF', 58 | 'BMP', 59 | 'GIF', 60 | 'WEBP', 61 | } 62 | 63 | OSD_KEYS = { 64 | 'Page number': ('page_num', int), 65 | 'Orientation in degrees': ('orientation', int), 66 | 'Rotate': ('rotate', int), 67 | 'Orientation confidence': ('orientation_conf', float), 68 | 'Script': ('script', str), 69 | 'Script confidence': ('script_conf', float), 70 | } 71 | 72 | TESSERACT_MIN_VERSION = Version('3.05') 73 | TESSERACT_ALTO_VERSION = Version('4.1.0') 74 | 75 | 76 | class Output: 77 | BYTES = 'bytes' 78 | DATAFRAME = 'data.frame' 79 | DICT = 'dict' 80 | STRING = 'string' 81 | 82 | 83 | class PandasNotSupported(EnvironmentError): 84 | def __init__(self): 85 | super().__init__('Missing pandas package') 86 | 87 | 88 | class TesseractError(RuntimeError): 89 | def __init__(self, status, message): 90 | self.status = status 91 | self.message = message 92 | self.args = (status, message) 93 | 94 | 95 | class TesseractNotFoundError(EnvironmentError): 96 | def __init__(self): 97 | super().__init__( 98 | f"{tesseract_cmd} is not installed or it's not in your PATH." 99 | f' See README file for more information.', 100 | ) 101 | 102 | 103 | class TSVNotSupported(EnvironmentError): 104 | def __init__(self): 105 | super().__init__( 106 | 'TSV output not supported. Tesseract >= 3.05 required', 107 | ) 108 | 109 | 110 | class ALTONotSupported(EnvironmentError): 111 | def __init__(self): 112 | super().__init__( 113 | 'ALTO output not supported. Tesseract >= 4.1.0 required', 114 | ) 115 | 116 | 117 | def kill(process, code): 118 | process.terminate() 119 | try: 120 | process.wait(1) 121 | except TypeError: # python2 Popen.wait(1) fallback 122 | sleep(1) 123 | except Exception: # python3 subprocess.TimeoutExpired 124 | pass 125 | finally: 126 | process.kill() 127 | process.returncode = code 128 | 129 | 130 | @contextmanager 131 | def timeout_manager(proc, seconds=None): 132 | try: 133 | if not seconds: 134 | yield proc.communicate()[1] 135 | return 136 | 137 | try: 138 | _, error_string = proc.communicate(timeout=seconds) 139 | yield error_string 140 | except subprocess.TimeoutExpired: 141 | kill(proc, -1) 142 | raise RuntimeError('Tesseract process timeout') 143 | finally: 144 | proc.stdin.close() 145 | proc.stdout.close() 146 | proc.stderr.close() 147 | 148 | 149 | def run_once(func): 150 | @wraps(func) 151 | def wrapper(*args, **kwargs): 152 | if wrapper._result is wrapper: 153 | wrapper._result = func(*args, **kwargs) 154 | return wrapper._result 155 | 156 | wrapper._result = wrapper 157 | return wrapper 158 | 159 | 160 | def get_errors(error_string): 161 | return ' '.join( 162 | line for line in error_string.decode(DEFAULT_ENCODING).splitlines() 163 | ).strip() 164 | 165 | 166 | def cleanup(temp_name): 167 | """Tries to remove temp files by filename wildcard path.""" 168 | for filename in iglob(f'{temp_name}*' if temp_name else temp_name): 169 | try: 170 | remove(filename) 171 | except OSError as e: 172 | if e.errno != ENOENT: 173 | raise 174 | 175 | 176 | def prepare(image): 177 | if numpy_installed and isinstance(image, ndarray): 178 | image = Image.fromarray(image) 179 | 180 | if not isinstance(image, Image.Image): 181 | raise TypeError('Unsupported image object') 182 | 183 | extension = 'PNG' if not image.format else image.format 184 | if extension not in SUPPORTED_FORMATS: 185 | raise TypeError('Unsupported image format/type') 186 | 187 | if 'A' in image.getbands(): 188 | # discard and replace the alpha channel with white background 189 | background = Image.new(RGB_MODE, image.size, (255, 255, 255)) 190 | background.paste(image, (0, 0), image.getchannel('A')) 191 | image = background 192 | 193 | image.format = extension 194 | return image, extension 195 | 196 | 197 | @contextmanager 198 | def save(image): 199 | try: 200 | with NamedTemporaryFile(prefix='tess_', delete=False) as f: 201 | if isinstance(image, str): 202 | yield f.name, realpath(normpath(normcase(image))) 203 | return 204 | image, extension = prepare(image) 205 | input_file_name = f'{f.name}_input{extsep}{extension}' 206 | image.save(input_file_name, format=image.format) 207 | yield f.name, input_file_name 208 | finally: 209 | cleanup(f.name) 210 | 211 | 212 | def subprocess_args(include_stdout=True): 213 | # See https://github.com/pyinstaller/pyinstaller/wiki/Recipe-subprocess 214 | # for reference and comments. 215 | 216 | kwargs = { 217 | 'stdin': subprocess.PIPE, 218 | 'stderr': subprocess.PIPE, 219 | 'startupinfo': None, 220 | 'env': environ, 221 | } 222 | 223 | if hasattr(subprocess, 'STARTUPINFO'): 224 | kwargs['startupinfo'] = subprocess.STARTUPINFO() 225 | kwargs['startupinfo'].dwFlags |= subprocess.STARTF_USESHOWWINDOW 226 | kwargs['startupinfo'].wShowWindow = subprocess.SW_HIDE 227 | 228 | if include_stdout: 229 | kwargs['stdout'] = subprocess.PIPE 230 | else: 231 | kwargs['stdout'] = subprocess.DEVNULL 232 | 233 | return kwargs 234 | 235 | 236 | def run_tesseract( 237 | input_filename, 238 | output_filename_base, 239 | extension, 240 | lang, 241 | config='', 242 | nice=0, 243 | timeout=0, 244 | ): 245 | cmd_args = [] 246 | 247 | if not sys.platform.startswith('win32') and nice != 0: 248 | cmd_args += ('nice', '-n', str(nice)) 249 | 250 | cmd_args += (tesseract_cmd, input_filename, output_filename_base) 251 | 252 | if lang is not None: 253 | cmd_args += ('-l', lang) 254 | 255 | if config: 256 | cmd_args += shlex.split(config) 257 | 258 | if extension and extension not in {'box', 'osd', 'tsv', 'xml'}: 259 | cmd_args.append(extension) 260 | 261 | try: 262 | proc = subprocess.Popen(cmd_args, **subprocess_args()) 263 | except OSError as e: 264 | if e.errno != ENOENT: 265 | raise 266 | else: 267 | raise TesseractNotFoundError() 268 | 269 | with timeout_manager(proc, timeout) as error_string: 270 | if proc.returncode: 271 | raise TesseractError(proc.returncode, get_errors(error_string)) 272 | 273 | 274 | def run_and_get_output( 275 | image, 276 | extension='', 277 | lang=None, 278 | config='', 279 | nice=0, 280 | timeout=0, 281 | return_bytes=False, 282 | ): 283 | 284 | with save(image) as (temp_name, input_filename): 285 | kwargs = { 286 | 'input_filename': input_filename, 287 | 'output_filename_base': temp_name, 288 | 'extension': extension, 289 | 'lang': lang, 290 | 'config': config, 291 | 'nice': nice, 292 | 'timeout': timeout, 293 | } 294 | 295 | run_tesseract(**kwargs) 296 | filename = f"{kwargs['output_filename_base']}{extsep}{extension}" 297 | with open(filename, 'rb') as output_file: 298 | if return_bytes: 299 | return output_file.read() 300 | return output_file.read().decode(DEFAULT_ENCODING) 301 | 302 | 303 | def file_to_dict(tsv, cell_delimiter, str_col_idx): 304 | result = {} 305 | rows = [row.split(cell_delimiter) for row in tsv.strip().split('\n')] 306 | if len(rows) < 2: 307 | return result 308 | 309 | header = rows.pop(0) 310 | length = len(header) 311 | if len(rows[-1]) < length: 312 | # Fixes bug that occurs when last text string in TSV is null, and 313 | # last row is missing a final cell in TSV file 314 | rows[-1].append('') 315 | 316 | if str_col_idx < 0: 317 | str_col_idx += length 318 | 319 | for i, head in enumerate(header): 320 | result[head] = list() 321 | for row in rows: 322 | if len(row) <= i: 323 | continue 324 | 325 | if i != str_col_idx: 326 | try: 327 | val = int(float(row[i])) 328 | except ValueError: 329 | val = row[i] 330 | else: 331 | val = row[i] 332 | 333 | result[head].append(val) 334 | 335 | return result 336 | 337 | 338 | def is_valid(val, _type): 339 | if _type is int: 340 | return val.isdigit() 341 | 342 | if _type is float: 343 | try: 344 | float(val) 345 | return True 346 | except ValueError: 347 | return False 348 | 349 | return True 350 | 351 | 352 | def osd_to_dict(osd): 353 | return { 354 | OSD_KEYS[kv[0]][0]: OSD_KEYS[kv[0]][1](kv[1]) 355 | for kv in (line.split(': ') for line in osd.split('\n')) 356 | if len(kv) == 2 and is_valid(kv[1], OSD_KEYS[kv[0]][1]) 357 | } 358 | 359 | 360 | @run_once 361 | def get_languages(config=''): 362 | cmd_args = [tesseract_cmd, '--list-langs'] 363 | if config: 364 | cmd_args += shlex.split(config) 365 | 366 | try: 367 | result = subprocess.run( 368 | cmd_args, 369 | stdout=subprocess.PIPE, 370 | stderr=subprocess.STDOUT, 371 | ) 372 | except OSError: 373 | raise TesseractNotFoundError() 374 | 375 | # tesseract 3.x 376 | if result.returncode not in (0, 1): 377 | raise TesseractNotFoundError() 378 | 379 | languages = [] 380 | if result.stdout: 381 | for line in result.stdout.decode(DEFAULT_ENCODING).split(linesep): 382 | lang = line.strip() 383 | if LANG_PATTERN.match(lang): 384 | languages.append(lang) 385 | 386 | return languages 387 | 388 | 389 | @run_once 390 | def get_tesseract_version(): 391 | """ 392 | Returns Version object of the Tesseract version 393 | """ 394 | try: 395 | output = subprocess.check_output( 396 | [tesseract_cmd, '--version'], 397 | stderr=subprocess.STDOUT, 398 | env=environ, 399 | stdin=subprocess.DEVNULL, 400 | ) 401 | except OSError: 402 | raise TesseractNotFoundError() 403 | 404 | raw_version = output.decode(DEFAULT_ENCODING) 405 | str_version, *_ = raw_version.lstrip(string.printable[10:]).partition(' ') 406 | str_version, *_ = str_version.partition('-') 407 | 408 | try: 409 | version = parse(str_version) 410 | assert version >= TESSERACT_MIN_VERSION 411 | except (AssertionError, InvalidVersion): 412 | raise SystemExit(f'Invalid tesseract version: "{raw_version}"') 413 | 414 | return version 415 | 416 | 417 | def image_to_string( 418 | image, 419 | lang=None, 420 | config='', 421 | nice=0, 422 | output_type=Output.STRING, 423 | timeout=0, 424 | ): 425 | """ 426 | Returns the result of a Tesseract OCR run on the provided image to string 427 | """ 428 | args = [image, 'txt', lang, config, nice, timeout] 429 | 430 | return { 431 | Output.BYTES: lambda: run_and_get_output(*(args + [True])), 432 | Output.DICT: lambda: {'text': run_and_get_output(*args)}, 433 | Output.STRING: lambda: run_and_get_output(*args), 434 | }[output_type]() 435 | 436 | 437 | def image_to_pdf_or_hocr( 438 | image, 439 | lang=None, 440 | config='', 441 | nice=0, 442 | extension='pdf', 443 | timeout=0, 444 | ): 445 | """ 446 | Returns the result of a Tesseract OCR run on the provided image to pdf/hocr 447 | """ 448 | 449 | if extension not in {'pdf', 'hocr'}: 450 | raise ValueError(f'Unsupported extension: {extension}') 451 | args = [image, extension, lang, config, nice, timeout, True] 452 | 453 | return run_and_get_output(*args) 454 | 455 | 456 | def image_to_alto_xml( 457 | image, 458 | lang=None, 459 | config='', 460 | nice=0, 461 | timeout=0, 462 | ): 463 | """ 464 | Returns the result of a Tesseract OCR run on the provided image to ALTO XML 465 | """ 466 | 467 | if get_tesseract_version() < TESSERACT_ALTO_VERSION: 468 | raise ALTONotSupported() 469 | 470 | config = f'-c tessedit_create_alto=1 {config.strip()}' 471 | args = [image, 'xml', lang, config, nice, timeout, True] 472 | 473 | return run_and_get_output(*args) 474 | 475 | 476 | def image_to_boxes( 477 | image, 478 | lang=None, 479 | config='', 480 | nice=0, 481 | output_type=Output.STRING, 482 | timeout=0, 483 | ): 484 | """ 485 | Returns string containing recognized characters and their box boundaries 486 | """ 487 | config = f'{config.strip()} batch.nochop makebox' 488 | args = [image, 'box', lang, config, nice, timeout] 489 | 490 | return { 491 | Output.BYTES: lambda: run_and_get_output(*(args + [True])), 492 | Output.DICT: lambda: file_to_dict( 493 | f'char left bottom right top page\n{run_and_get_output(*args)}', 494 | ' ', 495 | 0, 496 | ), 497 | Output.STRING: lambda: run_and_get_output(*args), 498 | }[output_type]() 499 | 500 | 501 | def get_pandas_output(args, config=None): 502 | if not pandas_installed: 503 | raise PandasNotSupported() 504 | 505 | kwargs = {'quoting': QUOTE_NONE, 'sep': '\t'} 506 | try: 507 | kwargs.update(config) 508 | except (TypeError, ValueError): 509 | pass 510 | 511 | return pd.read_csv(BytesIO(run_and_get_output(*args)), **kwargs) 512 | 513 | 514 | def image_to_data( 515 | image, 516 | lang=None, 517 | config='', 518 | nice=0, 519 | output_type=Output.STRING, 520 | timeout=0, 521 | pandas_config=None, 522 | ): 523 | """ 524 | Returns string containing box boundaries, confidences, 525 | and other information. Requires Tesseract 3.05+ 526 | """ 527 | 528 | if get_tesseract_version() < TESSERACT_MIN_VERSION: 529 | raise TSVNotSupported() 530 | 531 | config = f'-c tessedit_create_tsv=1 {config.strip()}' 532 | args = [image, 'tsv', lang, config, nice, timeout] 533 | 534 | return { 535 | Output.BYTES: lambda: run_and_get_output(*(args + [True])), 536 | Output.DATAFRAME: lambda: get_pandas_output( 537 | args + [True], 538 | pandas_config, 539 | ), 540 | Output.DICT: lambda: file_to_dict(run_and_get_output(*args), '\t', -1), 541 | Output.STRING: lambda: run_and_get_output(*args), 542 | }[output_type]() 543 | 544 | 545 | def image_to_osd( 546 | image, 547 | lang='osd', 548 | config='', 549 | nice=0, 550 | output_type=Output.STRING, 551 | timeout=0, 552 | ): 553 | """ 554 | Returns string containing the orientation and script detection (OSD) 555 | """ 556 | config = f'--psm 0 {config.strip()}' 557 | args = [image, 'osd', lang, config, nice, timeout] 558 | 559 | return { 560 | Output.BYTES: lambda: run_and_get_output(*(args + [True])), 561 | Output.DICT: lambda: osd_to_dict(run_and_get_output(*args)), 562 | Output.STRING: lambda: run_and_get_output(*args), 563 | }[output_type]() 564 | 565 | 566 | def main(): 567 | if len(sys.argv) == 2: 568 | filename, lang = sys.argv[1], None 569 | elif len(sys.argv) == 4 and sys.argv[1] == '-l': 570 | filename, lang = sys.argv[3], sys.argv[2] 571 | else: 572 | print('Usage: pytesseract [-l lang] input_file\n', file=sys.stderr) 573 | return 2 574 | 575 | try: 576 | with Image.open(filename) as img: 577 | print(image_to_string(img, lang=lang)) 578 | except TesseractNotFoundError as e: 579 | print(f'{str(e)}\n', file=sys.stderr) 580 | return 1 581 | except OSError as e: 582 | print(f'{type(e).__name__}: {e}', file=sys.stderr) 583 | return 1 584 | 585 | 586 | if __name__ == '__main__': 587 | exit(main()) 588 | -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/COPYING: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /plugin/poppler-0.68.0/bin/COPYING3: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /result/美赛各奖项计数条形图.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 2023-05-11T19:40:46.124678 10 | image/svg+xml 11 | 12 | 13 | Matplotlib v3.7.1, https://matplotlib.org/ 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 46 | 47 | 48 | 49 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 406 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 515 | 516 | 517 | 518 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 543 | 565 | 588 | 589 | 606 | 628 | 655 | 689 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 770 | 783 | 819 | 845 | 887 | 894 | 916 | 923 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 1002 | 1023 | 1045 | 1052 | 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 1070 | 1071 | 1072 | 1073 | 1074 | 1077 | 1078 | 1079 | 1080 | 1081 | 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 1125 | 1141 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | 1194 | 1195 | 1196 | 1197 | 1200 | 1201 | 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | 1208 | 1209 | 1210 | 1225 | 1251 | 1269 | 1270 | 1271 | 1272 | 1273 | 1274 | 1275 | 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | 1283 | 1284 | 1285 | 1286 | 1287 | 1288 | 1289 | 1290 | 1291 | 1292 | 1295 | 1296 | 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | 1303 | 1304 | 1305 | 1327 | 1328 | 1329 | 1330 | 1331 | 1332 | 1333 | 1334 | 1335 | 1336 | 1337 | 1338 | 1339 | 1340 | 1341 | 1342 | 1343 | 1344 | 1345 | 1346 | 1347 | 1348 | 1349 | 1350 | 1351 | 1354 | 1355 | 1356 | 1357 | 1358 | 1359 | 1360 | 1361 | 1362 | 1363 | 1364 | 1377 | 1378 | 1379 | 1380 | 1381 | 1382 | 1383 | 1384 | 1385 | 1386 | 1387 | 1388 | 1389 | 1390 | 1391 | 1394 | 1395 | 1396 | 1397 | 1398 | 1399 | 1400 | 1401 | 1402 | 1403 | 1404 | 1429 | 1430 | 1431 | 1432 | 1433 | 1434 | 1435 | 1436 | 1437 | 1438 | 1439 | 1440 | 1441 | 1442 | 1443 | 1444 | 1445 | 1446 | 1447 | 1448 | 1449 | 1450 | 1451 | 1452 | 1453 | 1454 | 1455 | 1468 | 1481 | 1482 | 1483 | 1484 | 1485 | 1486 | 1487 | 1488 | 1494 | 1495 | 1496 | 1502 | 1503 | 1504 | 1510 | 1511 | 1512 | 1518 | 1519 | 1520 | 1526 | 1527 | 1528 | 1534 | 1535 | 1536 | 1542 | 1543 | 1544 | 1550 | 1551 | 1552 | 1555 | 1556 | 1557 | 1560 | 1561 | 1562 | 1565 | 1566 | 1567 | 1570 | 1571 | 1572 | 1573 | 1574 | 1575 | 1600 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 1626 | 1627 | 1628 | 1658 | 1671 | 1697 | 1698 | 1699 | 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1728 | 1768 | 1769 | 1770 | 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1813 | 1839 | 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | 1846 | 1847 | 1848 | 1849 | 1850 | 1851 | 1852 | 1853 | 1854 | 1855 | 1856 | 1857 | 1858 | 1859 | 1860 | 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | 1876 | 1877 | 1878 | 1879 | 1880 | 1881 | 1882 | 1883 | 1884 | 1959 | 2058 | 2105 | 2178 | 2239 | 2240 | 2241 | 2242 | 2243 | 2244 | 2245 | 2246 | 2247 | 2248 | 2249 | 2250 | 2251 | 2252 | 2253 | 2254 | 2255 | 2256 | 2257 | --------------------------------------------------------------------------------