pdf2dxf-construction 2.0.0rc34__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. pdf2dxf_construction-2.0.0rc34/.github/workflows/ci.yml +52 -0
  2. pdf2dxf_construction-2.0.0rc34/.gitignore +31 -0
  3. pdf2dxf_construction-2.0.0rc34/CHANGELOG.md +286 -0
  4. pdf2dxf_construction-2.0.0rc34/CONTRIBUTING.md +22 -0
  5. pdf2dxf_construction-2.0.0rc34/LICENSE +661 -0
  6. pdf2dxf_construction-2.0.0rc34/MANIFEST.in +11 -0
  7. pdf2dxf_construction-2.0.0rc34/NOTICE +24 -0
  8. pdf2dxf_construction-2.0.0rc34/PKG-INFO +252 -0
  9. pdf2dxf_construction-2.0.0rc34/README.en.md +203 -0
  10. pdf2dxf_construction-2.0.0rc34/README.md +195 -0
  11. pdf2dxf_construction-2.0.0rc34/SECURITY.md +11 -0
  12. pdf2dxf_construction-2.0.0rc34/SOURCE_ORIGIN.json +21 -0
  13. pdf2dxf_construction-2.0.0rc34/THIRD_PARTY_NOTICES.md +47 -0
  14. pdf2dxf_construction-2.0.0rc34/docs/ADDITIONAL_DOCUMENT_VALIDATION.json +551 -0
  15. pdf2dxf_construction-2.0.0rc34/docs/CATALOG_LOADING.json +1831 -0
  16. pdf2dxf_construction-2.0.0rc34/docs/CHARACTER_SUPPORT.md +184 -0
  17. pdf2dxf_construction-2.0.0rc34/docs/CONTOUR_TOPOLOGY_VALIDATION.json +3084 -0
  18. pdf2dxf_construction-2.0.0rc34/docs/CURVE_SAMPLING_VALIDATION.json +3073 -0
  19. pdf2dxf_construction-2.0.0rc34/docs/FONT_CATALOG_LOADING_VALIDATION.json +1756 -0
  20. pdf2dxf_construction-2.0.0rc34/docs/FONT_LAYOUT_VALIDATION.json +4407 -0
  21. pdf2dxf_construction-2.0.0rc34/docs/FULL_CORPUS_VALIDATION.json +87 -0
  22. pdf2dxf_construction-2.0.0rc34/docs/HALF_ENCLOSURE_VALIDATION.json +3522 -0
  23. pdf2dxf_construction-2.0.0rc34/docs/LONG_ROW_WINDOW_VALIDATION.json +1982 -0
  24. pdf2dxf_construction-2.0.0rc34/docs/LONG_TEXT_VALIDATION.json +1615 -0
  25. pdf2dxf_construction-2.0.0rc34/docs/MEDIA_REPAIR_VALIDATION.json +147 -0
  26. pdf2dxf_construction-2.0.0rc34/docs/OPEN_FONTS.lock.json +352 -0
  27. pdf2dxf_construction-2.0.0rc34/docs/OPEN_FONTS.md +74 -0
  28. pdf2dxf_construction-2.0.0rc34/docs/OPEN_FONT_VALIDATION.json +3704 -0
  29. pdf2dxf_construction-2.0.0rc34/docs/OPEN_OUTLINE_ALGORITHMS.md +89 -0
  30. pdf2dxf_construction-2.0.0rc34/docs/OUTLINE_ROW_VALIDATION.json +3375 -0
  31. pdf2dxf_construction-2.0.0rc34/docs/PROJECT_BRIEF.md +67 -0
  32. pdf2dxf_construction-2.0.0rc34/docs/RELEASE_CHECKLIST.md +42 -0
  33. pdf2dxf_construction-2.0.0rc34/docs/TEMPLATE_PROVENANCE.md +11 -0
  34. pdf2dxf_construction-2.0.0rc34/docs/VALIDATION.md +63 -0
  35. pdf2dxf_construction-2.0.0rc34/docs/validation.json +1078 -0
  36. pdf2dxf_construction-2.0.0rc34/pdf2dxf_construction.egg-info/PKG-INFO +252 -0
  37. pdf2dxf_construction-2.0.0rc34/pdf2dxf_construction.egg-info/SOURCES.txt +131 -0
  38. pdf2dxf_construction-2.0.0rc34/pdf2dxf_construction.egg-info/dependency_links.txt +1 -0
  39. pdf2dxf_construction-2.0.0rc34/pdf2dxf_construction.egg-info/entry_points.txt +2 -0
  40. pdf2dxf_construction-2.0.0rc34/pdf2dxf_construction.egg-info/requires.txt +22 -0
  41. pdf2dxf_construction-2.0.0rc34/pdf2dxf_construction.egg-info/top_level.txt +1 -0
  42. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/__init__.py +5 -0
  43. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/backend_worker.py +99 -0
  44. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/batch.py +160 -0
  45. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/capabilities.py +20 -0
  46. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/cli.py +367 -0
  47. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/core.py +306 -0
  48. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/determinism.py +95 -0
  49. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/dimension_instances.py +143 -0
  50. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/drawings.py +106 -0
  51. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/__init__.py +0 -0
  52. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/calibration/__init__.py +0 -0
  53. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/calibration/chains.py +129 -0
  54. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/calibration/evidence.py +643 -0
  55. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/calibration/source_entities.py +162 -0
  56. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/curve_sampling.py +21 -0
  57. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/drawing_profile.py +397 -0
  58. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/geometry/__init__.py +0 -0
  59. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/geometry/base.py +1983 -0
  60. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/geometry/construction.py +441 -0
  61. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/geometry/media.py +342 -0
  62. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/geometry/media_clipping.py +168 -0
  63. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/geometry/native_text.py +550 -0
  64. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/pdf.py +140 -0
  65. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/pipeline.py +201 -0
  66. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/__init__.py +0 -0
  67. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/assets/chinese_glyph_templates.json +6301 -0
  68. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/assets/engineering_glyphs.json +87 -0
  69. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/contour_topology.py +106 -0
  70. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/dxf_text.py +418 -0
  71. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/font_bundle.py +167 -0
  72. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/font_catalog.py +1306 -0
  73. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/font_layout.py +269 -0
  74. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/text/outline_text.py +2520 -0
  75. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/engine/worker.py +113 -0
  76. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/locking.py +47 -0
  77. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/options.py +55 -0
  78. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/page_worker.py +125 -0
  79. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/paths.py +33 -0
  80. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/preflight.py +50 -0
  81. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/profiles.py +409 -0
  82. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/r12_fonts.py +33 -0
  83. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/repair.py +123 -0
  84. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/request.py +93 -0
  85. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/resources.py +62 -0
  86. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/saved_validation.py +86 -0
  87. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/supervision.py +123 -0
  88. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/validation.py +548 -0
  89. pdf2dxf_construction-2.0.0rc34/pdf2dxf_stable/version.py +1 -0
  90. pdf2dxf_construction-2.0.0rc34/pyproject.toml +7 -0
  91. pdf2dxf_construction-2.0.0rc34/setup.cfg +4 -0
  92. pdf2dxf_construction-2.0.0rc34/setup.py +61 -0
  93. pdf2dxf_construction-2.0.0rc34/tests/calibration/fixtures/crossing_dimension_label.json +376 -0
  94. pdf2dxf_construction-2.0.0rc34/tests/calibration/fixtures/local_dimension_chain.json +915 -0
  95. pdf2dxf_construction-2.0.0rc34/tests/calibration/test_block_validation.py +140 -0
  96. pdf2dxf_construction-2.0.0rc34/tests/calibration/test_dimension_evidence.py +534 -0
  97. pdf2dxf_construction-2.0.0rc34/tests/calibration/test_validation_integrity.py +107 -0
  98. pdf2dxf_construction-2.0.0rc34/tests/geometry/test_base_geometry.py +6 -0
  99. pdf2dxf_construction-2.0.0rc34/tests/geometry/test_fill_repair.py +120 -0
  100. pdf2dxf_construction-2.0.0rc34/tests/stable/test_ambiguous_font_windows.py +138 -0
  101. pdf2dxf_construction-2.0.0rc34/tests/stable/test_block_text_dedup.py +35 -0
  102. pdf2dxf_construction-2.0.0rc34/tests/stable/test_cancellation.py +173 -0
  103. pdf2dxf_construction-2.0.0rc34/tests/stable/test_contour_topology.py +65 -0
  104. pdf2dxf_construction-2.0.0rc34/tests/stable/test_contracts.py +720 -0
  105. pdf2dxf_construction-2.0.0rc34/tests/stable/test_curve_sampling.py +65 -0
  106. pdf2dxf_construction-2.0.0rc34/tests/stable/test_enclosed_radical_consensus.py +163 -0
  107. pdf2dxf_construction-2.0.0rc34/tests/stable/test_font_bundle.py +365 -0
  108. pdf2dxf_construction-2.0.0rc34/tests/stable/test_font_catalog.py +572 -0
  109. pdf2dxf_construction-2.0.0rc34/tests/stable/test_font_catalog_loading.py +126 -0
  110. pdf2dxf_construction-2.0.0rc34/tests/stable/test_font_degenerate_contours.py +314 -0
  111. pdf2dxf_construction-2.0.0rc34/tests/stable/test_font_layout_consensus.py +230 -0
  112. pdf2dxf_construction-2.0.0rc34/tests/stable/test_font_numeric_precision.py +167 -0
  113. pdf2dxf_construction-2.0.0rc34/tests/stable/test_font_unicode_index.py +74 -0
  114. pdf2dxf_construction-2.0.0rc34/tests/stable/test_half_enclosed_radicals.py +323 -0
  115. pdf2dxf_construction-2.0.0rc34/tests/stable/test_han_fragment_consensus.py +199 -0
  116. pdf2dxf_construction-2.0.0rc34/tests/stable/test_io_safety.py +156 -0
  117. pdf2dxf_construction-2.0.0rc34/tests/stable/test_latin_row_recheck.py +163 -0
  118. pdf2dxf_construction-2.0.0rc34/tests/stable/test_long_font_row_windows.py +104 -0
  119. pdf2dxf_construction-2.0.0rc34/tests/stable/test_long_outline_runs.py +133 -0
  120. pdf2dxf_construction-2.0.0rc34/tests/stable/test_multifont_row_recheck.py +156 -0
  121. pdf2dxf_construction-2.0.0rc34/tests/stable/test_multilingual_outline.py +396 -0
  122. pdf2dxf_construction-2.0.0rc34/tests/stable/test_outline_stage_consensus.py +232 -0
  123. pdf2dxf_construction-2.0.0rc34/tests/stable/test_outline_text.py +362 -0
  124. pdf2dxf_construction-2.0.0rc34/tests/stable/test_preflight.py +122 -0
  125. pdf2dxf_construction-2.0.0rc34/tests/stable/test_r12_geometry.py +95 -0
  126. pdf2dxf_construction-2.0.0rc34/tests/stable/test_r12_text_placement.py +101 -0
  127. pdf2dxf_construction-2.0.0rc34/tests/stable/test_release_snapshot.py +159 -0
  128. pdf2dxf_construction-2.0.0rc34/tests/stable/test_saved_validation.py +111 -0
  129. pdf2dxf_construction-2.0.0rc34/tests/stable/test_stencil_soft_mask.py +151 -0
  130. pdf2dxf_construction-2.0.0rc34/tools/build_open_font_bundle.py +355 -0
  131. pdf2dxf_construction-2.0.0rc34/tools/check_distribution.py +147 -0
  132. pdf2dxf_construction-2.0.0rc34/tools/prepare_public_release.py +126 -0
  133. pdf2dxf_construction-2.0.0rc34/tools/test_installed_wheel.py +38 -0
