Qingwa
(青小蛙)
1
原始链接在: https://www.appinn.com/chinatextbook/
ChinaTextbook 是一款收集了公开的中国小学、初中、高中、大学 PDF 教材的项目,托管在 GitHub 上,总库大小 41.53GB。@Appinn
这个项目存在有一段时间了,今天突然火了。
教材来源为:国家中小学智慧教育平台,本身只需要登录后即可浏览,可以使用第三方工具下载(比如 tchMaterial-parser 项目)。
如果有需求,可以制作一个如何下载/合并教材的教程。

ChinaTextbook 的主要内容包括:
小学:
- 体育与健康
- 数学
- 科学
- 美术
- 艺术
- 英语
- 语文/统编版
- 语文·书法练习指导
- 道德与法治/统编版
- 音乐
初中:
- 人文地理/统编版-人民教育出版社
- 体育与健康
- 俄语/人教版-人民教育出版社
- 化学
- 历史/统编版-人民教育出版社
- 地理
- 地理图册
- 数学
- 日语/人教版-人民教育出版社
- 物理
- 生物学
- 科学
- 美术
- 艺术
- 英语
- 语文/统编版-人民教育出版社
- 道德与法治/统编版-人民教育出版社
- 音乐
高中:
- 体育与健康
- 俄语/人教版-人民教育出版社
- 信息技术
- 化学
- 历史/统编版-人民教育出版社
- 地理
- 地理图册
- 思想政治/统编版-人民教育出版社
- 数学
- 日语/人教版-人民教育出版社
- 物理
- 生物学
- 美术
- 艺术
- 英语
- 语文/统编版-人民教育出版社
- 通用技术
- 音乐
大学:
原文:https://www.appinn.com/chinatextbook/
4 个赞
上面教材应该都是比较新的版本,我其实一直想找有没有十多年前的教材。
翻看当年我用的老教材,追忆青春一去不复返。。。
3 个赞
tjsky
(去年夏天)
7
顺带提一嘴,如果想直接拉取,不要直接git clone一把梭哈,
这么大的项目 一旦网络有点波动网断了,就完全重新下了。
建议分步骤拉取
mkdir ChinaTextbook && cd ChinaTextbook
git init
git remote add origin https://github.com/TapXWorld/ChinaTextbook.git
git fetch origin --progress
git clone 是创建一个新仓库,并一次性拉取远程所有数据,不支持断点续传.
git fetch 是增量更新,支持断点续传。
哦,对了,漏了一件事
当显示Resolving deltas: 100% (9999/9999), done.时,就是二进制文件已经下载完毕了。
还需要执行git checkout 分支名把主分支检出。(分支名看终端的输出)
对应这个项目就是因为终端输出是
Resolving deltas: 100% (1119/1119), done.
From https://github.com/TapXWorld/ChinaTextbook
* [new branch] master -> origin/master
所以检出命令是git checkout master
4 个赞
我用 issue 中提到的问题代码,在 Linux Mint 上利用 go 进行跨平台编译,命令如下:
GOOS=windows go build mergePDFs.go
得到一个 exe 文件,上传到 VirusTotal 后,检测结果是 71 个引擎中 10 个报告有问题,具体报告如下:
涉事代码如下:
package main
import (
"io/ioutil"
"os"
"sort"
"strings"
)
func main() {
dirPath := "." // 当前目录
mergeSplitPDFsInDirectory(dirPath)
}
func mergeSplitPDFsInDirectory(dirPath string) {
files, err := ioutil.ReadDir(dirPath)
if err != nil {
panic(err)
}
splitFiles := make(map[string][]string)
for _, file := range files {
if file.IsDir() {
continue
}
fileName := file.Name()
if strings.Contains(fileName, ".pdf.") {
baseName := strings.Split(fileName, ".pdf.")[0] + ".pdf"
splitFiles[baseName] = append(splitFiles[baseName], fileName)
}
}
for baseName, parts := range splitFiles {
sort.Strings(parts) // 确保文件顺序正确
mergeFiles(baseName, parts)
}
}
func mergeFiles(baseName string, parts []string) {
mergedFile, err := os.Create(baseName)
if err != nil {
panic(err)
}
defer mergedFile.Close()
for _, part := range parts {
data, err := ioutil.ReadFile(part)
if err != nil {
panic(err)
}
_, err = mergedFile.Write(data)
if err != nil {
panic(err)
}
os.Remove(part) // 合并后删除分割文件
}
}
我编译得到的 exe 文件,大小是 1.9 MB。而 GitHub 上给出的 mergePDFs.exe 是 1.83 MB,基本一样,issue 中所言
而mergePDFs.exe的源代码只给出短短50行。并不是全部。
是有待商榷的。
但是,还是有必要详细研判一下代码的具体内容是否存在问题。另外最好能请有条件的朋友在 WIndows 上原生编译一下,不知道报毒会不会是跨平台编译的问题。
1 个赞
tjsky
(去年夏天)
14
在windows系统下编译 mergePDFs.go
环境:WIN11 24H2,Go 1.24.3
得到的exe文件体积为 2.2MB,和作者提供的exe文件的体积(1.83MB)差异,应该是编译环境引起的差异,在WSL内的Ubuntu24内编译得到的exe文件体积是1.9MB和你的一致,报毒结果也是10个。
将win系统编译的exe文件上传到 VirusTotal 后,检测结果是 71 个引擎中 3 个报告有问题,具体报告如下:virustotal
简单看下go代码,看起来像是将非PDF文件合并得到一个PDF的行为导致的报毒,毕竟现在的PDF文件支持内嵌挺多奇怪的东西,比如JS代码……
2 个赞
tjsky
(去年夏天)
15
好吧,issues下有个大哥,做个更简单的测试:
直接写一个hello world。在windows下编译后,扔到VirusTotal,也是这3个报毒。
1 个赞
基本都不是主流杀毒引擎,报的病毒类型也各不相同,还是AI模型识别的,九成九是误报。不放心就看源码
ykq
(ykq)
17
有没有十年前或者二十年前三十年前的教材,现在看教材不如看教辅