aneasystone's blog - 开源
type: channel
link: https://www.aneasystone.com/category/opensource/
items: 盘点 Python 中那些 PDF 解析库
items: 实战 APISIX 服务发现
items: 使用 GitHub Actions 跟踪 GitHub 趋势项目
items: Typecho 文章二维码插件
items: CodeIgniter 3.0 中文文档
items: 我的第二个Chrome扩展：JSONView增强版
items: 博客正式从WordPress转为Typecho
items: 我的第一个Chrome扩展：Search-faster

盘点 Python 中那些 PDF 解析库
type: item
date: 2025-03-15T02:16:00+00:00
description: 使用 RAG 实现企业私域知识问答是目前最流行也是最前沿的大模型技术之一，在 高级 RAG 技术学习笔记 这篇笔记中，我介绍了很多种不同的高级 RAG 技术，其关注点更多的是如何检索私域知识以及如何将检索结果灌输到大模型中，并没有深入如何获得这些私域知识。现实中，绝大数企业私域知识都是非结构化的，散落在各种网页、文档或邮件附件里，如果能将这些内容解析出来，对企业来说无疑是巨大的价值。而在这些非结构化的文档中，PDF 文档占比很高，使得 PDF 解析对 RAG 至关重要。PDF 全称 Portable Document Format（可移植文档格式），于 1993 年由 Adobe 公司开发，鉴于其跨平台性、高安全性、开放标准、可搜索性和可访问性等优势，已经成为全球范围内广泛使用的文件格式。Python 中有着大量的 PDF 解析库，这篇笔记对常用的 PDF 解析库做一个盘点，方便自己后期技术选型时做参考。pypdfpypdf 是一个免费且开源的纯 Python PDF 库，能够分割、合并、裁剪和转换 PDF 文件的页面，可以向 PDF 文件添加自定义数据，对 PDF 文件进行加密和解密。当然，pypdf 还可以从 PDF 中提取文本、图片、附件、批注和元数据等。from pypdf import PdfReader reader = PdfReader("./pdfs/example.pdf") number_of_pages = len(reader.pages) print('Total %d pages.' % (number_of_pages)) for i in range(number_of_pages): print('----- Page %d -----' % (i+1)) page = reader.pages[i] text = page.extract_text() print(text) for count, image_file_object in enumerate(page.images): with open(str(count) + image_file_object.name, "wb") as fp: fp.write(image_file_object.data)可以看出 pypdf 的用法较为简单，我们只能拿到每一页的文本和图片内容，拿不到更多的详细信息，比如文本字体和大小，块位置等，这些信息在处理复杂场景时是必不可少的。所以 pypdf 只适合 PDF 的内容比较规整的场景。pdfminer.sixpdfminer.six 也是一个纯 Python 编写的 PDF 库，专注于获取和分析文本数据。pdfminer 最初由 Euske 开发，但是只支持 Python 2，不支持 Python 3，于是社区在他的基础上引入了 six，这是一个无需修改代码，就可以同时兼容 Python 2 和 3 的库，所以叫做 pdfminer.six。使用 extract_text 方法实现类似 pypdf 的效果，直接返回文本：from pdfminer.high_level import extract_text text = extract_text("./pdfs/example.pdf") print(text)或者使用 extract_pages 方法提取元素的详细信息，包括文本的精确位置、字体、大小或颜色：from pdfminer.high_level import extract_pages for page in extract_pages("./pdfs/example.pdf"): for element in page: print(element)这里的元素可能是 LTTextBox、LTFigure、LTLine、LTRect 或 LTImage，它们的层次结构如下所示：其中 LTTextBox 还可以继续遍历得到 LTTextLine，LTTextLine 再继续遍历得到 LTChar：from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainer, LTChar for page in extract_pages("./pdfs/example.pdf"): for element in page: if isinstance(element, LTTextContainer): for text_line in element: for character in text_line: if isinstance(character, LTChar): …