@@ -0,0 +1,52 @@
1
+ name: Package checks
2
+
3
+ on: [push, pull_request, workflow_dispatch]
4
+
5
+ permissions:
6
+ contents: read
7
+
8
+ jobs:
9
+ test:
10
+ strategy:
11
+ fail-fast: false
12
+ matrix:
13
+ include:
14
+ - {os: ubuntu-latest, python: '3.10'}
15
+ - {os: ubuntu-latest, python: '3.13'}
16
+ - {os: macos-latest, python: '3.12'}
17
+ - {os: windows-latest, python: '3.12'}
18
+ runs-on: ${{ matrix.os }}
19
+ timeout-minutes: 20
20
+ steps:
21
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ with:
23
+ persist-credentials: false
24
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
25
+ with:
26
+ python-version: ${{ matrix.python }}
27
+ - run: python -m pip install --upgrade pip
28
+ - run: python -m pip install '.[test]'
29
+ - run: python -m ruff check pdf2dxf_stable tests tools
30
+ - run: python -m pytest -q
31
+ - run: python -m build
32
+ - name: Validate distribution metadata
33
+ shell: python
34
+ run: |
35
+ from pathlib import Path
36
+ import subprocess, sys
37
+ subprocess.run([sys.executable, '-m', 'twine', 'check', *map(str, Path('dist').glob('*'))], check=True)
38
+ - name: Install the built wheel
39
+ shell: python
40
+ run: |
41
+ from pathlib import Path
42
+ import subprocess, sys
43
+ wheel, = Path('dist').glob('*.whl')
44
+ subprocess.run([sys.executable, '-m', 'pip', 'install', '--force-reinstall', '--no-deps', str(wheel)], check=True)
45
+ - name: Check distribution contents
46
+ shell: python
47
+ run: |
48
+ from pathlib import Path
49
+ import subprocess, sys
50
+ subprocess.run([sys.executable, 'tools/check_distribution.py', '--public', *map(str, Path('dist').glob('*'))], check=True)
51
+ - run: python -m pip check
52
+ - run: python tools/test_installed_wheel.py
@@ -0,0 +1,31 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .pytest_cache/
4
+ *.egg-info/
5
+ build/
6
+ dist/
7
+ .venv/
8
+ venv/
9
+ tmp/
10
+ .ruff_cache/
11
+ .coverage
12
+ htmlcov/
13
+ .DS_Store
14
+ .env
15
+ .env.*
16
+ *.dxf
17
+ *.pdf
18
+ *.p2dfont
19
+ *.ttf
20
+ *.otf
21
+ *.ttc
22
+ *.otc
23
+ *_work_*/
24
+ *.dxf.lock
25
+ *.report.json
26
+ batch_summary.json
27
+ regression_summary.json
28
+ /output/
29
+ /outputs/
30
+ /catalogs/
31
+ /images/
@@ -0,0 +1,286 @@
1
+ # 2.0.0rc34
2
+
3
+ rc34 补齐此前 15 个短行缺字样例:十字库同时加载时 **84/84 短行完整,16/16 长行完整**,100 个原始字体 PDF 重新转换共恢复 3,630 个字符。新增字身尺寸、基线和字距一致性校验,原始轮廓保持完整;29 条旧 lint 已清零并加入 CI。新算法需配合 **r3 字库**,旧 r2 仍可读取。测试样例完整率不代表任意字体准确率;历史图纸部分复测结果见[验证记录](docs/VALIDATION.md)。
4
+
5
+ rc34 completes the 15 previously incomplete short cases: **84/84 short rows and 16/16 long rows** with all ten catalogs loaded. Reconverting the 100 original font PDFs restores 3,630 characters. Persisted em-size, baseline and advance measurements add an independent layout check while preserving original geometry. All 29 old lint findings are fixed and lint is now a CI gate. The added proof requires **r3 catalogs**; existing r2 catalogs remain readable. Fixture completeness is not universal-font accuracy. See [validation](docs/VALIDATION.md) for the partial historical-corpus rerun.
6
+
7
+ rc34 已使用十套 r3 字库完成历史清单中 **4,251 份 PDF /4,253 页**的复测,转换及保存完整性失败为 0;1072 页通过 model_ready,3181 页待复核。按用户要求停止全量转换,原清单 12,577 页中仍有 8,324 页未测。3,454 页由最终代码转换,799 个无图片页保留经范围核验的本轮结果。详见[验证记录](docs/VALIDATION.md)。这是部分转换验证,不是任意字体准确率或全部工程图纸通过的承诺。
8
+
9
+ rc34 tests **4,253 pages from 4,251 historical PDFs** with all ten r3 catalogs, finding zero conversion/integrity failures: 1072 pages are model-ready and 3181 need review. At the user's request, the full run was stopped; 8,324 of the manifest's 12,577 pages remain untested. The final runtime converts 3,454 pages; 799 verified no-media results from this run retain their actual earlier fingerprints. See [validation](docs/VALIDATION.md). This is partial conversion coverage, not universal-font accuracy or engineering acceptance.
10
+
11
+ 另修复软蒙版、重采样图片尺寸及裁剪作用域,13 项媒体回归通过;源码和隔离安装包各 732 项测试通过。
12
+
13
+ Media fixes cover soft masks, resampled image dimensions and clipping scope, with 13 media regressions and 732 source/installed-wheel tests passing.
14
+
15
+ # 2.0.0rc33
16
+
17
+ rc33 优化字库 Unicode 索引构建,保留全部校验和原有识别判定。十套 r2 字库七轮交替实测,完整加载中位耗时 **2.368→2.229 秒(减少 5.9%)**,进程峰值内存中位数减少 **27.9 MiB**。246,293 条模板和 2,288,068 个索引键的全部字段与 rc32 一致;100 个 DXF 和 4 个实际 PDF 转换结果保持一致。源码 696 项测试通过。短行仍为 69/84 完整,任意字体识别尚未达到 100%;r2 字库无需重下。详见[验证记录](docs/VALIDATION.md)。
18
+
19
+ rc33 reduces repeated Unicode index construction while retaining every integrity check and recognition decision. Seven alternating local runs loading ten r2 catalogs reduce median load time **2.368→2.229 s (5.9%)** and median process peak RSS by **27.9 MiB**. Every field across 246,293 templates and 2,288,068 lookup keys matches rc32; 100 DXF recognitions and four actual PDF conversions preserve results. All 696 source tests pass. Short-corpus completeness remains 69/84; this is not universal-font accuracy. Reuse unchanged r2 resources. See [validation](docs/VALIDATION.md).
20
+
21
+ # 2.0.0rc32
22
+
23
+ rc32 修复长行的字形消歧上限:汉字片段和跨字体标点复核改为每个候选附近最多 96 字,不再跳过整条长行。十字库的 16 个 97/193 字 PDF 从 **8/16 提升到 16/16 完整恢复,2226→2320 字**。新增 60 项回归,源码 691 项通过;84 个短行 DXF 保持 69/84。另对 94 份历史及本机 PDF 的 155 个代表页作内容检查,并将其中 12 页实际转换、与隔离安装的 rc31 对照:1 页通过、11 页需复核,原图元与文字保持。该组图纸尚未建立外部字库字体锁;这不代表任意字体识别率达到 100%。r2 字库无需重下。详见[验证记录](docs/VALIDATION.md)。
24
+
25
+ rc32 replaces whole-row rejection with a local window of at most 96 glyphs for Han-fragment and cross-font punctuation review. Sixteen 97/193-character PDFs with all ten catalogs improve from **8/16 to 16/16 complete, 2226→2320 characters**. Sixty new regressions bring source tests to 691; 84 short DXFs retain 69/84 completeness. Content inspection covers 155 representative pages from 94 historical/local PDFs; twelve pages are converted and compared against isolated rc31: one passes and eleven need review, preserving source geometry and text. Those drawings do not establish external font locks. This is not universal-font accuracy. Reuse unchanged r2 catalogs; see [validation](docs/VALIDATION.md).
26
+
27
+ # 2.0.0rc31
28
+
29
+ rc31 补齐半包围字形的几何判断与已确认结果的逐轮连接,恢复 Jigmo 的“建”。指定对应字体字库的 84 个原 PDF 样例达到 **84/84 完整恢复**(1310 字);这组样例的 100% 不代表任意字体均能识别。组合十字库为 **69/84**,仍保留证据不足的轮廓。新增 12 个含“建”的长行 PDF 全部完整;新增 65 项回归,源码 631 项通过。原有长行和 22 份 BIM PDF 已复测,工程比例门槛不变。r2 字库无需重下。详见[算法说明](docs/OPEN_OUTLINE_ALGORITHMS.md)和[验证记录](docs/VALIDATION.md)。
30
+
31
+ rc31 verifies half-enclosed geometry and chains only previously proved results, restoring Jigmo 建. The 84 existing matching-face PDF probes reach **84/84 complete** (1310 characters); this bounded 100% result does not establish arbitrary-font recognition. All-ten-catalog probes reach **69/84**, retaining unsupported outlines. Twelve new long PDFs containing 建 all complete. Sixty-five regressions bring source tests to 631. Existing long PDFs and 22 BIM PDFs were rerun; engineering-scale gates are unchanged. Reuse r2 catalogs; see [algorithms](docs/OPEN_OUTLINE_ALGORITHMS.md) and [validation](docs/VALIDATION.md).
32
+
33
+ # 2.0.0rc30
34
+
35
+ rc30 补齐汉字内部标点冲突的复核,让先前已确认的字形连接后续拓扑证据,并以最多 96 字的局部邻接窗口处理长行。十字库组合完整样例从 63/84 提升到 67/84,多恢复 8 字;新增 12 个 Jigmo 长行 PDF 从全部漏“图”变为全部完整。新增 38 项回归,源码 566 项通过。84 个对应字体 PDF、原有 16 个长行 PDF 和 22 份 BIM PDF 也已复测。未确认的“建”继续保留轮廓;r2 字库无需重下。详见[算法说明](docs/OPEN_OUTLINE_ALGORITHMS.md)和[验证记录](docs/VALIDATION.md)。
36
+
37
+ rc30 verifies Han glyphs blocked only by small internal punctuation, lets previously verified glyphs connect later topology evidence, and uses a bounded local window of at most 96 adjacent glyphs for long rows. All-ten-catalog completeness improves from 63/84 to 67/84, restoring eight characters. Twelve new Jigmo long PDFs improve from all missing 图 to all complete. Thirty-eight new regressions bring source tests to 566. All 84 matching-face PDFs, the existing 16 long PDFs and 22 BIM PDFs were also rerun. Ambiguous 建 remains geometry; reuse unchanged r2 catalogs. See [algorithms](docs/OPEN_OUTLINE_ALGORITHMS.md) and [validation](docs/VALIDATION.md).
38
+
39
+ # 2.0.0rc29
40
+
41
+ rc29 复用 Shapely/GEOS 严格包含算法,修复闭合部首与整字同时匹配导致的漏识别;需同字体部首别名、精确字形、封闭拓扑和三个独立同行汉字锚点。Jigmo 两个对应字体 PDF 补回“图”;“建”仍保留歧义。新增 36 项回归,源码 528 项通过。84 个对应字体 PDF 恢复 1308 字,16 个长行 PDF 全部完整;84 个十字库 DXF 和 22 份 BIM PDF 也已复测。r2 字库无需重下。详见[开源算法调研](docs/OPEN_OUTLINE_ALGORITHMS.md)和[验证记录](docs/VALIDATION.md)。
42
+
43
+ rc29 reuses Shapely/GEOS strict containment to resolve an exact whole glyph competing with its enclosing radical. It requires a matching same-font Kangxi alias, exact geometry, closed topology and three independent Han anchors in the same row. Both matching-face Jigmo PDFs regain 图; 建 remains unresolved. Thirty-six new tests bring the source total to 528. The 84 matching-face PDFs publish 1308 characters; all 16 long PDFs remain complete. The 84 all-ten-catalog DXFs and 22 BIM PDFs were also rerun. Reuse unchanged r2 resources; see the [algorithm research](docs/OPEN_OUTLINE_ALGORITHMS.md) and [validation](docs/VALIDATION.md).
44
+
45
+ # 2.0.0rc28
46
+
47
+ rc28 修复 PDF 曲线采样数在整数边界受数值误差影响而漏识别文字的问题;转换器和字库构建器共用有界的采样规则,精确字形匹配与歧义检查不变。原 16 个长行 PDF 从 14 个完整恢复提升到 16 个,补齐四处 `B`,共恢复 2320 个字符。新增 23 项回归,源码 492 项通过;84 个对应字体 PDF、84 个短行 DXF 和 22 份 BIM 图纸均已复测。现有 r2 字库无需重下;需从原 PDF 重新转换以应用采样修复。详见[验证记录](docs/VALIDATION.md)。
48
+
49
+ rc28 stabilizes integer curve-sampling ties affected by PDF numeric serialization. The converter and font builder share the bounded count rule; exact glyph matching and ambiguity checks remain unchanged. All 16 original long PDFs now recover completely (previously 14), restoring four missing `B` characters for 2320 characters total. Twenty-three regressions bring source tests to 492. The 84 matching-face PDFs, 84 short DXFs and 22 BIM PDFs have been rerun. Reuse r2 catalogs and reconvert the original PDF to apply this sampling fix; see [validation](docs/VALIDATION.md).
50
+
51
+ 四个受影响 HATCH 的边界变化 <0.000992 mm;对原 PDF 曲线的最大偏差 <0.001188 mm,仍在原容差内。其他长行原图元、84 对应字体 PDF、84 已保存 DXF 和 22 BIM 图纸的既有几何结果不变。
52
+
53
+ # 2.0.0rc27
54
+
55
+ - 修复已精确匹配且字体已确认的长文字超过 96 字时整行不输出。仅在写入 TEXT 前分段,每段仍通过原有文字共识检查,保留原字形、位置、来源和幂等行为。
56
+ - 97/193/289 字等边界避免留下单字尾段;不足共识的数字段、未知字形、同形冲突继续保留轮廓。新增 `long_text_runs_split` / `long_text_segments` 统计初次分段,最终输出仍以 accepted 和保存 TEXT 为准。
57
+ - 新增 26 项回归;冻结 rc26 为 21 失败、5 通过,修复后全量源码 469 项通过。中英文描边/填充、补充平面汉字、定位点、句柄完整性和重复执行均核验。
58
+ - 四个真实字体的 16 个 97/193 字 PDF:14 个完整、2 个仍部分恢复,发布字符 286→2316(增加 2030)。字形匹配候选数与 rc26 相同;所有输出逐字对齐原字体边界和来源,不能把分段输出改善当成字形匹配准确率提升。
59
+ - 原有 84 个短文本 DXF 的全部既有识别字段及实体库组码保持一致(仅保存时间变化),仍为 63/84 完整;22 份 BIM 实图重新转换,保存组码除 HEADER GUID 外与 rc26 相同,原有比例限制不变。r2 资源不变。
60
+
61
+ rc27 splits already matched long rows into TEXT payloads of at most 96 glyphs, retaining independent consensus, source geometry, positioning and idempotence. Twenty-six regressions cover boundaries and rejection cases; source tests pass 469. Sixteen real-font long PDFs publish 2316 characters versus 286 on rc26, with 14 complete and 2 partial cases. Candidate matching itself is unchanged. Short-DXF and fresh BIM evidence preserve prior results and scale limitations; existing r2 catalogs are reused.
62
+
63
+ # 2.0.0rc26
64
+
65
+ - 修复多标签轮廓窗口未生成候选后,从重叠检查中消失的问题。歧义的内部、跨字边界和完整父字窗口均继续阻止重叠候选;仅已有锚点支持的来源行复核可恢复完整字形。
66
+ - 新增 `font_ambiguous_overlap_rejections` 统计初次扫描中受阻的唯一候选。使用排序、前缀最大端点和二分查找,避免新增逐候选遍历全部冲突窗口。
67
+ - 新增 19 项回归,全部能在冻结 rc25 复现错误输出或错误字体锁定;rc26 全量源码 443 项通过。覆盖同库/跨库冲突、顺序、汉字/字母/数字竞争、描边/填充、跨界、邻接、几何保留和幂等。
68
+ - 十字库组合由 70/84 变为 63/84 完整,31 个旧输出字符因失去无冲突字体锚点而保留为轮廓;并非认定这 31 个标签全部错误。20 个完整英文字母样例全部通过,逐字体 PDF 仍为 82/84。分别独立核验 1244 / 1306 个已发布字形;十个来源行补回字形的全部冲突窗口重新计算通过。
69
+ - 16 个正常字库加载检查验证 12 个完整输出及 4 个正确保留歧义的结果,另六个 ABCD8w 回归通过。22 份 BIM 图纸重新转换,保存 DXF 组码除 HEADER GUID 外与 rc24 相同;22 份仍为 degraded,比例门槛不变。r2 资源无需重下。
70
+
71
+ rc26 keeps ambiguous geometry in overlap checks, preventing it from silently admitting a parent or child and creating its own font lock. Nineteen regressions fail on frozen rc25 and pass after the fix; the source suite reaches 443 tests. Combined-catalog completeness changes from 70/84 to 63/84, withholding 31 characters when font anchors become insufficient. This is a correctness fix, not an accuracy increase. All 20 alphabet probes pass; matching-face PDFs remain 82/84. Independent glyph, row-evidence, normal-loading and 22-BIM checks preserve source geometry and existing scale limitations. Reuse unchanged r2 assets.
72
+
73
+ # 2.0.0rc25
74
+
75
+ - 减少字库索引构建的临时集合、重复键展开和逐摘要 NumPy 切片;保留全部完整性、码位、别名、拓扑和歧义校验,兼容旧版字库。
76
+ - 十字库三轮独立进程对照:加载中位耗时 5.76→2.31 秒(约减少 60%),进程峰值内存约减少 19%。246,293 条模板与 2,288,068 个匹配键的全部字段、顺序和引用一致;不是整张 PDF 转换耗时结论。
77
+ - 新增 8 项兼容性/二进制/同形歧义检查;全量源码 424 项通过。84 个保存 DXF 的完整识别报告与 rc24 一致,实体库标签仅写入时间变化;8 个正常加载十字库的 PDF 转换全部通过。r2 资源不变。
78
+ - 本轮未重跑 22 份 BIM PDF、84 份对应字体 PDF 或历史全语料;它们的 rc24/rc11 结果保留原版本标记,工程比例限制未改变。
79
+
80
+ rc25 reduces catalog index construction overhead while preserving all validation and recognition contracts. Ten-catalog loading falls from 5.76 to 2.31 seconds in three local fresh-process trials, with about 19% lower process peak RSS. Complete catalog fingerprints and 84 DXF recognition reports are identical to rc24. Eight new characterization tests bring the source suite to 424. Existing r2 catalogs are reused; previous BIM and matching-face PDF results remain explicitly historical.
81
+
82
+ # 2.0.0rc24
83
+
84
+ - 修复其他字体的内部标点轮廓阻断完整英文的问题;要求已有字体锁定、四个不同且全局无歧义的同行字母锚点,并继续检查全部竞争窗口。原有汉字规则不变,不使用 OCR。
85
+ - 新增 17 项回归,全量源码 416 项通过。十字库 DXF 样例完整恢复 64/84→70/84,补回六个 `i`,20 个大小写 52 字母样例全部完整;逐字体 PDF 保持 82/84。1275 / 1306 个输出字形独立核验通过。
86
+ - 八个正常加载字库的英文/扩展 J PDF 检查、六个 ABCD8w PDF 和 22 份 BIM 图纸复测完成。BIM 保存组码除两个 HEADER GUID 外与 rc23 一致,尺寸门槛结果不变。r2 资源无需重新下载。
87
+
88
+ rc24 conservatively restores whole Latin glyphs blocked by foreign punctuation contours. Seventeen regressions bring source tests to 416. All-ten-catalog DXFs improve from 64/84 to 70/84 complete, including all 20 alphabet probes. Matching-face PDFs remain 82/84; geometry, scale gates, Han rules and r2 resources are preserved.
89
+
90
+ # 2.0.0rc23
91
+
92
+ - 多字库扫描锁定字体后,对原先已有唯一整字标签的漏识别候选进行来源行复核;要求三个不同且全局无歧义的汉字锚点,并通过原有单字体短笔画规则。所有原始冲突窗口继续核验,不因字体锁定而丢弃其他字体的证据。
93
+ - 仅处理整字严格包含、明显小于锚点字号的汉字/标点/中日韩笔画片段;汉字标签必须唯一且得到当前字体支持。竞争字母、数字、整字同形、等大/跨界轮廓、外部汉字标签和独立小字行仍拒绝。新增有界的来源、标签、字形指纹与比例证据报告。
94
+ - 新增 17 项回归;本地源码 399 项通过。十字库组合的 84 个 DXF 样例完整恢复 62→64,增加两个字符;逐字体 84 个 PDF 仍为 82 个完整恢复。分别校验全部 1269 / 1306 个输出字形的原字体边界和标签。
95
+ - 正常加载下载字库的四个 PDF→DXF→TEXT 检查均完整恢复。六个数字/字母回归通过;22 份 BIM 实图全部保存组码与 rc22 一致,仅两个 HEADER GUID 变化,文字/比例质量状态不变。
96
+ - r2 资源不变,中英说明分别披露组合字库和对应字体字库的实际结果。仍为预发布,不声明任意字体或工程验收全部通过。
97
+
98
+ rc23 restores exact Han parents obscured by cross-catalog short-stroke labels using a pre-existing font lock and three globally unambiguous same-row Han anchors. All competing windows remain part of the evidence; complete labels and unsupported alternatives are not guessed. Seventeen added tests bring the source suite to 399. All-ten-catalog DXF probes improve from 62/84 to 64/84 complete; matching-face PDF probes remain 82/84. Existing r2 assets, saved geometry and engineering-scale results are preserved.
99
+
100
+ # 2.0.0rc22
101
+
102
+ - 修复完整汉字内部短笔画与“一”等字形竞争造成的漏识别:要求精确整字、严格包含、同字体连续文字行、两个无歧义锚点、至少三个不同汉字及尺寸证据。等大候选、同形异字、独立小字行、跨字体与不连续来源继续保留歧义;不使用 OCR。
103
+ - 报告保存父字、笔画、锚点的源句柄、字形指纹与尺寸比例,最多 32 条详细证据并单列截断计数。候选数量与实际发布 TEXT 分开统计。
104
+ - 新增 17 项回归;全量源码 382 项通过。逐字体指定对应字库的 84 个真实字体样例完整恢复由 68 增至 82,1306 个发布字形逐字核对来源和原字体边界,原 DXF 图元保持一致。剩余 2 个 Jigmo 样例继续保留歧义,六个额外 8/w 回归通过。
105
+ - 22 份 BIM 实图全部复测;所有保存 DXF 组码与 rc21 一致,仅两个 HEADER GUID 变化。文字、比例与质量门槛结果不变。
106
+ - 继续使用字节完全相同的 r2 资源。中英说明与公开验证数据同步更新。
107
+
108
+ rc22 uses exact glyph, same-font row and scale evidence to distinguish tiny internal Han strokes from whole glyphs. Ambiguous alternatives remain geometry. Seventeen new tests cover positive stroke/fill cases, negative evidence boundaries, geometry preservation, idempotence and bounded reports. Real-font probes improve from 68/84 to 82/84 complete; saved BIM geometry and quality states are unchanged. Existing r2 catalogs are reused byte-for-byte.
109
+
110
+ # 2.0.0rc21
111
+
112
+ - v2 字库保留全部旧描边模板,追加严格闭合共线退化轮廓的有效填充表示;修复 Jigmo `w`,同时保住数字 `8` 的原始描边匹配。旧字库保持可读。
113
+ - 两套同字表示严格包含且差异仅为零面积闭合路径时保留完整描边;其他标签冲突和重叠继续拒绝,DXF 几何不变。
114
+ - 新增 28 项回归;全量源码 365 项通过。重建十个开源字库并逐条核对旧模板与新增表示,新 r2 资源要求 rc21+。
115
+ - 84 个真实字体样例完整恢复由 62 增至 68,所有二十个 52 字母描边/填充样例通过;另六个数字 8/w 样例通过,16 个汉字样例仍保留歧义。
116
+ - 22 份 BIM 图纸重新转换并核对全部保存 DXF 组码,除 HEADER GUID 外与 rc20 一致;文字和比例质量状态不变。更新中英说明与公开证据。
117
+
118
+ # 2.0.0rc20
119
+
120
+ - 修复 `make_valid` 返回含 Polygon 和退化线段的 GeometryCollection 时整组填充被丢弃的问题;递归提取有效面,保留源轮廓方向、孔洞和独立描边。
121
+ - 新增 17 项回归,覆盖两种填充规则、正反方向、孔洞、多面、零面积退化、PDF→已保存 HATCH、描边和裁剪。
122
+ - 84 个真实字体样例完整恢复从 61 提高到 62,补齐 Jigmo 扩展 I 的一个填充样例;22 个样例仍部分恢复或未确认,字库与匹配门槛不变。
123
+ - 22 份 BIM 图纸复测:独立绕数核验 9,895 条修复填充记录,保存结果增加 14,345 个 HATCH(包括块内实体)。非填充实体、文字和比例结果与 rc19 对齐,工程质量降级仍明确保留。
124
+ - 更新中英 README、项目说明与可复核证据。详见 docs/VALIDATION.md。
125
+
126
+ # 2.0.0rc19
127
+
128
+ - 修复 PDF 数值保存误差使轮廓顶点跨越栅格取整边界、导致思源宋体及遍黑体部分英文字母缺失的问题;有限 3/4/5 位取整变体仍要求精确字库掩码与拓扑,不改变 DXF 几何。
129
+ - 跨所有数值变体和字库统一拒绝标签冲突;保留字体锁定、重复/相邻一致性、重叠歧义和工程比例门槛,报告新增每字取整精度与匹配证据。
130
+ - 新增 8 项回归,覆盖描边/填充边界、超界变形拒绝、同库/跨库冲突、原始几何保留与幂等;84 个真实字体样例完整恢复由 57 提升到 61,仍有 23 个部分恢复或未确认,不将覆盖数当作准确率。
131
+ - 复用 rc18 字库资源与许可证,更新中英 README、项目说明和本轮验证证据。详细实测及工程限制见 docs/VALIDATION.md。
132
+
133
+ # 2.0.0rc18
134
+
135
+ - 提供 10 个开源静态字体字库,分成常用中英文与扩展汉字两个独立资源包;固定官方来源版本、SHA256、许可证和版权文本,主 wheel 不含字体或字库。
136
+ - 与 Unicode 17 官方字符表逐码点核对,Jigmo 三个字库并集覆盖所支持基本区、A–J、兼容区全部 102,998 个已分配汉字码点;不把模板覆盖宣称为任意字体识别率。
137
+ - 新增 `--outline-font-bundle`、`font-catalog inspect-bundle`、Python 字库包校验接口,以及支持离线缓存和已完成字库复用的可复现构建工具。
138
+ - 修复精确完整字形内部的标点片段导致整字误拒绝的问题,例如思源黑体 `i` 的竖画被识别成竖排破折号;竞争的字母/汉字与交叉重叠仍保持歧义,字体锁定和连续成行条件保留。
139
+ - 新增 31 项字库分发、文件保护、完整性、离线 TEXT 恢复和轮廓重叠回归;完整测试及实图证据见 docs/VALIDATION.md,真实字体的完整/部分/未确认结果逐项公开。
140
+
141
+ # 2.0.0rc17
142
+
143
+ - 补齐 A–Z / a–z 全部 52 个英文字母的纯英文轮廓恢复;相邻四个不同字母可独立确认字体,保留大小写,并支持中英混排的正常字高差异。
144
+ - 修复补充平面汉字已匹配却被输出检查拦截的问题;汉字基本区、扩展 A–J 和兼容汉字使用统一 Unicode 检查,保留既有单码位 NFKC 标准化。
145
+ - 精确拓扑/掩码匹配增加逐标签宽高比核验,排除同掩码而比例不同的候选;同形歧义和孤立匹配继续保留几何。
146
+ - 支持读取持久化 DXF 中纯填充字形的闭合 HATCH 折线边界;同源描边避免重复,非平面/开放/含 bulge 的填充保持原样。默认保留源填充,重复恢复幂等。
147
+ - 字库保留小数曲线采样比值,默认由 5 组扩展到 17 组,补齐常用字号贝塞尔曲线的采样匹配;rc17 继续读取旧字库,新采样字库要求 rc17+。
148
+ - 新增 `--charset english`、52 字母覆盖/缺字统计和各汉字区段映射统计;中英双语说明明确字体、扫描页和工程比例的验证边界。
149
+ - 新增完整真实英文字母、纯填充曲线、Unicode 汉字区段、混排、旧字库兼容、填充保留/幂等和拒绝歧义场景的回归。完整测试与实图结果见 docs/VALIDATION.md。
150
+
151
+ # 2.0.0rc16
152
+
153
+ - GitHub 首次公开发行:维护者授权采用 AGPL-3.0-only,补齐 LICENSE / NOTICE、包许可元数据、来源声明、中英双语 README 与项目链接。
154
+ - 发布包检查要求归档中实际包含许可及第三方声明,导出快照保留维护者声明的发布状态;新增 2 项发布回归,连同 Windows 编码回归共 226 项。
155
+ - 修复 Windows 非 UTF-8 日志导致已恢复中文的任务失败:内部 JSON 统一按 UTF-8 读取,worker 日志使用无损 JSON 转义,CLI 在旧编码输出流中回退到可解码的 JSON;增加中文路径和 cp1252 端到端回归。
156
+ - 输入预检、修复、页码读取和文件哈希移入受监督子进程,补齐原来发生在资源监控之前的解析路径;报告新增 input_validation 及资源证据。
157
+ - 非 PDF 和加密 PDF 给出明确错误;qpdf / mutool 超时或启动失败可继续后续修复,最后的 PyMuPDF 重写避免整份 PDF 的额外内存副本。
158
+ - 输出锁支持有界等待和取消;Ctrl+C 返回 130,终止活动子进程树,批处理先发出取消信号再等待工作线程退出,防止中断后仍处理队列。
159
+ - 修复无系统字体的 Linux 环境 R12 MTEXT 无法拆分的问题;可选 Matplotlib 提供度量,处理 ezdxf 失效默认字体缓存,并以 R12_FONT_METRICS_FALLBACK 明确外观近似。通用 DXF 和中文识别规则不变。
160
+ - 提高 Pillow / FontTools 安全版本下限,精确指定 OpenCV 最低已发行 wheel 版本;对最低直接依赖和实际解析环境执行已知漏洞检查。
161
+ - 发布检查新增 wheel / sdist 内容校验和独立许可状态检查;CI 固定 Action 提交,验证安装包不读取工作区源码。
162
+ - GitHub CI 已在 Ubuntu Python 3.10/3.13、macOS Python 3.12、Windows Python 3.12 上分别通过 226 项源码与 226 项隔离安装包回归;发布前本地 222 项基线独立记录在 docs/VALIDATION.md。
163
+ - 重新验证 22 份内部 PDF 的转换、保存后 DXF、中文文本、比例与输入预检证据;保留未通过的质量状态,不放宽工程门槛。
164
+
165
+ # 2.0.0rc15
166
+
167
+ - 修复 batch 将质量降级当成退出成功;空输入、非法清单拒绝执行,重复规范路径只转换一次;regress 隔离单文件异常。
168
+ - 保护输入、字库、输出 DXF、分页/R12 图纸和报告,识别符号链接及硬链接别名;汇总报告和 CLI JSON 使用原子写入。
169
+ - 页码在参数解析阶段验证,显式范围有界,避免巨大范围提前分配内存。
170
+ - 字库在创建 NumPy 数组前检查头部、类型、形状和实际长度,按声明的合法维度限制读取;无效清单、计数、容差和 ZIP 返回可解释错误。
171
+ - 添加独立发布白名单导出器、文件哈希清单、安装后测试工具、跨平台 CI、贡献说明和第三方来源待办;源码包排除内部证据、图纸截图、原始路径和临时环境。
172
+ - 源码与隔离 wheel 各 204 项测试通过;22 份实图转换失败 0、全部保留 degraded 状态,已保存 DXF 文字、比例和 SHA256 逐份复核。
173
+ - 项目许可证和部分模板再分发授权暂待维护者决定,本轮仅准备本地发布目录。
174
+
175
+ # 2.0.0rc14
176
+
177
+ - 新增任意 OpenType 轮廓字体字库构建器,支持 TTF、OTF、TTC 和 OTC face;`font-catalog faces/build/inspect` 将字体映射持久化为可校验的 `.p2dfont`,转换运行时不再读取字体文件。
178
+ - 默认中文字集按 Unicode 17.0 覆盖统一汉字扩展 A–J、兼容汉字、部首、笔画、注音符号和 CJK 标点/符号;只收入字体实际映射且具有二维轮廓的字符,另可用 `--charset all` 构建全部 Unicode 映射。
179
+ - 字库保存 Unicode 码位、闭合拓扑、实体数、56×56 归一化掩码和 5 组曲线离散指纹,并逐数组校验大小、类型、SHA256、全数据集哈希、来源字体 SHA256 和复算后的字库身份;重复归档成员、损坏或不兼容字库明确拒绝。
180
+ - 同一字体须由至少 3 个相邻且互不相同的汉字精确命中,或由 3 个内置人工审核汉字锚点命中后才能锁定。锁定后才发布其他字符;跨字体冲突、同形异字、重叠切分、孤立候选和未知轮廓保持几何。
181
+ - 修复 PDF 数值序列化在半像素边界造成的精确指纹漏字;字库与 DXF 运行时统一使用 1e-4 栅格像素量化。新增真实矢量 PDF 端到端回归,在删除源 TTF 后仍可把“中文国图”完整恢复为一个 `TEXT`。
182
+ - Songti SC Light 实测生成 29,901 个模板,其中 29,224 个汉字模板,字库为 8,257,182 bytes;纯 DXF 自锁恢复“中文国图”4/4。另验证 TrueType、CFF OTF 和 8-face TTC 构建与重载。
183
+ - 使用最终 Unicode 17.0 字库重跑 内部 22 份图纸样本 的全部 22 份 PDF,转换失败 0、保存后审计错误/修复 0。该宋体与实图轮廓字体不匹配,41 个孤立精确候选均未达到锁定门槛,外部字库发布 0 字;内置结果保持 238 条 `TEXT`、1035 个字符。
184
+ - 比例结果保持 9 页 `calibrated`、6 页 `declared_approximate`、6 页 `paper`、1 页 `unknown`;未放宽尺寸误差或工程比例门槛。
185
+ - 源码与全新隔离 wheel 各 173 项测试通过,`pip check` 通过;wheel 从 `site-packages` 导入并用最终外部字库完成真实 PDF 冒烟,包内不携带外部字体或 `.p2dfont`。
186
+
187
+ # 2.0.0rc13
188
+
189
+ - 将轮廓中文恢复改为纯 DXF 算法:先保存纸面 DXF,再按来源 XDATA、完整连续笔画、闭合拓扑、点数和归一化几何指纹精确匹配;运行阶段不读取 PDF、不调用 OCR。
190
+ - 内置 101 个带来源标签证据的完整字形模板、覆盖 63 个字符;93 个模板须在至少两个不同源 PDF 中完全一致,8 个仅允许组成经独立工程字典交叉确认的完整 `1:60` / `1:90`。
191
+ - 只发布至少两个连续汉字或完整 `1:n`;已确认文字写入 `PDF_TEXT_RECOVERED_NOOCR`,原轮廓与相关填充默认移入关闭的 `PDF_OUTLINE_BACKUP`,未知和孤立候选保持几何。
192
+ - 字形窗口改用持久化 PDF 源绘制序号连续性,避免 HATCH 等中间图元打断文字;宽标点按实际相对字高分组,补全题栏中的“注册师印章、出图专用章、工程主持人、子项名称、1-1剖面图”等文本。
193
+ - 修复 `keep` 策略重复运行会重复插入 `TEXT`;现在按 `PDF2DXF_GLYPH` 中的恢复位置幂等处理,并保留用户对已恢复文字的手工修改。
194
+ - 删除 RapidOCR/ONNX 依赖以及旧 `outline_chinese.py`、`path_text.py` 重复入口;worker 只保留基础 PDF→DXF 与持久化 DXF 文字恢复两个阶段。
195
+ - 删除唯一旧入口已关闭的 Tesseract/PDF 字形聚合/V15 尺寸推断链,共 14 个死模块和 FontTools 直接依赖;旧 `include_native_dimensions=true` 现在显式拒绝,避免静默回退到 OCR。
196
+ - 删除仓库零调用的 `convert_paper_dxf` 图框/多视口入口及其仿射导出、视口曲线裁剪、metadata/finalize、重复内部验证共 9 个实现模块和 4 个旧测试;公共接口不再列出 `mode=split`,并移除该死链独占的 `scikit-learn` 依赖。
197
+ - 内部 22 份图纸样本 的 22 份图纸全部重新转换,失败 0;恢复 238 条 `TEXT`、1035 个字符,最终 DXF 重开、XDATA、原轮廓备份、文件哈希和比例范围逐份核验通过。
198
+ - 最终代码连续两轮的 22 个 DXF SHA256 逐一相同;比例声明去重后不再因原生文本和恢复文本同时存在而重复报告。
199
+ - 源码与清理后 wheel 在两个全新 Python 3.12 环境中各 160 项测试通过;wheel 仅含 43 个文件,旧模块不存在,`pip check` 通过。
200
+
201
+ # 2.0.0rc12
202
+
203
+ - 新增可选的轮廓中文恢复:RapidOCR 以 180/280 DPI 双整页结果、480 DPI 局部复核和 PDF 绘制序号到 DXF XDATA 映射共同确认,才写入可编辑 `TEXT`。
204
+ - 已确认文字写入 `PDF_TEXT_RECOVERED_OCR`;对应原轮廓默认移入关闭的 `PDF_OUTLINE_BACKUP`,未确认内容保持原几何。数字歧义字符和低置信单次识别不写入文本。
205
+ - OCR 整页与局部阶段使用短进程、分块识别和单线程推理,修复密集表格页累计内存超限;缺少可选依赖时 `auto` 保留轮廓,`required` 明确失败。
206
+ - 新增 `scale_mode=declared`:仅在没有更高等级尺寸证据、仅有一个独立题栏比例且无冲突时等比换算,并标记 `declared_approximate`、`engineering_scale_confirmed=false`、`model_ready=false`。
207
+ - 表格、目录和建筑说明通过文件名及已恢复内容保持纸空间;材料配合比、多个比例或尺寸冲突不能触发近似全页缩放。
208
+ - `convert`、`batch`、`regress` 均可传递 `--outline-chinese` 和比例/资源参数。独立包不新增图框拆分,继续由 dtai-base 现有 DrawingIR 流程处理图框。
209
+ - 源码与隔离 wheel 各 157 项测试通过;22 份当前 BIM 图纸全部生成 DXF,共确认 341 个可编辑文字,保存后完整性复核 22/22 通过。
210
+
211
+ # 2.0.0rc11
212
+
213
+ - 保留 PDF `ImageMask` 的实际绘制颜色、透明度与每次放置,修复无颜色空间的模板图像被跳过。
214
+ - CMYK 图像转为 PNG 兼容 RGB,合成 `/SMask` 保留透明度;可见图像提取失败会阻止几何质量门槛。
215
+ - 兼容图像与软蒙版采样尺寸不同的 PDF;默认单页内存上限调至 2560 MiB,覆盖已验证的大型施工图页面。
216
+ - 只跳过经页面 bbox 交集证明完全不可见的媒体,记录跳过数量;消除页面外内联图像的无效栅格回退警告。
217
+ - 后端警告去重;字形匹配先排除不可能通过阈值的候选,保持结果一致并减少分位数计算。
218
+ - 新增图像蒙版、CMYK、透明图、`/Matte` 与异尺寸软蒙版、页面外媒体及图形门槛回归,当前共 141 项。
219
+
220
+ # 2.0.0rc10
221
+
222
+ - R12 曲线容差按 mm/cm/m/inch 换算到同一物理 0.05 mm,修复米制曲线过粗;完整展开旋转阵列,先归并零间距轴。
223
+ - 尺寸证据新增源尺寸线、界线和文字快照,按最终块变换还原纸面坐标复核;删除或修改可见图元不能只靠隐藏 DIMENSION 过关。
224
+ - 拒绝非有限尺寸阈值和缺少独立证据的旧信任摘要;空 DXF 和 R12 兼容输出不能误标为 model_ready。
225
+ - validate 自动读取转换报告、有效请求、单位和源证据并核对文件 SHA256;输出/JSON 路径冲突被拒绝,避免覆盖输入和报告自哈希失效。
226
+ - 文字去重覆盖模型/图纸空间和普通块定义,保留跨参照的正常文字;修复默认整图收块后重复文字未隐藏。
227
+ - 新增 27 项回归,当前共 134 项。原 PDF 回查覆盖全部 121 条超限尺寸的界线/尺寸线;逐页计算统一比例的可行区间上界,保留源图真实误差。
228
+
229
+ # 2.0.0rc9
230
+
231
+ - 从模型空间追踪 DIMENSION 的块参照位置,修复块输出换算厘米、米、英寸后的尺寸误判;支持嵌套基点、旋转、缩放及阵列。
232
+ - 输出证据检查最终三维端点和唯一放置,拒绝已删除、移位、转向或重复的块参照;排除未引用块中的标注。
233
+ - 限制块遍历深度与实例数,明确报告循环、缺失参照及无法测量的尺寸;角度值不再随长度单位换算。
234
+ - R12 保留 TEXT 对齐点、FIT/ALIGNED、倾斜和镜像;MTEXT 使用布局解析后降级,修复附着位置与旋转行距。移除旧的逐行固定偏移实现。
235
+ - 命令行帮助和 --version 统一读取 version.py,删除写死的 rc5 版本号。
236
+ - 新增 26 项回归;源码和隔离 wheel 各 107 项通过,重新验证 11 页已有 DXF,并完成结构 PDF 的毫米/米完整转换及厘米/英寸导出复核。
237
+
238
+ # 2.0.0rc8
239
+
240
+ - 将尺寸链分析整理到独立 `calibration/chains.py`;按分尺寸图层、基线和总分尺寸间距限制关联,修复跨位置拼接投影标注。
241
+ - 搜索完整几何路径并识别重叠分叉,不再取遇到的第一条链或按标签和选择路径;搜索未完成时保留待确认。
242
+ - 支持真实图纸中 17、24 段等长尺寸链,保留 64 段 / 2000 次搜索上限;输出验证重新构建局部尺寸链。
243
+ - 补齐带明确单位的原生小数及单个数字尺寸,统一换算毫米;修复恰为纸面 0.5 mm 的尺寸被边界条件排除。
244
+ - 新增跨位置、重叠、跨层、搜索上限、真实长链、单位解析及持久化 DXF 测量回归;保留原始比例误差和 0.2% 门槛。
245
+
246
+ # 2.0.0rc7
247
+
248
+ - 修复字高/基线分桶导致的数字截断、跳字及窗编号前缀丢失;使用空间邻接与歧义保留。
249
+ - 修复长引线穿过闭合字形时吞掉末位 0;用真实地下室 24050 的源路径加入回归。
250
+ - 连通分析后释放空间索引,按方向回放临时路径并跳过无效候选对象,减少大图内存峰值;临时文件计入现有磁盘限额。
251
+ - 同一投影尺寸去重,防止重复标注同时进入比例拟合和留出验证。
252
+ - 同一投影跨度的不同标签均排除出拟合,并保留冲突记录与独立检查。
253
+ - 交付验证重算独立两轴证据及总分尺寸链,核验输出尺寸实体、端点和标签,拒绝缺失或不一致的证据。
254
+ - 修复文本去重的坐标/字高归一化碰撞;仅隐藏属性完全一致的重复文本,保留原始字符及实体。
255
+ - 保留 PDF 原始坐标与 0.2% 尺寸门槛;不把量化误差改成名义尺寸,不推测中文轮廓或多比例视口。
256
+
257
+ # 2.0.0rc6
258
+
259
+ - 修复 NumPy 2.5 不再支持二维 cross 输入导致真实曲线转换失败。
260
+
261
+ - 在持久化 DXF 上补齐有限数字模板识别、原生文字分组和尺寸界线配对。
262
+ - 修复缩短尺寸线造成比例偏差,以及 C1564 等构件编号被截成尺寸数字的问题。
263
+ - 用横竖独立尺寸、留出数据和总分尺寸链确认工程比例,真实换算 DXF 坐标及输出单位。
264
+ - 为每条证据保留源 handles、端点、标签、换算值和误差;保留不达标的短尺寸误差,不修改标注来通过检查。
265
+ - 多比例、单轴或冲突证据保留纸面结果。矢量字形模板有来源记录;不再依赖缺失的项目字典,未识别文字不补猜。
266
+
267
+ # 2.0.0rc5
268
+
269
+ - 统一版本号,声明运行依赖,OCR 包延迟导入,保留原始归档 SHA-256。
270
+ - 识别纸面回退、无尺寸证据、缺字形资源和图片提取错误;分别报告几何有效性、比例、建模就绪状态。
271
+ - 实现单位和手动全页比例;传递严格模式和原轮廓处理策略;拒绝不支持的参数值。
272
+ - 仅归一化指定 DXF 元数据,不重写图纸日期、UUID、负零文字、路径或 XDATA。
273
+ - 移除错误的跨任务输出缓存,避免旧 DXF 复用和并发写入竞态;确定性由两次完整计算验证。
274
+ - 图片内容寻址、相对路径重写、资源优先发布、独立工作目录和同名输入隔离。
275
+ - 逐条提取、文件暂存并复用 MuPDF 图元;保持原有 fill/stroke 合并、裁剪和 Form 顺序。
276
+ - 无 DIMENSION 且字形恢复关闭时,跳过必然为空的标定和重复后处理;及时释放 DXF 文档。
277
+ - 监控整页进程树的 RSS、超时和临时磁盘,终止子孙进程并保存结构化失败报告。
278
+ - 修复无效页码假成功及报告 artifacts 自引用;恢复 R12 隐藏/冻结图层、字体样式和曲线填充边界。
279
+ - 移除原 rc2 强制正交化补丁,保留测得的仿射坐标轴。原三视口基准尺寸闭合恢复。
280
+ - 补上 rc4 测试调用的显式 DIMLFAC 辅助函数,限制调整范围并保存原标签和误差;稳定转换不自动调用,验证仍检查原几何误差。
281
+
282
+ 字形字典未随原包交付,仍不可恢复原本不存在的文字;未确认的真实比例仍须保留为未知。
283
+
284
+ - 按职责整理内部命名空间,合并旧格式验证器;删除旧转换/批处理/渲染入口、旧仿射导出器、未使用的 PDFium/API、验收试验脚本和重复字形流程。移除 sys.path/PYTHONPATH 注入和通配顶层打包,只保留一个 CLI。
285
+
286
+ - PDF texttrace 返回替换符时,仅以同字体、同坐标、唯一候选的原生 rawdict Unicode 补全;不移动字符、不调用 OCR、不补猜测内容。多页实图第 7 页两处字符已补全。
@@ -0,0 +1,22 @@
1
+ # 参与开发
2
+
3
+ 项目采用 [AGPL-3.0-only](LICENSE)。请仅提交你有权按该许可提供的代码、文档与测试数据,并保留必要的来源、版权和第三方许可声明。发布流程见 [发布检查](docs/RELEASE_CHECKLIST.md)。
4
+
5
+ ## 本地验证
6
+
7
+ 使用独立 Python 环境,安装 `python -m pip install '.[test]'`,执行 `python -m pytest -q`。
8
+ 修复应附上最小可复现输入或程序生成的图形、预期行为和回归测试。不要提交客户图纸、专有字体、账号凭证或带个人路径的报告。
9
+
10
+ 构建:`python -m build`。安装生成的 wheel 后运行 `python tools/test_installed_wheel.py`,验证实际从 `site-packages` 导入,避免源码目录遮蔽安装缺陷。`python -m twine check dist/*` 只检查分发元数据,不上传。
11
+
12
+ ## 转换边界
13
+
14
+ - PDF 读取只负责输入验证和 PDF→DXF 转换。文字、尺寸、比例分析必须读取已保存的 DXF 图元。
15
+ - 原生文字可以写入 TEXT/MTEXT。轮廓匹配依靠可审核字形模板、拓扑与几何一致性;未知或冲突字形保留几何,不猜字,不隐式调用 OCR。
16
+ - 不通过列宽、常见层高或其他假定补造工程比例。声明比例与经过尺寸校验的比例必须分别报告。
17
+ - 改变输出规则时同时检查图片引用、TEXT、块变换、隐藏备份层、报告哈希、单位和确定性。
18
+ - 小改动保持单一主题;版本仅修改 `pdf2dxf_stable/version.py`,不要复制出新的 vXX 引擎入口。
19
+
20
+ ## 缺陷报告
21
+
22
+ 描述操作系统、Python 与包版本、完整命令、实际退出码和预期结果。报告应先脱敏;尽量用 `fitz`、`ezdxf` 或测试用 FontBuilder 生成可复现文件。