简介:这份资源是《德国民法典》全文PDF,面向法学专业学生、法律从业者及对大陆法系民法体系感兴趣的读者,可用于条文查阅、比较法研究与课程学习。德国民法典于1896年颁布、1998年最近一次修改,共分总则、物权法、债权法、继承法、家庭法等部分,本文件完整收录法典条文,其中总则部分对权利能力、成年、住所、姓名权及法人制度等作了系统规定,如第1条权利能力始于出生完成、第2条满十八周岁为成年、第7条住所的设定与废止、第12条姓名权保护、第21至26条社团与董事会代表权等,便于读者逐条研读与引用。资源包共1个PDF文件,大小约101KB,轻量便携,适合在电脑或移动设备上随时打开检索。目前已有526人学习下载,可作为民法学习与法律实务的常备条文参考。
1. 德国民法典全文.pdf:从哪拿、怎么读、如何检索
你搜到一份「德国民法典全文.pdf」,兴冲冲打开,结果发现要么是扫描件没法复制,要么是德文原版看不懂,要么是排版乱到根本没法引用条文号。这不是你一个人的问题。德国民法典(Bürgerliches Gesetzbuch,简称 BGB)全文有 2385 条,加上施行法,一份靠谱的 PDF 至少几百页。它不像小说可以顺着读,从业者真正需要的是:能按 § 编号精确定位、能全文检索关键词、能复制条文原文用于文书引用。这篇笔记就围绕这三个刚需,把「拿到 PDF 之后怎么把它变成能用的工具」讲清楚。适合做涉外法律、比较法研究、德国法案例检索的从业者,也适合需要引用 BGB 条文写论文的学生。下面从文件来源、结构拆解、检索方案到避坑,一步步来。
2. 德国民法典 PDF 的版本选择与结构拆解
2.1 三种常见 PDF 版本,选错等于白下
市面上流传的 BGB 全文 PDF 大致分三类,用途完全不同。
第一类是官方公报版(Bundesgesetzblatt)。优点是权威,条文有官方修订记录;缺点是 PDF 按公布批次拆分,一个文件可能只含某次修订的若干条,想凑齐全本得下几十个文件,而且排版是双栏公报格式,复制出来断行严重。
第二类是商业出版社的合订本电子版,比如常见的法学出版社版本。这类 PDF 有完整目录、页眉带 § 编号、条文连续,适合通读和引用。缺点是页码和官方版对不上,引用时只能引 § 号不能引页码。
第三类是社区整理的纯文本转 PDF。优点是体积小、可全文检索;缺点是修订滞后,可能停留在某个旧版本,而且没有官方校勘,条文里偶尔有错字。
我一般这样选:写正式文书引用条文,用官方公报版核对原文;日常检索和阅读,用商业合订本电子版;做批量文本分析,用社区纯文本版但要先和官方版抽样比对。判断一份 PDF 属于哪类,看三个地方:封面有没有出版社或公报标识、页眉有没有 § 编号、随便找一条复制看断行是否正常。
2.2 用命令行拆出目录和条文号
拿到 PDF 后第一件事不是读,是拆结构。BGB 的结构是「编(Buch)→ 章(Abschnitt)→ 节(Titel)→ 条(§)」,PDF 的书签(outline)通常就对应这个层级。用pdftk或qpdf可以把书签导出来,快速判断这份 PDF 的结构完不完整。
# 导出 PDF 书签为文本,检查层级是否完整 pdftk bgb.pdf dump_data | grep -E "BookmarkTitle|BookmarkLevel" > outline.txt # 用 qpdf 查看页数和是否加密 qpdf --show-npages bgb.pdf qpdf --is-encrypted bgb.pdf逻辑说明:dump_data会把 PDF 的元数据和书签全部输出,grep过滤出书签标题和层级。如果输出里 BookmarkLevel 只有 1 和 2,说明这份 PDF 只做到「编」和「章」两级,没有细化到 §,检索时就得靠文本搜索而不是书签跳转。qpdf --is-encrypted返回 1 表示有加密,加密 PDF 无法直接做文本提取,得先解密。
参数说明:pdftk的dump_data是只读操作,不改原文件;qpdf的--show-npages用来确认页数是否和预期一致,BGB 全本通常 500 到 800 页,如果只有几十页,多半是节选版。
2.3 把 PDF 转成可检索文本的两种路径
PDF 分两种:文本型(能选中复制)和扫描型(图片)。文本型直接用pdftotext就能转,扫描型必须先 OCR。判断方法很简单,用pdftotext转一页,如果输出是乱码或空白,就是扫描型。
# 文本型 PDF:直接转纯文本,保留布局 pdftotext -layout bgb.pdf bgb.txt # 扫描型 PDF:先转图片再 OCR(以 tesseract 为例,需装德文语言包) pdftoppm -r 300 -png bgb.pdf page for f in page-*.png; do tesseract "$f" "${f%.png}" -l deu done逻辑说明:-layout参数保留原始排版,条文号 § 和正文的相对位置不会乱,这对后续按 § 切分很关键。扫描型走pdftoppm转 300dpi 的 PNG,再用tesseract的德文语言包-l deu识别。300dpi 是 OCR 的常用下限,再低识别率会明显下降。
参数说明:-r 300是分辨率,扫描件质量差时可以提到 400,但文件会大很多;-l deu指定德语,装语言包的命令因系统而异,常见做法是apt install tesseract-ocr-deu。OCR 出来的文本一定要抽查,德语的 ä ö ü ß 和 § 符号最容易识别错。
3. 用 Python 把 BGB 条文切成可查询的数据
3.1 按 § 编号切分条文的脚本
转成纯文本后,下一步是把连续的文本切成一条一条的 §。BGB 的条文以「§ 数字」开头,后面跟标题,再跟正文。切分的核心是正则匹配行首的 § 编号。
import re with open("bgb.txt", encoding="utf-8") as f: text = f.read() # 匹配行首的 § 编号,兼容 § 1、§ 1a、§ 823 等写法 pattern = re.compile(r"^§\s*(\d+[a-z]?)\s*(.*)$", re.MULTILINE) matches = list(pattern.finditer(text)) articles = {} for i, m in enumerate(matches): num = m.group(1) title = m.group(2).strip() start = m.end() end = matches[i + 1].start() if i + 1 < len(matches) else len(text) articles[num] = {"title": title, "body": text[start:end].strip()} print(f"共切出 {len(articles)} 条") print(articles.get("823", {}).get("title"))逻辑说明:re.MULTILINE让^匹配每一行的开头,这样只有行首的 § 才会被当作条文起点,正文里引用的 § 不会被误切。matches[i+1].start()到当前匹配结束之间就是这一条的正文。最后用 § 823 做抽查,它是侵权法的核心条文,标题应该是「Schadensersatzpflicht」。
参数说明:正则里的\d+[a-z]?兼容带字母的条文号,BGB 里有 § 1a、§ 31a 这类插入条文。如果切出来的条数明显少于 2385,说明 PDF 里有条文号被断行拆开,需要先把换行符处理掉再切。
3.2 建一个本地全文检索索引
切好条文后,最实用的功能是全文检索。数据量不大(2385 条),不需要上 Elasticsearch,用 SQLite 的 FTS5 就够,一条命令建索引,查询毫秒级返回。
import sqlite3 conn = sqlite3.connect("bgb.db") conn.execute("CREATE VIRTUAL TABLE IF NOT EXISTS articles USING fts5(num, title, body)") for num, art in articles.items(): conn.execute("INSERT INTO articles VALUES (?, ?, ?)", (num, art["title"], art["body"])) conn.commit() # 查询包含某关键词的条文 for row in conn.execute("SELECT num, title FROM articles WHERE articles MATCH ?", ("Kaufvertrag",)): print(row)逻辑说明:FTS5 是 SQLite 内置的全文检索模块,MATCH走的是倒排索引,比LIKE '%关键词%'快几个数量级。num、title、body三列分别存条文号、标题、正文,查询时可以只返回条文号和标题,需要看全文再按 num 取。
参数说明:FTS5 默认对德语变音符号不敏感,搜Schaden能匹配Schäden,但前提是建表时没开case_sensitive。如果要做词形还原(比如搜Kauf匹配Kaufvertrag),FTS5 支持前缀查询,写成Kauf*即可。
3.3 条文引用的格式化输出
检索到条文后,经常要复制到文书里。直接复制数据库里的正文会带 OCR 残留的换行和空格,需要做一次清洗,输出成规范的引用格式。
def format_article(num, art): body = re.sub(r"\s+", " ", art["body"]).strip() return f"§ {num} BGB {art['title']}\n{body}" print(format_article("823", articles["823"]))逻辑说明:re.sub(r"\s+", " ", ...)把连续空白(包括换行)压成单个空格,消除 OCR 和 PDF 转换留下的断行。输出格式是「§ 编号 BGB 标题 + 正文」,这是德语法律文书的常见引用写法。
参数说明:如果正文里有列表项(比如 § 823 第 1 款和第 2 款),压成一行会丢失层次,这种情况可以改成按款(Absatz)切分,用(1)、(2)作为分隔符再处理。
4. 检索与引用中的避坑清单
4.1 现象:搜条文号搜不到
原因:PDF 转文本时,§ 和数字之间被插入了换行或空格,比如「§\n823」,正则匹配不到行首的 §。
解决:切分前先做一次预处理,把「§ 后面跟换行再跟数字」的情况合并。用re.sub(r"§\s*\n\s*(\d)", r"§ \1", text)把断开的条文号接回去,再跑切分脚本。
4.2 现象:条文正文里混入了页眉页脚
原因:商业出版社的 PDF 每页都有页眉(书名)和页脚(页码),pdftotext会把它们一起转出来,切分后这些内容混进了条文正文。
解决:转文本时用-layout保留布局,然后在切分前按行过滤掉包含页码模式的行(比如纯数字行、含「Seite」的行)。更稳妥的做法是用pdftotext的-f和-l参数分页转,逐页判断页眉页脚位置再裁掉。
4.3 现象:OCR 把 § 识别成 S 或 8
原因:扫描件的 § 符号在低分辨率下容易和字母 S、数字 8 混淆,tesseract 默认模型对 § 的识别率一般。
解决:提高扫描分辨率到 400dpi,或者在 OCR 后用规则修正——行首的「S 数字」和「8 数字」大概率是 §。更彻底的办法是训练一个针对法律文本的 tesseract 模型,但成本高,一般项目用规则修正就够。
4.4 现象:条文号对得上但内容对不上
原因:用了社区纯文本版,修订滞后,某条已经被官方修订但文本还是旧版。
解决:抽样比对。随机抽 20 条,和官方公报版逐字比对,如果差异超过 2 条,说明这份文本不可用于正式引用。日常检索可以用,但写进文书的条文必须回官方版核对。
4.5 现象:FTS5 搜德语复合词命中率低
原因:德语复合词多,搜「Kaufvertrag」匹配不到「Kaufvertragsrecht」这类派生词。
解决:查询时用前缀匹配Kaufvertrag*,或者建索引时对正文做一次词干提取(德语可以用german分词器,但 SQLite FTS5 不内置,需要自己预处理文本)。简单做法是查询词截断到词根再加*。
5. 进阶:把 BGB 条文接进自己的检索工作流
前面搭好的 SQLite 库只是起点。真正提升效率的做法是把它接进你日常用的工具链。我自己的习惯是写一个命令行小工具,输入关键词或 § 号,直接输出格式化条文,复制就能用。
#!/bin/bash # bgb.sh:查询 BGB 条文 # 用法:./bgb.sh 823 或 ./bgb.sh Kaufvertrag sqlite3 bgb.db "SELECT num, title, body FROM articles WHERE articles MATCH '$1' OR num='$1';"逻辑说明:MATCH走全文索引,num='$1'走精确匹配,两种查询用OR连起来,既能按关键词搜也能按条文号查。输出直接是条文号和标题,需要全文再加一列。
参数说明:$1是第一个命令行参数。注意 SQL 注入问题,本地自用可以不管,但如果做成服务,必须用参数化查询。这个脚本可以进一步包装成alias bgb='~/bin/bgb.sh',终端里随时调用。
再进一步,可以把条文库导出成 JSON,接进笔记软件或知识库。我一般会按「编」拆成五个 JSON 文件,每个文件是一个数组,元素是{num, title, body}。这样在支持 JSON 检索的笔记工具里,可以直接按 § 号跳转,也能全文搜。导出脚本很简单:
import json for buch in ["allgemeiner", "schuldrecht", "sachenrecht", "familienrecht", "erbrecht"]: subset = {k: v for k, v in articles.items() if k in buch_range[buch]} with open(f"bgb_{buch}.json", "w", encoding="utf-8") as f: json.dump(subset, f, ensure_ascii=False, indent=2)逻辑说明:buch_range是预先定义好的各编条文号范围,比如债法大概从 § 241 到 § 853。按编拆分后单个文件不会太大,笔记软件加载快。ensure_ascii=False保证德语变音符号正常显示,indent=2方便人眼阅读。
参数说明:各编的条文号范围需要根据你手上的版本确认,不同修订版本边界可能微调。导出前先用len(subset)检查条数,和该编的官方条数对一下,差太多说明范围划错了。
最后说一个我踩过的坑:一开始我图省事,直接用 PDF 阅读器的搜索功能查条文,结果发现搜索「§ 823」经常跳到目录页而不是正文,因为目录里也有 § 823。后来改成先切分再检索,才彻底解决。这个习惯我一直保留到现在——任何法律文本,先结构化再检索,比在 PDF 里硬搜靠谱得多。希望帮到你。
本文还有配套的精品资源,点击获取