实战 APISIX 服务发现
type: item
date: 2023-03-24T23:02:00+00:00
description: 在 APISIX 使用小记 中，我们通过 APISIX 官方提供的入门示例学习了 APISIX 的基本概念，并使用 Admin API 和 Dashboard 两种方法创建路由。在创建路由时，我们必须明确地知道服务的 IP 和端口，这给运维人员带来了一定的负担，因为服务的重启或扩缩容都可能会导致服务的 IP 和端口发生变化，当服务数量非常多的时候，维护成本将急剧升高。APISIX 集成了多种服务发现机制来解决这个问题，通过服务注册中心，APISIX 可以动态地获取服务的实例信息，这样我们就不用在路由中写死固定的 IP 和端口了。如下图所示，一个标准的服务发现流程大致包含了三大部分：服务启动时将自身的一些信息，比如服务名、IP、端口等信息上报到注册中心；各个服务与注册中心使用一定机制（例如心跳）通信，如果注册中心与服务长时间无法通信，就会注销该实例；当服务下线时，会删除注册中心的实例信息；网关会准实时地从注册中心获取服务实例信息；当用户通过网关请求服务时，网关从注册中心获取的实例列表中选择一个进行代理；目前市面上流行着很多注册中心，比如 Eureka、Nacos、Consul 等，APISIX 内置了下面这些服务发现机制：基于 Eureka 的服务发现基于 Nacos 的服务发现基于 Consul 的服务发现基于 Consul KV 的服务发现基于 DNS 的服务发现基于 APISIX-Seed 架构的控制面服务发现基于 Kubernetes 的服务发现基于 Eureka 的服务发现Eureka 是 Netflix 开源的一款注册中心服务，它也被称为 Spring Cloud Netflix，是 Spring Cloud 全家桶中的核心成员。本节将演示如何让 APISIX 通过 Eureka 来实现服务发现，动态地获取下游服务信息。启动 Eureka Server我们可以直接运行官方的示例代码 spring-cloud-samples/eureka 来启动一个 Eureka Server：$ git clone https://github.com/spring-cloud-samples/eureka.git $ cd eureka && ./gradlew bootRun或者也可以直接使用官方制作好的镜像：$ docker run -d -p 8761:8761 springcloud/eureka启动之后访问 http://localhost:8761/ 看看 Eureka Server 是否已正常运行。启动 Eureka Client如果一切顺利，我们再准备一个简单的 Spring Boot 客户端程序，引入 spring-cloud-starter-netflix-eureka-client 依赖，再通过 @EnableEurekaClient 注解将服务信息注册到 Eureka Server：@EnableEurekaClient @SpringBootApplication @RestController public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } @RequestMapping("/") public String home() { return String.format("Hello, I'm eureka client."); } }在配置文件中设置服务名称和服务端口：spring.application.name=eureka-client server.port=8081默认注册的 Eureka Server 地址是 http://localhost:8761/eureka/，可以通过下面的参数修改：eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/默认情况下，Eureka Client 是将该服务所在的主机名注册到 Eureka Server，这在某些情况下可能会导致其他服务调不通该服务，我们可以通过下面的参数，让 Eureka Client 注册 IP 地址：eureka.instance.prefer-ip-address=true eureka.instance.ip-address=192.168.1.40启动后，在 Eureka 页面的实例中可以看到我们注册的服务：APISIX 集成 Eureka 服务发现接下来，我们要让 APISIX 通过 Eureka Server 找到我们的服务。首先，在 A…

使用 GitHub Actions 跟踪 GitHub 趋势项目
type: item
date: 2022-08-15T04:33:00+00:00
description: GitHub Actions 是 GitHub 于 2018 年 10 月推出的一款 CI/CD 服务。一个标准的 CI/CD 流程通常是一个工作流（workflow），工作流中包含了一个或多个作业（job），而每个作业都是由多个执行步骤（step）组成。GitHub Actions 的创新之处在于它将 CI/CD 中的每个执行步骤划分成一个个原子的操作（action），这些操作可以是编译代码、调用某个接口、执行代码检查或是部署服务等。很显然这些原子操作是可以在不同的 CI/CD 流程中复用的，于是 GitHub 允许开发者将这些操作编写成脚本存在放 GitHub 仓库里，供其他人使用。GitHub 提供了一些 官方的 actions，比如 actions/setup-python 用于初始化 Python 环境，actions/checkout 用于签出某个代码仓库。由于每个 action 都对应一个 GitHub 仓库，所以也可以像下面这样引用 action 的某个分支、某个标签甚至某个提交记录：actions/setup-node@master # 指向一个分支 actions/setup-node@v1.0 # 指向一个标签 actions/setup-node@74bc508 # 指向一个 commit你可以在 GitHub Marketplace 中搜索你想使用的 action，另外，还有一份关于 GitHub Actions 的 awesome 清单 sdras/awesome-actions，也可以找到不少的 action。GitHub Actions 入门示例这一节我们将通过一个最简单的入门示例了解 GitHub Actions 的基本概念。首先我们在 GitHub 上创建一个 demo 项目 aneasystone/github-actions-demo（也可以直接使用已有的项目），然后打开 Actions 选项卡：我们可以在这里手工创建工作流（workflow），也可以直接使用 GitHub Actions 提供的入门工作流，GitHub Actions 提供的工作流大体分为四种类型：Continuous integration - 包含了各种编程语言的编译、打包、测试等流程Deployment - 支持将应用部署到各种不同的云平台Security - 对仓库进行代码规范检查或安全扫描Automation - 一些自动化脚本这些工作流的源码都可以在 actions/starter-workflows 这里找到。GitHub 会自动分析代码并显示出可能适用于你的项目的工作流。由于是示例项目，这里我们直接使用一个最简单的工作流来进行测试，选择 Simple workflow 这个工作流，会在 .github/workflows 目录下创建一个 blank.yml 文件，文件内容如下：# This is a basic workflow to help you get started with Actions name: CI # Controls when the workflow will run on: # Triggers the workflow on push or pull request events but only for the "main" branch push: branches: [ "main" ] pull_request: branches: [ "main" ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v3 # Runs a singl…

