简介这份资源是《德国民法典》全文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, encodingutf-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[i1].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匹配KaufvertragFTS5 支持前缀查询写成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(fbgb_{buch}.json, w, encodingutf-8) as f: json.dump(subset, f, ensure_asciiFalse, indent2)逻辑说明buch_range是预先定义好的各编条文号范围比如债法大概从 § 241 到 § 853。按编拆分后单个文件不会太大笔记软件加载快。ensure_asciiFalse保证德语变音符号正常显示indent2方便人眼阅读。参数说明各编的条文号范围需要根据你手上的版本确认不同修订版本边界可能微调。导出前先用len(subset)检查条数和该编的官方条数对一下差太多说明范围划错了。最后说一个我踩过的坑一开始我图省事直接用 PDF 阅读器的搜索功能查条文结果发现搜索「§ 823」经常跳到目录页而不是正文因为目录里也有 § 823。后来改成先切分再检索才彻底解决。这个习惯我一直保留到现在——任何法律文本先结构化再检索比在 PDF 里硬搜靠谱得多。希望帮到你。本文还有配套的精品资源点击获取