Typecho 文章二维码插件
type: item
date: 2018-09-16T10:57:00+00:00
description: 15 年的时候，我曾经写过一个 Typecho 文章二维码的插件，发布在 Typecho 的论坛里，自那以后，由于时间和精力有限（其实是由于懒癌和拖延症晚期），这个插件一直没有更新过。当时写这个插件时是基于 jeromeetienne/jquery-qrcode 实现的，不过由于 jquery-qrcode 依赖于 jquery，如果你的站点上有其他插件也依赖 jquery，很可能会出现版本冲突的情况，譬如如果你用到了 jquery 2.x，而 jquery-qrcode 用的是 jquery 1.9，就会导致插件不可用。在这期间，也有不少用户给我反馈过这个插件在他们的站点上不能用，一直想着重新弄一个，趁着周末重新写了个新版本，这个版本基于 davidshimjs/qrcodejs 实现，它不依赖任何其他库。虽然也可以使用其他手段，譬如 同时兼容 jquery 的多个版本，不过实现起来略嫌麻烦。这个版本发布在 我的 Github 上，欢迎大家试用。下载插件的最新版本 并解压，将 QRCode 目录放到 Typecho 的插件目录 /usr/plugins 下；进入 Typecho 控制台 -- 插件管理，在 禁用的插件 列表中，应该会出现 QRCode 插件，启用该插件；在 启动的插件 列表中找到 QRCode 插件，点击 设置 按钮，可以设置二维码的尺寸等参数；访问你的任意一篇文章，如果一切设置 OK，在文章的最下面，评论的上方，应该可以看到为这篇文章自动生成的二维码；使用手机扫描二维码，检查是否可以在手机上访问这篇文章；如果有任何问题，欢迎给我提交 Issues 或 PR。

CodeIgniter 3.0 中文文档
type: item
date: 2015-08-04T13:10:00+00:00
description: 有一个月左右的时间都没有写博客了，这是因为这个月整个人的心思全都花在对 CodeIgniter 3.0 文档的翻译工作上。从我的 GitHub 主页上也可以看到从7月12号开始到今天8月4号，连续24天提交一直没有间断过。一、序翻译 CodoIgniter 的文档纯属一个偶然的想法，由于在网上经常会看到有人问 3.0 的中文文档什么时候出？而 CodeIgniter 3.0.0 从5月份发布到现在确实也过去快3个月了，而中文文档在这点上确实有着严重的滞后。正好这段时间比较清闲，打算将之前2.2版本的一个项目升级到3.0，而升级的过程中也遇到了不少的问题，于是就决定将 CodeIgniter 3.0.0 的文档从头到尾仔细看一遍。刚好又在网上看到有人问中文文档的事，于是想着为啥我不自己来试着翻译下呢，就这样一边啃着 3.0.0 的英文文档，一边对照着 CodeIgniter 中国的 2.2.2 版本的中文文档，悄悄的就过了一个月了。经过这一个月的努力，我发现翻译工作确实非常辛苦，在这里不得不对那些从事技术书籍翻译的人表示敬意，也对网络上那些对技术文档提供中文翻译的大牛表示敬意。同时也对中文技术文档的缺少和滞后感到无力，不止是 CodeIgniter，只要你去搜你就会发现无论是 PHP 的文档也好，MySQL 的文档也好，最新的中文文档都要落后几个版本。希望能有更多的人加入到技术文档的翻译工作中来。如果有哪位朋友正在翻译，欢迎联系我，我愿尽薄力。二、问题反馈由于本人能力和精力有限，翻译之中难免犯错，欢迎大家批评指正。你可以通过三种途径来反馈问题：直接在我的博客上留言；在 GitHub 上直接提交 Issues ；或者 Fork 我的项目作出修改然后向我提交 Pull Request 。我会尽快修复文档中的错误。三、构建你自己的文档所有 CodeIgniter 文档的源文件都可以从我的 GitHub 上获取，地址是：https://github.com/aneasystone/ci-doc-chinese。你首先需要使用 git clone 将它获取下来：$ git clone https://github.com/aneasystone/ci-doc-chineseCodeIgniter 的文档是采用 ReStructured Text 格式编写的，所以如果你想自己添加或修改文档的话，可以先熟悉下 ReStructured Text 的语法，如果你对 Markdown 的语法有所了解，相信你能很快上手的。另外，你的电脑上需要安装 Python 和 Sphinx，Sphinx 是一个非常强大的文档生成工具，使用它不仅能生成漂亮美观的 HTML 文档，还可以生成其他的各种格式，包括：PDF，EPUB，LaTeX 等等等等。这里有一篇 IBM 的文章介绍了如何通过 Sphinx 制作文档，你可以简单的看一看。如果你想完整的学习它，这里是有一份 Sphinx 的中文文档，也可以去官网看最新的英文文档。除了 Sphinx ，还需要安装 Sphinx 的扩展 sphinxcontrib-phpdomain 和 CodeIgniter 自带的一个程序 cilexer ，cilexer 实际上是 Pygments 的一个插件，用于文档中的代码高亮。具体的安装步骤中文文档里有详细的说明。一切准备就绪后，你就可以直接使用 make html 来生成 HTML 文档了。当然，你也可以使用 make epub 或 make pdf 来生成其他格式的文档，具体的用法可以看下 Makefile 文件。四、资源如果你不想自己折腾，我已经将编译好的 HTML 文件发布到我自己的网站上了，你可以直接在线查看，你也可以和 CodeIgniter 2.2.2 的中文文档（已升级）以及官方的英文版本对照阅读。另外，文末我也提供了离线版下载，你也可以下载到你的电脑上查看，Enjoy!另外，CI 中国也推出了 3.0 的中文文档，建议以该文档的最新版本为准，可以在上面与其他网友进行讨论！CodeIgniter 3.0.0 中文文档（CI 中国版）CodeIgniter 3.0.0 中文文档（本站备份）CodeIgniter 3.0.0 官方英文文档CodeIgniter 3.0.0 中文文档下载

我的第二个Chrome扩展：JSONView增强版
type: item
date: 2015-07-05T06:55:00+00:00
description: JSONView是一款非常棒的查看JSON格式数据的Chrome扩展，可以从Chrome的WebStore下载，地址在这里。该扩展一开始是在FireFox中流行起来，支持JSON和JSONP两种格式，并能使用JSONLint对JSON数据格式进行校验。官方效果图如下：尽管这个扩展小巧强大，很Sexy，不过也有些不足。个人感觉最大的不足就是无法处理用户自己输入的JSON数据，由于这个扩展是后台静默运行，所以对于很多第一次使用的人来说可能根本就不知道怎么用，看WebStore上的评论就可以看出这一点，很多用户提问说不知道要在哪里输入JSON，并给了一星。殊不知这扩展并不是这么用的，它是专门用来处理Web浏览器接受到的JSON数据，而不是处理用户自己输入的JSON数据。但是对于Web开发人员来说，很多时候确实不是光看看浏览器返回的JSON数据这么简单，况且Chrome浏览器的Network面板已经可以预览JSON数据了。我们大多数时候需要处理自己手上的一些JSON数据，格式化，格式验证，实时编辑等等。幸好JSONView的作者gildas将这款扩展的源码在GitHub上开源了，我们可以从这里将代码下下来自己添加新的功能。于是我利用周末的时间改造了下JSONView，给它添加了处理用户自定义JSON的功能。本来打算研读JSONView的代码让它无缝支持这个功能，但是后来我发现了GitHub上josdejong开源的jsoneditor项目，完胜我自己写的撇脚代码。于是直接将jsoneditor整合进JSONView，三分钟就完成了这强大的功能。因为JSONView是后台运行的，没有browser_action，所以首先我们在manifest.json文件中添加如下代码（关于manifest.json和browser_action的说明可以参考我另一篇博客《我的第一个Chrome扩展：Search-faster》）： "browser_action": { "default_icon" : "jsonview16.png", "default_title" : "JSONView" },这样我们就可以在浏览器右上侧看到JSONView的图标了，如下：但是这时图标还不能点，我们需要在background.js中添加browser_action的点击处理事件：// click on browser action chrome.browserAction.onClicked.addListener(function(tab) { chrome.tabs.create({ url: chrome.extension.getURL("viewer/index.html") }); });我们直接在background.js的最后一行添加上上面的代码，这样当用户点击图标时直接打开一个新页面viewer/index.html。这个页面是我从jsoneditor上的examples里扒出来的，和JSONView已经无关了。我们将jsoneditor下下来，其中有一个example正是我们需要的：03_switch_mode.html，将关联的文件都拷到viewer目录下就搞定了。最后我们打开Chrome扩展的管理页面：chrome://extensions/，并勾选上“开发者模式”，点击“加载正在开发的扩展程序...”，然后选择JSONView的目录，就可以预览并调试我们编写的扩展了。调试的过程中如果修改了代码，只需要点击“重新加载”即可，非常方便。下面是我们的成果，看上去效果还不错：最后的最后，我们使用Chrome自带的“打包扩展程序...”功能将程序打包成crx文件，你可以点击这里下载。另外，完整的源代码在这里。

博客正式从WordPress转为Typecho
type: item
date: 2015-06-12T16:25:00+00:00
description: 最近深深的迷上了Markdown，无论是编写代码说明文档还是记日记写博客，都能用Markdown快速轻松的书写。使用过GitHub的人应该都知道Markdown，Markdown让人沉浸在写作之中，而不用关心排版问题，只需几个简单的标记就能完成文档的自动排版。而且由于它是纯文本，具有极强的兼容性，可以方便的转换为各种格式。于是我开始寻找WordPress上支持Markdown的编辑器，虽然有一些但都不是很好。便又开始寻找支持Markdown的博客系统，在这个开源遍地开花的年代，这样的博客系统还真是多如牛毛，让人眼花缭乱。有系统庞大功能性非常复杂的，也有小巧轻盈扩展性非常完美的。在这么多的博客系统中，最终我选择了Typecho，不仅是因为Typecho的轻量高效稳定简洁的特性，而且这款博客系统完全是由国人团队开发，选择使用Typecho也算是对国内的开源事业做出的一点点支持吧。Typecho仅仅使用了7张数据表和不足400KB的代码，就实现了完整的插件与模板机制，打造了一个和WordPress几无二致的博客系统，而且Typecho和WordPress兼容，很容易从WordPress转到Typecho。不过，虽说如此，但是我在安装Typecho以及转换的过程中还是遇到了不少的问题和挫折，在鼓捣了一周左右的时间后，终于大功告成，仅以此文纪念之。一、安装TypechoTypecho的安装非常方便，按照官方的安装步骤，首先从这里下载最新的稳定版本（写这篇博客时，最新版本为1.0），然后解压并上传到服务器Web目录，然后使用浏览器打开你的博客地址，根据Typecho安装程序的提示一步步的安装即可。当然这是理想情况下的安装步骤，实际上我的安装过程并没有这么顺利，在填完我的配置信息提交之后，出现了下面的错误：安装程序捕捉到以下错误:"". 程序被终止, 请检查您的配置信息.对的你没看错，以下错误是什么错误？是个空字符串！不得不说这真的是一个非常坑爹的错误提示。幸亏Typecho是个开源的博客程序，在install.php文件中搜索字符串“安装程序捕捉到以下错误”，于是便找到了这个异常代码的所在之处（无关代码已省略）：try { $installDb = new Typecho_Db($config['adapter'], $config['prefix']); $installDb->addServer($config, Typecho_Db::READ | Typecho_Db::WRITE); /** 初始化数据库结构 */ // ... $scripts = explode(';', $scripts); foreach ($scripts as $script) { $script = trim($script); if ($script) { $installDb->query($script, Typecho_Db::WRITE); // 这里抛出异常 } } } catch (Typecho_Db_Exception $e) { $success = false; $code = $e->getCode(); if (...) { // ... } else { echo ' ' . _t('安装程序捕捉到以下错误: "%s". 程序被终止, 请检查您的配置信息.',$e->getMessage()) . ' '; } }抛出异常的正是上面注释的那句$installDb->query($script, Typecho_Db::WRITE)，而$installDb是这样定义的：$installDb = new Typecho_Db($config['adapter'], $config['prefix']);Typecho_Db类根据用户选择的数据库适配器进行数据库操作，安装时配置页有两个可供选择：Mysql原生的和Pdo驱动的，如下图的下拉列表所示：而在这里我选择了默认的Mysql原生函数适配器，对应的数据库处理代码在/var/Typecho/Db/Adapter/Mysql.php文件中，看到下面的代码我瞬间明白了为什么会有这么奇怪的错误提示了： /** * 数据库连接函数 * * @param Typecho_Config $config 数据库配置 * @throws Typecho_Db_Exception * @return resource */ public function connect(Typecho_Config $config) { if ($this->_dbLink = @mysql_connect($config->host . (empty($config->port) ? '' : ':' . …

我的第一个Chrome扩展：Search-faster
type: item
date: 2015-06-07T08:22:00+00:00
description: 花了两周左右的时间将Chrome扩展的开发文档看了一遍，把所有官方的例子也都顺便一个个的安装玩了一遍，真心感觉Chrome浏览器的博大精深。Chrome浏览器的现有功能已经足够强大，再配合Chrome扩展几乎可以说是“只有想不到，没有做不到”。于是利用业余时间做了一个简单的扩展Search-faster，可以加快Google的搜索速度，算是对近一段时间学习的总结。一、Chrome扩展综述Chrome扩展有两种不同的表现形式：扩展（Extension）和应用（WebApp），我们这里不讨论WebApp，但是扩展的大多数技巧对于WebApp来说也是适用的。Chrome扩展实际上就是压缩在一起的一组文件，包括HTML，CSS，Javascript，图片，还有其它任何需要的文件。它从本质上来说就是一个Web页面，可以使用所有的浏览器提供的API，可以与Web页面交互，或者通过content script或cross-origin XMLHttpRequests与服务器交互。还可以访问浏览器提供的内部功能，例如标签或书签等。扩展在Chrome浏览器中又有着两种不同的表现形式：browser_action和page_action，browser_action在工具栏右侧添加一个图标，page_action在URL输入栏右侧添加一个图标，如下图所示。这两个action唯一的区别在于：当你的扩展是否显示取决于单个页面时，该使用page_action，page_action默认是不显示的。1.1 manifest.json每一个Chrome扩展都有一个清单文件包含了这个扩展的所有重要信息，这个文件的名称固定为manifest.json，文件内容为JSON格式。下面是一个manifest.json文件的实例（来自JSONView扩展）{ "background": { "scripts": [ "background.js" ] }, "content_scripts": [ { "all_frames": true, "js": [ "content.js" ], "matches": [ "http://*/*", "https://*/*", "ftp://*/*", "file:///*" ], "run_at": "document_end" } ], "description": "Validate and view JSON documents", "icons": { "128": "jsonview128.png", "16": "jsonview16.png", "48": "jsonview48.png" }, "key": "...", "manifest_version": 2, "name": "JSONView", "options_page": "options.html", "permissions": [ "clipboardWrite", "http://*/", "contextMenus", "https://*/", "ftp://*/" ], "update_url": "https://clients2.google.com/service/update2/crx", "version": "0.0.32.2", "web_accessible_resources": [ "jsonview.css", "jsonview-core.css", "content_error.css", "options.png", "close_icon.gif", "error.gif" ] }其中name、version和manifest_version三个字段是必选的，每个字段的含义显而易见，另外在当前版本下manifest_version的值推荐为2，版本1已经被弃用。除这三个字段之外，description为对扩展的一句描述，虽然是可选的，但是建议使用。icons为扩展的图标，一般情况下需要提供三种不同尺寸的图标：16*16的图标用于扩展的favicon，在查看扩展的option页面时可以看到；48*48的图标在扩展的管理页面可以看到；128*128的图标用于WebApp。这三种图标分别如下所示：图标建议都使用png格式，因为png对透明的支持最好。要注意的是：icons里的图标和browser_action或page_action里的default_icon可能是不一样的，default_icon显示在工具栏或URL输入栏右侧，建议采用19*19的图标。key字段为扩展的唯一标识，这个字段是浏览器在安装.crx文件时自动生成的，通常不需要手工指定。permissions为扩展所需要的权限列表，列表中的每…