pdflinkcheck 1.1.73__py3-none-any.whl → 1.2.29__py3-none-any.whl

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 (186) hide show
  1. pdflinkcheck/__init__.py +88 -21
  2. pdflinkcheck/__main__.py +6 -0
  3. pdflinkcheck/analysis_pdfium.py +131 -0
  4. pdflinkcheck/{analyze_pymupdf.py → analysis_pymupdf.py} +109 -145
  5. pdflinkcheck/{analyze_pypdf.py → analysis_pypdf.py} +67 -37
  6. pdflinkcheck/cli.py +111 -116
  7. pdflinkcheck/data/I Have Questions.md +51 -0
  8. pdflinkcheck/data/LICENSE +20 -654
  9. pdflinkcheck/data/README.md +65 -67
  10. pdflinkcheck/data/icons/BoxArt-1080x1080.png +0 -0
  11. pdflinkcheck/data/icons/Logo-150x150.png +0 -0
  12. pdflinkcheck/data/icons/Logo-300x300.png +0 -0
  13. pdflinkcheck/data/icons/Logo-71x71.png +0 -0
  14. pdflinkcheck/data/icons/PosterArt-720x1080.png +0 -0
  15. pdflinkcheck/data/icons/SmallLogo-44x44.png +0 -0
  16. pdflinkcheck/data/icons/SplashScreen-620x300.png +0 -0
  17. pdflinkcheck/data/icons/StoreLogo-50x50.png +0 -0
  18. pdflinkcheck/data/icons/WideLogo-310x150.png +0 -0
  19. pdflinkcheck/data/icons/red_pdf_512px.ico +0 -0
  20. pdflinkcheck/data/pyproject.toml +25 -37
  21. pdflinkcheck/data/themes/forest/forest-dark/border-accent-hover.png +0 -0
  22. pdflinkcheck/data/themes/forest/forest-dark/border-accent.png +0 -0
  23. pdflinkcheck/data/themes/forest/forest-dark/border-basic.png +0 -0
  24. pdflinkcheck/data/themes/forest/forest-dark/border-hover.png +0 -0
  25. pdflinkcheck/data/themes/forest/forest-dark/border-invalid.png +0 -0
  26. pdflinkcheck/data/themes/forest/forest-dark/card.png +0 -0
  27. pdflinkcheck/data/themes/forest/forest-dark/check-accent.png +0 -0
  28. pdflinkcheck/data/themes/forest/forest-dark/check-basic.png +0 -0
  29. pdflinkcheck/data/themes/forest/forest-dark/check-hover.png +0 -0
  30. pdflinkcheck/data/themes/forest/forest-dark/check-tri-accent.png +0 -0
  31. pdflinkcheck/data/themes/forest/forest-dark/check-tri-basic.png +0 -0
  32. pdflinkcheck/data/themes/forest/forest-dark/check-tri-hover.png +0 -0
  33. pdflinkcheck/data/themes/forest/forest-dark/check-unsel-accent.png +0 -0
  34. pdflinkcheck/data/themes/forest/forest-dark/check-unsel-basic.png +0 -0
  35. pdflinkcheck/data/themes/forest/forest-dark/check-unsel-hover.png +0 -0
  36. pdflinkcheck/data/themes/forest/forest-dark/check-unsel-pressed.png +0 -0
  37. pdflinkcheck/data/themes/forest/forest-dark/combo-button-basic.png +0 -0
  38. pdflinkcheck/data/themes/forest/forest-dark/combo-button-focus.png +0 -0
  39. pdflinkcheck/data/themes/forest/forest-dark/combo-button-hover.png +0 -0
  40. pdflinkcheck/data/themes/forest/forest-dark/down.png +0 -0
  41. pdflinkcheck/data/themes/forest/forest-dark/empty.png +0 -0
  42. pdflinkcheck/data/themes/forest/forest-dark/hor-accent.png +0 -0
  43. pdflinkcheck/data/themes/forest/forest-dark/hor-basic.png +0 -0
  44. pdflinkcheck/data/themes/forest/forest-dark/hor-hover.png +0 -0
  45. pdflinkcheck/data/themes/forest/forest-dark/notebook.png +0 -0
  46. pdflinkcheck/data/themes/forest/forest-dark/off-accent.png +0 -0
  47. pdflinkcheck/data/themes/forest/forest-dark/off-basic.png +0 -0
  48. pdflinkcheck/data/themes/forest/forest-dark/off-hover.png +0 -0
  49. pdflinkcheck/data/themes/forest/forest-dark/on-accent.png +0 -0
  50. pdflinkcheck/data/themes/forest/forest-dark/on-basic.png +0 -0
  51. pdflinkcheck/data/themes/forest/forest-dark/on-hover.png +0 -0
  52. pdflinkcheck/data/themes/forest/forest-dark/radio-accent.png +0 -0
  53. pdflinkcheck/data/themes/forest/forest-dark/radio-basic.png +0 -0
  54. pdflinkcheck/data/themes/forest/forest-dark/radio-hover.png +0 -0
  55. pdflinkcheck/data/themes/forest/forest-dark/radio-tri-accent.png +0 -0
  56. pdflinkcheck/data/themes/forest/forest-dark/radio-tri-basic.png +0 -0
  57. pdflinkcheck/data/themes/forest/forest-dark/radio-tri-hover.png +0 -0
  58. pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-accent.png +0 -0
  59. pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-basic.png +0 -0
  60. pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-hover.png +0 -0
  61. pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-pressed.png +0 -0
  62. pdflinkcheck/data/themes/forest/forest-dark/rect-accent-hover.png +0 -0
  63. pdflinkcheck/data/themes/forest/forest-dark/rect-accent.png +0 -0
  64. pdflinkcheck/data/themes/forest/forest-dark/rect-basic.png +0 -0
  65. pdflinkcheck/data/themes/forest/forest-dark/rect-hover.png +0 -0
  66. pdflinkcheck/data/themes/forest/forest-dark/right.png +0 -0
  67. pdflinkcheck/data/themes/forest/forest-dark/scale-hor.png +0 -0
  68. pdflinkcheck/data/themes/forest/forest-dark/scale-vert.png +0 -0
  69. pdflinkcheck/data/themes/forest/forest-dark/separator.png +0 -0
  70. pdflinkcheck/data/themes/forest/forest-dark/sizegrip.png +0 -0
  71. pdflinkcheck/data/themes/forest/forest-dark/spin-button-down-basic.png +0 -0
  72. pdflinkcheck/data/themes/forest/forest-dark/spin-button-down-focus.png +0 -0
  73. pdflinkcheck/data/themes/forest/forest-dark/spin-button-up.png +0 -0
  74. pdflinkcheck/data/themes/forest/forest-dark/tab-accent.png +0 -0
  75. pdflinkcheck/data/themes/forest/forest-dark/tab-basic.png +0 -0
  76. pdflinkcheck/data/themes/forest/forest-dark/tab-hover.png +0 -0
  77. pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-accent.png +0 -0
  78. pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-basic.png +0 -0
  79. pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-hover.png +0 -0
  80. pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-accent.png +0 -0
  81. pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-basic.png +0 -0
  82. pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-hover.png +0 -0
  83. pdflinkcheck/data/themes/forest/forest-dark/tree-basic.png +0 -0
  84. pdflinkcheck/data/themes/forest/forest-dark/tree-pressed.png +0 -0
  85. pdflinkcheck/data/themes/forest/forest-dark/up.png +0 -0
  86. pdflinkcheck/data/themes/forest/forest-dark/vert-accent.png +0 -0
  87. pdflinkcheck/data/themes/forest/forest-dark/vert-basic.png +0 -0
  88. pdflinkcheck/data/themes/forest/forest-dark/vert-hover.png +0 -0
  89. pdflinkcheck/data/themes/forest/forest-dark.tcl +536 -0
  90. pdflinkcheck/data/themes/forest/forest-light/border-accent-hover.png +0 -0
  91. pdflinkcheck/data/themes/forest/forest-light/border-accent.png +0 -0
  92. pdflinkcheck/data/themes/forest/forest-light/border-basic.png +0 -0
  93. pdflinkcheck/data/themes/forest/forest-light/border-hover.png +0 -0
  94. pdflinkcheck/data/themes/forest/forest-light/border-invalid.png +0 -0
  95. pdflinkcheck/data/themes/forest/forest-light/card.png +0 -0
  96. pdflinkcheck/data/themes/forest/forest-light/check-accent.png +0 -0
  97. pdflinkcheck/data/themes/forest/forest-light/check-basic.png +0 -0
  98. pdflinkcheck/data/themes/forest/forest-light/check-hover.png +0 -0
  99. pdflinkcheck/data/themes/forest/forest-light/check-tri-accent.png +0 -0
  100. pdflinkcheck/data/themes/forest/forest-light/check-tri-basic.png +0 -0
  101. pdflinkcheck/data/themes/forest/forest-light/check-tri-hover.png +0 -0
  102. pdflinkcheck/data/themes/forest/forest-light/check-unsel-accent.png +0 -0
  103. pdflinkcheck/data/themes/forest/forest-light/check-unsel-basic.png +0 -0
  104. pdflinkcheck/data/themes/forest/forest-light/check-unsel-hover.png +0 -0
  105. pdflinkcheck/data/themes/forest/forest-light/check-unsel-pressed.png +0 -0
  106. pdflinkcheck/data/themes/forest/forest-light/combo-button-basic.png +0 -0
  107. pdflinkcheck/data/themes/forest/forest-light/combo-button-focus.png +0 -0
  108. pdflinkcheck/data/themes/forest/forest-light/combo-button-hover.png +0 -0
  109. pdflinkcheck/data/themes/forest/forest-light/down-focus.png +0 -0
  110. pdflinkcheck/data/themes/forest/forest-light/down.png +0 -0
  111. pdflinkcheck/data/themes/forest/forest-light/empty.png +0 -0
  112. pdflinkcheck/data/themes/forest/forest-light/hor-accent.png +0 -0
  113. pdflinkcheck/data/themes/forest/forest-light/hor-basic.png +0 -0
  114. pdflinkcheck/data/themes/forest/forest-light/hor-hover.png +0 -0
  115. pdflinkcheck/data/themes/forest/forest-light/notebook.png +0 -0
  116. pdflinkcheck/data/themes/forest/forest-light/off-accent.png +0 -0
  117. pdflinkcheck/data/themes/forest/forest-light/off-basic.png +0 -0
  118. pdflinkcheck/data/themes/forest/forest-light/off-hover.png +0 -0
  119. pdflinkcheck/data/themes/forest/forest-light/on-accent.png +0 -0
  120. pdflinkcheck/data/themes/forest/forest-light/on-basic.png +0 -0
  121. pdflinkcheck/data/themes/forest/forest-light/on-hover.png +0 -0
  122. pdflinkcheck/data/themes/forest/forest-light/radio-accent.png +0 -0
  123. pdflinkcheck/data/themes/forest/forest-light/radio-basic.png +0 -0
  124. pdflinkcheck/data/themes/forest/forest-light/radio-hover.png +0 -0
  125. pdflinkcheck/data/themes/forest/forest-light/radio-tri-accent.png +0 -0
  126. pdflinkcheck/data/themes/forest/forest-light/radio-tri-basic.png +0 -0
  127. pdflinkcheck/data/themes/forest/forest-light/radio-tri-hover.png +0 -0
  128. pdflinkcheck/data/themes/forest/forest-light/radio-unsel-accent.png +0 -0
  129. pdflinkcheck/data/themes/forest/forest-light/radio-unsel-basic.png +0 -0
  130. pdflinkcheck/data/themes/forest/forest-light/radio-unsel-hover.png +0 -0
  131. pdflinkcheck/data/themes/forest/forest-light/radio-unsel-pressed.png +0 -0
  132. pdflinkcheck/data/themes/forest/forest-light/rect-accent-hover.png +0 -0
  133. pdflinkcheck/data/themes/forest/forest-light/rect-accent.png +0 -0
  134. pdflinkcheck/data/themes/forest/forest-light/rect-basic.png +0 -0
  135. pdflinkcheck/data/themes/forest/forest-light/rect-hover.png +0 -0
  136. pdflinkcheck/data/themes/forest/forest-light/right-focus.png +0 -0
  137. pdflinkcheck/data/themes/forest/forest-light/right.png +0 -0
  138. pdflinkcheck/data/themes/forest/forest-light/scale-hor.png +0 -0
  139. pdflinkcheck/data/themes/forest/forest-light/scale-vert.png +0 -0
  140. pdflinkcheck/data/themes/forest/forest-light/separator.png +0 -0
  141. pdflinkcheck/data/themes/forest/forest-light/sizegrip.png +0 -0
  142. pdflinkcheck/data/themes/forest/forest-light/spin-button-down-basic.png +0 -0
  143. pdflinkcheck/data/themes/forest/forest-light/spin-button-down-focus.png +0 -0
  144. pdflinkcheck/data/themes/forest/forest-light/spin-button-up.png +0 -0
  145. pdflinkcheck/data/themes/forest/forest-light/tab-accent.png +0 -0
  146. pdflinkcheck/data/themes/forest/forest-light/tab-basic.png +0 -0
  147. pdflinkcheck/data/themes/forest/forest-light/tab-hover.png +0 -0
  148. pdflinkcheck/data/themes/forest/forest-light/thumb-hor-accent.png +0 -0
  149. pdflinkcheck/data/themes/forest/forest-light/thumb-hor-basic.png +0 -0
  150. pdflinkcheck/data/themes/forest/forest-light/thumb-hor-hover.png +0 -0
  151. pdflinkcheck/data/themes/forest/forest-light/thumb-vert-accent.png +0 -0
  152. pdflinkcheck/data/themes/forest/forest-light/thumb-vert-basic.png +0 -0
  153. pdflinkcheck/data/themes/forest/forest-light/thumb-vert-hover.png +0 -0
  154. pdflinkcheck/data/themes/forest/forest-light/tree-basic.png +0 -0
  155. pdflinkcheck/data/themes/forest/forest-light/tree-pressed.png +0 -0
  156. pdflinkcheck/data/themes/forest/forest-light/up.png +0 -0
  157. pdflinkcheck/data/themes/forest/forest-light/vert-accent.png +0 -0
  158. pdflinkcheck/data/themes/forest/forest-light/vert-basic.png +0 -0
  159. pdflinkcheck/data/themes/forest/forest-light/vert-hover.png +0 -0
  160. pdflinkcheck/data/themes/forest/forest-light.tcl +544 -0
  161. pdflinkcheck/datacopy.py +18 -1
  162. pdflinkcheck/dev.py +12 -25
  163. pdflinkcheck/environment.py +76 -0
  164. pdflinkcheck/gui.py +366 -457
  165. pdflinkcheck/helpers.py +88 -0
  166. pdflinkcheck/io.py +27 -23
  167. pdflinkcheck/report.py +692 -121
  168. pdflinkcheck/security.py +189 -0
  169. pdflinkcheck/splash.py +38 -0
  170. pdflinkcheck/stdlib_server.py +14 -20
  171. pdflinkcheck/stdlib_server_alt.py +571 -0
  172. pdflinkcheck/tk_utils.py +188 -0
  173. pdflinkcheck/update_msix_version.py +49 -0
  174. pdflinkcheck/validate.py +129 -218
  175. pdflinkcheck/version_info.py +6 -3
  176. {pdflinkcheck-1.1.73.dist-info → pdflinkcheck-1.2.29.dist-info}/METADATA +84 -81
  177. pdflinkcheck-1.2.29.dist-info/RECORD +183 -0
  178. pdflinkcheck-1.2.29.dist-info/WHEEL +5 -0
  179. {pdflinkcheck-1.1.73.dist-info → pdflinkcheck-1.2.29.dist-info}/entry_points.txt +0 -1
  180. pdflinkcheck-1.2.29.dist-info/licenses/LICENSE +27 -0
  181. pdflinkcheck-1.2.29.dist-info/licenses/LICENSE-MIT +9 -0
  182. pdflinkcheck-1.2.29.dist-info/top_level.txt +1 -0
  183. pdflinkcheck/analyze_pypdf_v2.py +0 -218
  184. pdflinkcheck-1.1.73.dist-info/RECORD +0 -21
  185. pdflinkcheck-1.1.73.dist-info/WHEEL +0 -4
  186. /pdflinkcheck-1.1.73.dist-info/licenses/LICENSE → /pdflinkcheck-1.2.29.dist-info/licenses/LICENSE-AGPL3 +0 -0
@@ -1,18 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pdflinkcheck
3
- Version: 1.1.73
3
+ Version: 1.2.29
4
4
  Summary: A purpose-built PDF link analysis and reporting tool with GUI and CLI.
5
- Author: George Clayton Bennett
6
5
  Author-email: George Clayton Bennett <george.bennett@memphistn.gov>
7
- License-File: LICENSE
6
+ Maintainer-email: George Clayton Bennett <george.bennett@memphistn.gov>
7
+ License-Expression: MIT AND AGPL-3.0-or-later
8
+ Project-URL: Homepage, https://github.com/city-of-memphis-wastewater/pdflinkcheck
9
+ Project-URL: Repository, https://github.com/city-of-memphis-wastewater/pdflinkcheck
8
10
  Classifier: Programming Language :: Python :: 3
9
11
  Classifier: Programming Language :: Python :: 3 :: Only
12
+ Classifier: Programming Language :: Python :: 3.9
10
13
  Classifier: Programming Language :: Python :: 3.10
11
14
  Classifier: Programming Language :: Python :: 3.11
12
15
  Classifier: Programming Language :: Python :: 3.12
13
16
  Classifier: Programming Language :: Python :: 3.13
14
17
  Classifier: Programming Language :: Python :: 3.14
15
- Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
16
18
  Classifier: Operating System :: OS Independent
17
19
  Classifier: Intended Audience :: End Users/Desktop
18
20
  Classifier: Intended Audience :: Developers
@@ -27,20 +29,23 @@ Classifier: Environment :: MacOS X
27
29
  Classifier: Environment :: Win32 (MS Windows)
28
30
  Classifier: Typing :: Typed
29
31
  Classifier: Development Status :: 4 - Beta
30
- Requires-Dist: pyhabitat>=1.0.53
32
+ Requires-Python: >=3.9
33
+ Description-Content-Type: text/markdown
34
+ License-File: LICENSE
35
+ License-File: LICENSE-MIT
36
+ License-File: LICENSE-AGPL3
37
+ Requires-Dist: pyhabitat>=1.1.5
31
38
  Requires-Dist: pypdf>=6.4.2
32
39
  Requires-Dist: rich>=14.2.0
33
40
  Requires-Dist: typer>=0.20.0
34
- Requires-Dist: pymupdf>=1.26.7 ; extra == 'full'
35
- Requires-Dist: sv-ttk>=2.6.1 ; extra == 'gui'
36
- Maintainer: George Clayton Bennett
37
- Maintainer-email: George Clayton Bennett <george.bennett@memphistn.gov>
38
- Requires-Python: >=3.10
39
- Project-URL: Homepage, https://github.com/city-of-memphis-wastewater/pdflinkcheck
40
- Project-URL: Repository, https://github.com/city-of-memphis-wastewater/pdflinkcheck
41
+ Provides-Extra: mupdf
42
+ Requires-Dist: pymupdf<2.0.0,>=1.24.0; extra == "mupdf"
43
+ Provides-Extra: pdfium
44
+ Requires-Dist: pypdfium2<6.0.0,>=5.2.0; extra == "pdfium"
41
45
  Provides-Extra: full
42
- Provides-Extra: gui
43
- Description-Content-Type: text/markdown
46
+ Requires-Dist: pymupdf<2.0.0,>=1.24.0; extra == "full"
47
+ Requires-Dist: pypdfium2<6.0.0,>=5.2.0; extra == "full"
48
+ Dynamic: license-file
44
49
 
45
50
  # pdflinkcheck
46
51
 
@@ -48,7 +53,7 @@ A purpose-built tool for comprehensive analysis of hyperlinks and GoTo links wit
48
53
 
49
54
  -----
50
55
 
51
- ![Screenshot of the pdflinkcheck GUI](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_gui_v1.1.58.png)
56
+ ![Screenshot of the pdflinkcheck GUI](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_gui_v1.1.97.png)
52
57
 
53
58
  -----
54
59
 
@@ -63,7 +68,7 @@ For the most user-typical experience, download the single-file binary matching y
63
68
  | **File Type** | **Primary Use Case** | **Recommended Launch Method** |
64
69
  | :--- | :--- | :--- |
65
70
  | **Executable (.exe, .elf)** | **GUI** | Double-click the file. |
66
- | **PYZ (Python Zip App)** | **CLI** or **GUI** | Run using your system's `python` command: `python pdflinkcheck-VERSION.pyz --help` |
71
+ | **PYZ (Python Zip App)** | **CLI** or **GUI** | Run using your system's `python` command: `python pdflinkcheck-VERSION.pyz --help` |
67
72
 
68
73
  ### Installation via pipx
69
74
 
@@ -86,20 +91,9 @@ The tool can be run as simple cross-platform graphical interface (Tkinter).
86
91
 
87
92
  ### Launching the GUI
88
93
 
89
- There are three ways to launch the GUI interface:
90
-
91
- 1. **Implicit Launch:** Run the main command with no arguments, subcommands, or flags (`pdflinkcheck`).
94
+ Ways to launch the GUI interface:
95
+ 1. **Implicit Launch:** Run the tool or file with no arguments, subcommands, or flags. (Note: PyInstaller builds use the --windowed (or -noconsole) flag, except for on Termux.)
92
96
  2. **Explicit Command:** Use the dedicated GUI subcommand (`pdflinkcheck gui`).
93
- 3. **Binary Double-Click:**
94
- * **Windows:** Double-click the `pdflinkcheck-VERSION-gui.bat` file.
95
- * **macOS/Linux:** Double-click the downloaded `.pyz` or `.elf` file.
96
-
97
- ### Planned GUI Updates
98
-
99
- We are actively working on the following enhancements:
100
-
101
- * **Report Export:** Functionality to export the full analysis report to a plain text file.
102
- * **License Visibility:** A dedicated "License Info" button within the GUI to display the terms of the AGPLv3+ license.
103
97
 
104
98
  -----
105
99
 
@@ -107,20 +101,30 @@ We are actively working on the following enhancements:
107
101
 
108
102
  The core functionality is accessed via the `analyze` command.
109
103
 
110
- `DEV_TYPER_HELP_TREE=1 pdflinkcheck help-tree`:
111
- ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.1.58_tree_help.png)
112
-
113
104
  `pdflinkcheck --help`:
114
- ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.1.58.png)
105
+ ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.1.97.png)
106
+
107
+
108
+ See the Help Tree by unlocking the help-tree CLI command, using the DEV_TYPER_HELP_TREE env var.
109
+
110
+ ```
111
+ DEV_TYPER_HELP_TREE=1 pdflinkcheck help-tree` # bash
112
+ $env:DEV_TYPER_HELP_TREE = "1"; pdflinkcheck help-tree` # PowerShell
113
+ ```
114
+
115
+ ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.1.97_tree_help.png)
116
+
115
117
 
116
118
 
117
119
  ### Available Commands
118
120
 
119
121
  |**Command**|**Description**|
120
122
  |---|---|
121
- |`pdflinkcheck analyze`|Analyzes a PDF file for links |
123
+ |`pdflinkcheck analyze`|Analyzes a PDF file for links and validates their reasonableness.|
122
124
  |`pdflinkcheck gui`|Explicitly launch the Graphical User Interface.|
123
125
  |`pdflinkcheck docs`|Access documentation, including the README and AGPLv3+ license.|
126
+ |`pdflinkcheck serve`|Serve a basic local web app which uses only the Python standard library.|
127
+ |`pdflinkcheck tools`|Access additional tools, like `--clear-cache`.|
124
128
 
125
129
  ### `analyze` Command Options
126
130
 
@@ -129,7 +133,6 @@ The core functionality is accessed via the `analyze` command.
129
133
  |`<PDF_PATH>`|**Required.** The path to the PDF file to analyze.|N/A|
130
134
  |`--pdf-library / -p`|Select engine: `pymupdf` or `pypdf`.|`pypdf`|
131
135
  |`--export-format / -e`|Export to `JSON`, `TXT`, or `None` to suppress file output.|`JSON`|
132
- |`--max-links / -m`|Maximum links to display per section. Use `0` for all.|`0`|
133
136
 
134
137
  ### `gui` Command Options
135
138
 
@@ -143,9 +146,6 @@ The core functionality is accessed via the `analyze` command.
143
146
  # Analyze a document, show all links, and save the report as JSON and TXT
144
147
  pdflinkcheck analyze "TE Maxson WWTF O&M Manual.pdf" --export-format JSON,TXT
145
148
 
146
- # Analyze a document but keep the print block short, showing only the first 10 links for each type
147
- pdflinkcheck analyze "TE Maxson WWTF O&M Manual.pdf" --max-links 10
148
-
149
149
  # Show the GUI for only a moment, like in a build check
150
150
  pdflinkcheck gui --auto-close 3000
151
151
 
@@ -157,22 +157,23 @@ pdflinkcheck docs --license --readme
157
157
 
158
158
  ## 📦 Library Access (Advanced)
159
159
 
160
- For developers importing `pdflinkcheck` into other Python projects, the core analysis functions are exposed directly in the root namespace:
160
+ For developers importing `pdflinkcheck` into other Python projects, the core analysis functions are exposed directly in the root namespace. The various `analysis_pdf_*` functions each use a different library to extract the target PDF's internal TOC, external links, and metadata.
161
161
 
162
- |**Function**|**Description**|
163
- |---|---|
164
- |`run_report()`|**(Primary function)** Performs the full analysis, prints to console, and handles file export.|
165
- |`extract_links_pynupdf()`|Function to retrieve all explicit links (URIs, GoTo, etc.) from a PDF path.|
166
- |`extract_toc_pymupdf()`|Function to extract the PDF's internal Table of Contents (bookmarks/outline).|
167
- |`extract_links_pynupdf()`|Function to retrieve all explicit links (URIs, GoTo, etc.) from a PDF path, using the pypdf library.|
168
- |`extract_toc_pymupdf()`|Function to extract the PDF's internal Table of Contents (bookmarks/outline), using the pypdf library.|
162
+ |**Function**|**Library**|**Description**|
163
+ |---|---|---|
164
+ |`run_report()`|pdflinkcheck | **(Primary function)** Performs the full analysis, prints to console, and handles file export.|
165
+ |`analyze_pdf_pdfium()`| pypdfium2 | Fast, ~10 mb, Permissively licensed |
166
+ |`analyze_pdf_pymupdf()`| PyMuPDF | Fast, ~30 mb, AGPL3+ licensed |
167
+ |`analyze_pdf_pypdf()`| pypdf library | Slow, ~2 mb, Permissively licensed |
169
168
 
170
169
  Exanple:
171
170
 
172
171
  ```python
173
- from pdflinkcheck.report import run_report
174
- from pdflinkcheck.analysis_pymupdf import extract_links_pymupdf, extract_toc_pymupdf 130 from pdflinkcheck.analysis_pymupdf import extract_links_pynupdf, extract_toc_pymupdf
175
- from pdflinkcheck.analysis_pypdf import extract_links_pypdf, extract_toc_pypdf
172
+ from pdflinkcheck import ( run_report,
173
+ analyze_pdf_pymupdf,
174
+ analyze_pdf_pypdf,
175
+ analyze_pdf_pdfium,
176
+ )
176
177
 
177
178
  file = "document1.pdf"
178
179
  report_data = run_report(file)
@@ -232,22 +233,34 @@ This `help-tree` feature has not yet been submitted for inclusion into Typer.
232
233
 
233
234
  ## ⚠️ Compatibility Notes
234
235
 
235
- #### Termux Compatibility as a Key Goal
236
+ ### Termux Compatibility as a Key Goal
236
237
  A key goal of City-of-Memphis-Wastewater is to release all software as Termux-compatible.
237
238
 
238
- Termux compatibility is important in the modern age as Android devices are common among technicians, field engineers, and maintenace staff.
239
+ Termux compatibility is important in the modern age, because Android devices are common among technicians, field engineers, and maintenace staff.
239
240
  Android is the most common operating system in the Global South.
240
241
  We aim to produce stable software that can do the most possible good.
241
242
 
242
- While using `PyMuPDF` in Python dependency resolution on Termux simply isn't possible, we are proud to have achieved a work-around by implementing a parallel solution in `pypdf`!
243
- Now, there is PDF Engine selection in both the CLI and the GUI.
244
- `pypdf` is the default in pdflinkcheck.report.run_report(); PyMuPDF can be explicitly requested in the CLI and is the default in the TKinter GUI.
243
+ Now `pdflinkcheck` can run on Termux by using the `pypdf` engine and the `pdfium` engine.
244
+ Benefits:
245
+ - `pypdf`-only artifacts, to reduce size to about 6% compared to artifacts that include `PyMuPDF`.
246
+ - Web-stack GUI as an alternative to the Tkinter GUI, which can be run locally on Termux or as a web app.
247
+
245
248
 
246
- Now that `pdflinkcheck` can run on Termux, we may find a work-around and be able to drop the PyMuPDF dependency.
247
- - Build `pypdf`-only artifacts, to reduce size.
248
- - Build a web-stack GUI as an alternative to the Tkinter GUI, to be compatible with Termux.
249
+ ### PDF Library Selection
250
+ At long last, `PyMuPDF` is an optional dependency. All testing comparing `pypdf` and `PyMuPDF` has shown identical validation performance. However `PyMuPDF` is much faster. The benfit of `pypdf` is small size of packages and cross-platform compatibility. We have recently added a PDFium option, which circumvents the AGPL3+.
249
251
 
250
- Because it works, we plan to keep the `PyMuPDF` portion of the codebase.
252
+ Expecte that all binaries and artifacts contain PyMuPDF, unlss they are built on Android. The GUI and CLI interfaces both allow selection of the library; if PyMuPDF is selected but is not available, the user will be warned.
253
+
254
+ To install the complete version use one of these options:
255
+
256
+ ```bash
257
+ pip install "pdflinkcheck[mupdf]"
258
+ pipx install "pdflinkcheck[pdfium]"
259
+ uv tool install "pdflinkcheck[pdfium]"
260
+ uv add "pdflinkcheck[pdfium]"
261
+ ```
262
+
263
+ ---
251
264
 
252
265
  ### Document Compatibility:
253
266
  Not all PDF files can be processed successfully. This tool is designed primarily for digitally generated (vector-based) PDFs.
@@ -259,22 +272,6 @@ Processing may fail or yield incomplete results for:
259
272
 
260
273
  -----
261
274
 
262
- ## PDF Library Selection
263
- At long last, `PyMuPDF` is an optional dependency. The default is `pypdf`. All testing has shown identical performance, though the `analyze_pymupdf.py` is faster and more direct and robust than `analyze_pypdf.py`, which requires a lot of intentional parsing.
264
-
265
- Binaries and artifacts are expected to contain PyMuPDF, unless they are build on Android. The GUI and CLI interfaces both allow selection of the library; if PyMuPDF is selected but is not available, the user will be warned.
266
-
267
- To install the complete version use one of these options:
268
-
269
- ```bash
270
- pip install "pdflinkcheck[full]"
271
- pipx install "pdflinkcheck[full]"
272
- uv tool install "pdflinkcheck[full]"
273
- uv add "pdflinkcheck[full]"
274
- ```
275
-
276
- -----
277
-
278
275
  ## Run from Source (Developers)
279
276
 
280
277
  ```bash
@@ -301,22 +298,28 @@ uv run python -m pdflinkcheck.stdlib_server
301
298
 
302
299
  ## 📜 License Implications (AGPLv3+)
303
300
 
304
- **`pdflinkcheck` is licensed under the `GNU Affero General Public License` version 3 or later (`AGPLv3+`).**
305
-
306
- The `AGPL3+` is required for portions of this codebase because `pdflinkcheck` uses `PyMuPDF`, which is licensed under the `AGPL3`.
307
301
 
308
- To stay in compliance, the AGPL3 license text is readily available in the CLI and the GUI, and it is included in the build artifacts.
309
- The `AGPL3` appears as the primary license file in the source code. While this infers that the entire project is AGPL3-licensed, this is not true - portions of the codebase are MIT-licensed.
302
+ The `AGPL3-or-later` is required for binaries of `pdflinkcheck` which include `PyMuPDF`, which is licensed under the `AGPL3`.
303
+ The source code itself for `pdflinkcheck` is licensed under the `MIT`.
310
304
 
311
- This license has significant implications for **distribution and network use**, particularly for organizations:
305
+ The AGPL3-or-later license has significant implications for **distribution and network use**, particularly for organizations:
312
306
 
313
307
  * **Source Code Provision:** If you distribute this tool (modified or unmodified) to anyone, you **must** provide the full source code under the same license.
314
308
  * **Network Interaction (Affero Clause):** If you modify this tool and make the modified version available to users over a computer network (e.g., as a web service or backend), you **must** also offer the source code to those network users.
315
309
 
316
310
  > **Before deploying or modifying this tool for organizational use, especially for internal web services or distribution, please ensure compliance with the AGPLv3+ terms.**
317
311
 
312
+ Because the AGPLv3 is a strong copyleft license, any version of `pdflinkcheck` that includes AGPL‑licensed components (such as `PyMuPDF`) must be distributed as a whole under AGPLv3+. This means that for those versions, anyone who distributes the application — or makes a modified version available over a network — must also provide the complete corresponding source code under the same terms.
313
+
314
+ The source code of pdflinkcheck itself remains licensed under the **MIT License**; only the distributed binary becomes AGPL‑licensed when PyMuPDF is included.
315
+
316
+
318
317
  Links:
319
318
  - Source code: https://github.com/City-of-Memphis-Wastewater/pdflinkcheck/
320
- - Official AGPLv3 Text (FSF): https://www.gnu.org/licenses/agpl-3.0.html
319
+ - PyMuPDF source code: https://github.com/pymupdf/PyMuPDF/
320
+ - pypdfium2 source code: https://github.com/pypdfium2-team/pypdfium2
321
+ - pypdf source code: https://github.com/py-pdf/pypdf/
322
+ - AGPLv3 text (FSF): https://www.gnu.org/licenses/agpl-3.0.html
323
+ - MIT License text: https://opensource.org/license/mit
321
324
 
322
325
  Copyright © 2025 George Clayton Bennett
@@ -0,0 +1,183 @@
1
+ pdflinkcheck/__init__.py,sha256=HOHHgzLwn3K_879klj4KiOdhyaFskcZFwKtX5l5XDX4,4441
2
+ pdflinkcheck/__main__.py,sha256=o2FpnQjrUbKe3oCt2LiSYsvEUfCjLSTPkxeNw9Oe2Hc,137
3
+ pdflinkcheck/analysis_pdfium.py,sha256=yGidq3xP9GZEZ9K0RBStNCMhq9k48PVbNQ0moMWbsCY,5077
4
+ pdflinkcheck/analysis_pymupdf.py,sha256=wY9V8NHm3o0puJ1pbZb4rfmknthshOXMqfyv2ex9S7E,10620
5
+ pdflinkcheck/analysis_pypdf.py,sha256=Av8FY05HSdLu7OhsilTTAYZT5BCBxI_dlAzRBlZnDXs,7481
6
+ pdflinkcheck/cli.py,sha256=n-uXUdUvG4KCJFRMGvmY95FeszOuwDZOsqvIgClKd7w,13365
7
+ pdflinkcheck/datacopy.py,sha256=jgVNzHwHsVp0L3fXJP3rR02CUQR96E3fGVvGWz9ZF44,3052
8
+ pdflinkcheck/dev.py,sha256=T6KlZYeC8yg61SshSRVD0Ja2VvrhQCIXaXjBIWYd4h4,3928
9
+ pdflinkcheck/environment.py,sha256=cz6J7ymfs3rnsgPucr7Hd5U9My5lkKQ2VPgPFPrLtIY,2617
10
+ pdflinkcheck/gui.py,sha256=aueTrjKe9mZPyJmpRTdBUeNB5kHfWIVjD7puZ6Q6Y9s,19918
11
+ pdflinkcheck/helpers.py,sha256=oDYm1p9cswee6DrJFhWfs3rpQXIFcVjfqmV8ZB4QcrA,3780
12
+ pdflinkcheck/io.py,sha256=pZPmzEMHiuqA0bPp-oPjlBNkjA996gfuZ4NZBH-8Eio,7980
13
+ pdflinkcheck/report.py,sha256=flVscJ-MMnaw4U1-woFy9dUKMjA3KpSs8gRegS7eVZY,33591
14
+ pdflinkcheck/security.py,sha256=U6U3_3utDg4lzM668c6OzDVujoo6EauHq1-JElU9_Nc,6157
15
+ pdflinkcheck/splash.py,sha256=u_2l6LpFpjTJianNiyY8VBAuW7bWPfq4qsKhPWRid48,1203
16
+ pdflinkcheck/stdlib_server.py,sha256=sKKgeHfFYlW5yAoXy4iDgMzb4Ho_rBV1OPHgS_DWZZ0,5940
17
+ pdflinkcheck/stdlib_server_alt.py,sha256=ixpBSd95e2a9dKE38FOCM8EtulVkpUqLWWa4oAAN6YY,16322
18
+ pdflinkcheck/tk_utils.py,sha256=8Y8oH-I9WNWUPUyrHlWG-GZacrQ_hn3qbZWzfN08pko,6795
19
+ pdflinkcheck/update_msix_version.py,sha256=RMxhpQOiieQFUF_SyCb7a5UpYF792nDgsHAP7bUAwo8,1629
20
+ pdflinkcheck/validate.py,sha256=H2bZopzcb5KPqdkahPT8Cg58WzSIQwdunT92JnXvdJA,11914
21
+ pdflinkcheck/version_info.py,sha256=h47z3TRAGXiahiPyBH2MqOXUO7x3c-iwvHV-wB_b2P0,3296
22
+ pdflinkcheck/data/I Have Questions.md,sha256=lurBwKxUijxysq5qsUrLgzFpaSrZwe86KjbPMwCofvY,3152
23
+ pdflinkcheck/data/LICENSE,sha256=npi0VqlkL0AlE0FsGEIOXxMqXlmH4toZfBHesJpP0lA,1866
24
+ pdflinkcheck/data/README.md,sha256=ikWkKpHkkE2cC13St6fyKSxGs9JQ05QmLzOUTIPzUOg,11235
25
+ pdflinkcheck/data/pyproject.toml,sha256=8IGKmhfhdqxh-_mmVEg9_rTaxw_oQ8H9JL-zfJe2pOE,2732
26
+ pdflinkcheck/data/icons/BoxArt-1080x1080.png,sha256=ifiadgqnq-23heD9_jEciuR1fOm-iVW9gU1Uj_2TRUA,140431
27
+ pdflinkcheck/data/icons/Logo-150x150.png,sha256=qEjDoeD-fSV5AmcWoYRhs1cD7o95A7ckvqjooxIqrQY,6777
28
+ pdflinkcheck/data/icons/Logo-300x300.png,sha256=o9zzwjFwKh7NVOilcQULMDwOYvy3EL8Afz_JpRtYhes,19479
29
+ pdflinkcheck/data/icons/Logo-71x71.png,sha256=aiLX990eKByKjQqnimNx1vYYVWmLTnFbhOkYfYRUdLM,2269
30
+ pdflinkcheck/data/icons/PosterArt-720x1080.png,sha256=dt7x7IEpxNSL2PrR55SNaPFLrW7G11qfc8yb6R6dL_Y,81882
31
+ pdflinkcheck/data/icons/SmallLogo-44x44.png,sha256=4DSbiMoPw3fxRTYIG-ensr18XD--ptmn6FET0261AI0,1216
32
+ pdflinkcheck/data/icons/SplashScreen-620x300.png,sha256=tc02X1Ykp7LrPrdjASPT6_Jj35xzVZg3v6yOIiZ5LLY,19254
33
+ pdflinkcheck/data/icons/StoreLogo-50x50.png,sha256=9XpM96NWn0p0X5nXlsOdYW2Djbd_n48iK0aWVLcKaM8,1424
34
+ pdflinkcheck/data/icons/WideLogo-310x150.png,sha256=qEjDoeD-fSV5AmcWoYRhs1cD7o95A7ckvqjooxIqrQY,6777
35
+ pdflinkcheck/data/icons/red_pdf_512px.ico,sha256=GxrliQQkb7DbGG3DmAzVpYKjP75C8E6Dixtaw36vH94,67646
36
+ pdflinkcheck/data/themes/forest/forest-dark.tcl,sha256=sMUVZOLAkU9O67IQ8pqfLIXsM_zxYJIVTe6xhqYv0hQ,18926
37
+ pdflinkcheck/data/themes/forest/forest-light.tcl,sha256=_HKSSTECkNYg79m7KLvGugv8dcun2_cqpdr9k88uK9U,19218
38
+ pdflinkcheck/data/themes/forest/forest-dark/border-accent-hover.png,sha256=GUqCh-r5m8S07gf8n9glMVRG4Wjz7Ih_pqz5rc2hA_g,385
39
+ pdflinkcheck/data/themes/forest/forest-dark/border-accent.png,sha256=q4y0SyxR6fuAxgKiFZubGodg72yZ30ZXlS0XZQ1m0Yw,389
40
+ pdflinkcheck/data/themes/forest/forest-dark/border-basic.png,sha256=xZc7CJx8cI4aKQ6HvRW3PJuH5X6WdUwQdOisaHd4nwE,333
41
+ pdflinkcheck/data/themes/forest/forest-dark/border-hover.png,sha256=pNUPuILYKbMCApqV2k-ql3bWV7qlbJRVQo_LG-4RKPM,337
42
+ pdflinkcheck/data/themes/forest/forest-dark/border-invalid.png,sha256=lAjr6mN-rFSobZk-1KS_DdO1zQ2EYHnaEed_u-VrqNs,408
43
+ pdflinkcheck/data/themes/forest/forest-dark/card.png,sha256=z6JvpQOyBDXaJdpscTphHHRM2Hu-tBPfFZIJmeNjbaY,374
44
+ pdflinkcheck/data/themes/forest/forest-dark/check-accent.png,sha256=7p1xqmL0VCRA6Y6XlrTmO-mmaSLEHHGb_rEHTIkWMeU,434
45
+ pdflinkcheck/data/themes/forest/forest-dark/check-basic.png,sha256=iSXBfAPYslvDqwv2v-J92Z7jL32_OJ4r1alikqkDdYY,406
46
+ pdflinkcheck/data/themes/forest/forest-dark/check-hover.png,sha256=6Ez1ZBJXZt539vMv1n5SAD9URw3VkEFoQ4fHOaOQGxs,434
47
+ pdflinkcheck/data/themes/forest/forest-dark/check-tri-accent.png,sha256=8URzJhZuVJ3YcjJs_TXV4gZYzl8hGvt6dQTfvYmOlg4,317
48
+ pdflinkcheck/data/themes/forest/forest-dark/check-tri-basic.png,sha256=qjX4swH4x4xo_27SOfpVXEY458vcwUkD7rxABMNpYgY,300
49
+ pdflinkcheck/data/themes/forest/forest-dark/check-tri-hover.png,sha256=RrAwfhLtBzjRVT8lK3kqKj9FuStnUO_Kc03slf06fts,320
50
+ pdflinkcheck/data/themes/forest/forest-dark/check-unsel-accent.png,sha256=Z9Ig2x_8mhfjKoiyXQJbrF4_Bb9dNbKqHMxyQyzTVTM,346
51
+ pdflinkcheck/data/themes/forest/forest-dark/check-unsel-basic.png,sha256=xZc7CJx8cI4aKQ6HvRW3PJuH5X6WdUwQdOisaHd4nwE,333
52
+ pdflinkcheck/data/themes/forest/forest-dark/check-unsel-hover.png,sha256=IG6BAOLHYMidloXAM_TACpz2Y6zDhgMKf7jWWUT1tjQ,341
53
+ pdflinkcheck/data/themes/forest/forest-dark/check-unsel-pressed.png,sha256=NJmygtixFXqXQaIYg_ToRmMoR1T74lGr24QU_ZAexPg,290
54
+ pdflinkcheck/data/themes/forest/forest-dark/combo-button-basic.png,sha256=rGZ1kUQxMPA0B9d2Ej1TBb09wR36fbOZJX2RXwBniAw,235
55
+ pdflinkcheck/data/themes/forest/forest-dark/combo-button-focus.png,sha256=m8ye5-iX5gMw07fZlJiqsyl3Z5SLmwQCLn4QrMZqeME,245
56
+ pdflinkcheck/data/themes/forest/forest-dark/combo-button-hover.png,sha256=gxLhnF3TsYdQtIE-7ioERD_sOH2E7YoFeAQwFunVFcE,239
57
+ pdflinkcheck/data/themes/forest/forest-dark/down.png,sha256=cbR5A3OUPzSZaKjcivQAoDRrxUcFRFIFNuZwol4dG0Y,251
58
+ pdflinkcheck/data/themes/forest/forest-dark/empty.png,sha256=aAISBZoamEUCCxwm-XVLjE0iquAVx-7ORJMm5_nvwRc,130
59
+ pdflinkcheck/data/themes/forest/forest-dark/hor-accent.png,sha256=FfaTLz2JENw8UDIyAx6ASawaZ6cT_vWUUTEQKQqcuMs,162
60
+ pdflinkcheck/data/themes/forest/forest-dark/hor-basic.png,sha256=cC72R2CFbMBfANPu1lHzHFCegkZay7HSULDOlBLa1Ig,162
61
+ pdflinkcheck/data/themes/forest/forest-dark/hor-hover.png,sha256=8PVOVKxTtgK5SwLmhWY2v4rcuwZX8AVw018zkFa6aKE,162
62
+ pdflinkcheck/data/themes/forest/forest-dark/notebook.png,sha256=RCNRPQHlh1UmhAd8rpxtyufpaE3uovecfk1N4yvY30c,193
63
+ pdflinkcheck/data/themes/forest/forest-dark/off-accent.png,sha256=ci8BrEasefL1gqB8RfsuX2NpW0bq70NcODMDhBEcSGQ,679
64
+ pdflinkcheck/data/themes/forest/forest-dark/off-basic.png,sha256=pXgJZSd0WYS38csH-h7u0L-ERJPgU41_wimcVaBp88Q,640
65
+ pdflinkcheck/data/themes/forest/forest-dark/off-hover.png,sha256=eVI35fG2wek_-Nr6_WFGaBVGBkZdEkcOQiHGE8X4i0s,692
66
+ pdflinkcheck/data/themes/forest/forest-dark/on-accent.png,sha256=w56MZFsZIGHbDb1DTuVZBmZ_zVihwLvG2sAL_TzBuo0,676
67
+ pdflinkcheck/data/themes/forest/forest-dark/on-basic.png,sha256=m7kDducspO0zKJG88w50D3HubgAxNKPsUG-Ni8j2ruM,633
68
+ pdflinkcheck/data/themes/forest/forest-dark/on-hover.png,sha256=uHo8t0tsnPoDYIkIH1OajS3SgMR-NaB8o-6BhcB7Ni0,685
69
+ pdflinkcheck/data/themes/forest/forest-dark/radio-accent.png,sha256=3B6pKIr1W1ROeifzw65p_b8rgIXftKdJgqOUh3zt_9g,565
70
+ pdflinkcheck/data/themes/forest/forest-dark/radio-basic.png,sha256=eG3-kmfppNe-rlEEol4TTPDG8x7gML2v8Ofgy_Odyqg,543
71
+ pdflinkcheck/data/themes/forest/forest-dark/radio-hover.png,sha256=fYwM7nb8hXovpDF58cdDPEc-cAo8erH8nsYN4_iev9o,579
72
+ pdflinkcheck/data/themes/forest/forest-dark/radio-tri-accent.png,sha256=QOz4cS763L08W82v9MqYemdkYEVE2D00j5Hoxu79Esw,465
73
+ pdflinkcheck/data/themes/forest/forest-dark/radio-tri-basic.png,sha256=vmRAQVMj9X8WKYpx3e9xEIPBrtTcCAX5sk4Q0silujs,450
74
+ pdflinkcheck/data/themes/forest/forest-dark/radio-tri-hover.png,sha256=uETadf2n03ToeLbUKC-22owzei4EuoX20cGCwCeZQJw,489
75
+ pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-accent.png,sha256=BrmdahTSZjAi5WdFs56Zcc2pkGJM7j2DEl2bei8_qaA,605
76
+ pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-basic.png,sha256=JkJFOykANfzl5t327tYVB2ERSD_mDf2X8pOu5jjqgso,559
77
+ pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-hover.png,sha256=uRTycnLxYyJGxEtljpPwjscIMZG_-uhCdyBCsy4O-G8,615
78
+ pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-pressed.png,sha256=FLOGh60Aa45GXpOR4Y0QVdsFAaSQO42jO5g_9usEytM,468
79
+ pdflinkcheck/data/themes/forest/forest-dark/rect-accent-hover.png,sha256=NJmygtixFXqXQaIYg_ToRmMoR1T74lGr24QU_ZAexPg,290
80
+ pdflinkcheck/data/themes/forest/forest-dark/rect-accent.png,sha256=-QKhPamOtQ-G1cRHkLRUFjWShW-PQHBGXyTT0Lo0a2g,290
81
+ pdflinkcheck/data/themes/forest/forest-dark/rect-basic.png,sha256=erCpZxB1NeuCbvPamSdcXHgOm4Q-vXEpAnQqxVYx3fM,272
82
+ pdflinkcheck/data/themes/forest/forest-dark/rect-hover.png,sha256=OWRVCGRw-TkbvyeBdV25yJU8lF0eakTqKhAD4Cw50m4,273
83
+ pdflinkcheck/data/themes/forest/forest-dark/right.png,sha256=gGeBhrcz5eDKbp4JF_sI2nV_Z2JH0KpROC0pvE9gwPQ,217
84
+ pdflinkcheck/data/themes/forest/forest-dark/scale-hor.png,sha256=ZWsYQZgMz9tLMyPIutuFtCC7Lw91-Tizh-0ojvQaIAQ,166
85
+ pdflinkcheck/data/themes/forest/forest-dark/scale-vert.png,sha256=C36O8NzM8M2ijOdXRge7yJNJuCWR98QV3h-Sm-gICRA,161
86
+ pdflinkcheck/data/themes/forest/forest-dark/separator.png,sha256=xnkU5obW-GsOmDEyxAUunMatyAWBk_-gCKHvf_gJDDg,128
87
+ pdflinkcheck/data/themes/forest/forest-dark/sizegrip.png,sha256=KK1Wo5pq9KglRswwV0R927TksZBMoIbW4YC3-DFjxx4,459
88
+ pdflinkcheck/data/themes/forest/forest-dark/spin-button-down-basic.png,sha256=PB5BLEMb4lEkUAIyA2Z7ZtFe86YubxbwdLgHiizWe_4,153
89
+ pdflinkcheck/data/themes/forest/forest-dark/spin-button-down-focus.png,sha256=L1evCav2J8rTETD1sNjnfio9PNnAq8fuue8mrol936Q,160
90
+ pdflinkcheck/data/themes/forest/forest-dark/spin-button-up.png,sha256=cbq5WDG_D7loJqjN39kuRUw1drOF2GJW6c7un_hyoRI,222
91
+ pdflinkcheck/data/themes/forest/forest-dark/tab-accent.png,sha256=1TwbrCTWEvpvU02nJeAsq0lL1FwBtGH8yP86h9xvriE,188
92
+ pdflinkcheck/data/themes/forest/forest-dark/tab-basic.png,sha256=tCT68xUQVv-gcJWjPyqo1yWGE8RlsHlxJWNnB2oEZGE,188
93
+ pdflinkcheck/data/themes/forest/forest-dark/tab-hover.png,sha256=NkAC9HSqxoZVWCQQhpAhJ8in_8XXXy1fJ-m7v_yOqXc,188
94
+ pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-accent.png,sha256=n1KRtE4xqrSzot2m-MAYNv8FAU2dHo9JhMYpeDpyoMs,270
95
+ pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-basic.png,sha256=i7hrtjtR-BKuUMXfXnbV-PdZ32y_r9j-VCRLERURrk0,258
96
+ pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-hover.png,sha256=hN5ALMtBjg9iO72yipf_04JAQDgD4oG_nnrNalrZm0g,273
97
+ pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-accent.png,sha256=KxsFFhjYn8EAI0vDZx5-rRqlu3JtbfzrTAV1vybHD3s,269
98
+ pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-basic.png,sha256=LQmPj4SL4HKumkgo20tgQjoJL_W2uqHCbmVA410wPbc,253
99
+ pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-hover.png,sha256=6J4hVL28_M0K-1_vMAEHMJ8jM0Uno_71KLF39zo_dDg,269
100
+ pdflinkcheck/data/themes/forest/forest-dark/tree-basic.png,sha256=lvgoAIKAcdMMElVs8OSNEGvZ0qwZOXOiTgo-awPcM2g,149
101
+ pdflinkcheck/data/themes/forest/forest-dark/tree-pressed.png,sha256=2niAWEhH2OACJLClTlfSF8Hdh6w2372LAeOkliIhvts,171
102
+ pdflinkcheck/data/themes/forest/forest-dark/up.png,sha256=rYXTZXXxHpLqrnKV_PLukfROlp_7915cVMidGTCAs9k,250
103
+ pdflinkcheck/data/themes/forest/forest-dark/vert-accent.png,sha256=ByAmCAafDeylS7_FHpqX9DZ4ZFnPO-TqUl9Mh0fCPmc,158
104
+ pdflinkcheck/data/themes/forest/forest-dark/vert-basic.png,sha256=-oOfurWXJNN7TSy_VEu6t-o9IMojg-1gmyGYjOk-Rwg,158
105
+ pdflinkcheck/data/themes/forest/forest-dark/vert-hover.png,sha256=ran_87NoN4U9dSLXft-cO6XyKnP2whAgqUj7E6N4DKk,158
106
+ pdflinkcheck/data/themes/forest/forest-light/border-accent-hover.png,sha256=G1F4TVltT88-xdqJgvek_v0QZ_RCNFJsI0hJgx5DvcA,445
107
+ pdflinkcheck/data/themes/forest/forest-light/border-accent.png,sha256=b-r7W6ipGGzWCG_sZHyuoxZeLA7iLY5NAqNR2zEdF7M,463
108
+ pdflinkcheck/data/themes/forest/forest-light/border-basic.png,sha256=aKludTEo35p98yt77J5vVhh4qy8QXPEipgz3a75Pwzw,311
109
+ pdflinkcheck/data/themes/forest/forest-light/border-hover.png,sha256=tgNxgjTd91Jw4S4YBCywhko1jtPzOKWSSTHQ06NSzUE,324
110
+ pdflinkcheck/data/themes/forest/forest-light/border-invalid.png,sha256=lL5pH3QpOqLmWHVHaCLXwBt4vLwaaAR-Awgh7_1HL80,444
111
+ pdflinkcheck/data/themes/forest/forest-light/card.png,sha256=uA1xqjcmSyokZaFSlghW9kJ1Na9PIlzXDAC2FdOvrzU,353
112
+ pdflinkcheck/data/themes/forest/forest-light/check-accent.png,sha256=1SOhuFzGKxLpiBuCuIc6txrCCNumDRzIUj041G5g-jw,526
113
+ pdflinkcheck/data/themes/forest/forest-light/check-basic.png,sha256=s_pc6gJR7LtFIz6EIypnuqyrYr7E9sHBsMDKDzhUnHs,390
114
+ pdflinkcheck/data/themes/forest/forest-light/check-hover.png,sha256=36XFEo0IA_v4JlJ4GdP1jhHeDT49u2KVHj6PqFV3jlY,531
115
+ pdflinkcheck/data/themes/forest/forest-light/check-tri-accent.png,sha256=y7q_WEjd-Hs2WP1Q3b4-nH8gxRbkEDTanv2GLm0Livo,358
116
+ pdflinkcheck/data/themes/forest/forest-light/check-tri-basic.png,sha256=ce5jJgYV7AG-8dmYwg_jq_deBDGeoQ8xv2ZCXDYQ1Os,281
117
+ pdflinkcheck/data/themes/forest/forest-light/check-tri-hover.png,sha256=_0A12dacFK87Wiuwrn8s_CU3deYcz5P5hgryVsjfH0E,358
118
+ pdflinkcheck/data/themes/forest/forest-light/check-unsel-accent.png,sha256=KGTyT9Smf8Y6oU608Xy5XigqAuftjDBSevHqTkUMd8c,403
119
+ pdflinkcheck/data/themes/forest/forest-light/check-unsel-basic.png,sha256=aKludTEo35p98yt77J5vVhh4qy8QXPEipgz3a75Pwzw,311
120
+ pdflinkcheck/data/themes/forest/forest-light/check-unsel-hover.png,sha256=5qBA26jDUHpuLYcuOFx1SLaqeu1ixgzaDnF4MJ63-pI,398
121
+ pdflinkcheck/data/themes/forest/forest-light/check-unsel-pressed.png,sha256=XFCVCrwZ2w9KIBS-3YMXgAGCHrKtTt2xkAZnTkgRTOw,335
122
+ pdflinkcheck/data/themes/forest/forest-light/combo-button-basic.png,sha256=NhQlwCplxVnHb8tws5Ix_jPmdYOwPGEZnxuatWWCIKU,247
123
+ pdflinkcheck/data/themes/forest/forest-light/combo-button-focus.png,sha256=oh9jLyGpzPI1Pp-Uq8wbC6GHSiSG2DuCUkPcgl6yb0E,260
124
+ pdflinkcheck/data/themes/forest/forest-light/combo-button-hover.png,sha256=xbiPPr84hu7ZiJ4ASV3FXBQXQNJXoMZ-dieXGR-aHyk,244
125
+ pdflinkcheck/data/themes/forest/forest-light/down-focus.png,sha256=Jm3YQJyWIfjZWbkljJTI-K4bBqWyxMhSK39qciWDREE,200
126
+ pdflinkcheck/data/themes/forest/forest-light/down.png,sha256=UkvgLbxe3Nuhx9_SEY8cVnMMHv7XOPW-wwGS-pxPfE8,266
127
+ pdflinkcheck/data/themes/forest/forest-light/empty.png,sha256=aAISBZoamEUCCxwm-XVLjE0iquAVx-7ORJMm5_nvwRc,130
128
+ pdflinkcheck/data/themes/forest/forest-light/hor-accent.png,sha256=Ahtvg4IlmxdB91m7HUspdyGKZYVDMzWkXW7l4ROfsBY,154
129
+ pdflinkcheck/data/themes/forest/forest-light/hor-basic.png,sha256=X63fOcJKBw8huFz_y6jzvMdeBPr7R6WDLc55ENgJnNs,157
130
+ pdflinkcheck/data/themes/forest/forest-light/hor-hover.png,sha256=vdph5xYWH0DMcS4k5uIRWgLAqJwg42qF3c4cfJ5GhgE,154
131
+ pdflinkcheck/data/themes/forest/forest-light/notebook.png,sha256=0v-LOJI86uDrNegHqP2ew-BG2A21t_OQa4LitvWaEFw,190
132
+ pdflinkcheck/data/themes/forest/forest-light/off-accent.png,sha256=YJqvTlC9x9hjUnNIkOEd-SNtzDUwo3tLUcj3aXFxPRw,765
133
+ pdflinkcheck/data/themes/forest/forest-light/off-basic.png,sha256=D03BVzXLZ5EcRY2Pq092_yKJVYRBi-_ouR7329-Am8Q,547
134
+ pdflinkcheck/data/themes/forest/forest-light/off-hover.png,sha256=G9vgbqJnysNqu2u1ch59t9MUNU-MB6RogdMhkf0weO4,771
135
+ pdflinkcheck/data/themes/forest/forest-light/on-accent.png,sha256=G3y-ZWOLFgW2eDFi7HQpM_g37dmtGa6SmEcdPV7x4Os,754
136
+ pdflinkcheck/data/themes/forest/forest-light/on-basic.png,sha256=sFWqOifw-lPD91uP5-fLvfrLGfb7XbIQmgoPLn1HTj8,538
137
+ pdflinkcheck/data/themes/forest/forest-light/on-hover.png,sha256=EmpTAuprnkRjR7Fah07HdvdmTbtwBsDAUjE19W98qEI,764
138
+ pdflinkcheck/data/themes/forest/forest-light/radio-accent.png,sha256=88LGsUOYDCyrOLuQTwOQKBCT9PueX5zY-TkX9QLDLsw,674
139
+ pdflinkcheck/data/themes/forest/forest-light/radio-basic.png,sha256=RB63qZ1RnnsSAnhaGQlp8SzkxQdnu0vLGXyGVqH4nOg,486
140
+ pdflinkcheck/data/themes/forest/forest-light/radio-hover.png,sha256=xY02oGSulbGasaF8zBxyNaXUHGcZYs_1l8ZuSPNA-tg,679
141
+ pdflinkcheck/data/themes/forest/forest-light/radio-tri-accent.png,sha256=aZwlBpHwnn-1-6yZhNl7ksLZyGqzmg5rJs-NO4Q-TZ0,549
142
+ pdflinkcheck/data/themes/forest/forest-light/radio-tri-basic.png,sha256=CGPZorvPlrihFF4PA3pqnS5ok4NsGwA56SJbZ4ssyPs,390
143
+ pdflinkcheck/data/themes/forest/forest-light/radio-tri-hover.png,sha256=jcs_MdoZlbSJS23vBibuySgjziaqJJgQfAJy3zVphhQ,550
144
+ pdflinkcheck/data/themes/forest/forest-light/radio-unsel-accent.png,sha256=skljAMQcMV6_r2_BLLwqrIJLcD_oUS3JXOF-RbCC4lU,676
145
+ pdflinkcheck/data/themes/forest/forest-light/radio-unsel-basic.png,sha256=ZuF3R6frYCFfiqlRgliSXEyHPYQ_p_ageLt6N9FmN_0,504
146
+ pdflinkcheck/data/themes/forest/forest-light/radio-unsel-hover.png,sha256=UOEAxqp8k7HpUatgzto1uU3hb-NeR24PaI8JMRn6fUM,674
147
+ pdflinkcheck/data/themes/forest/forest-light/radio-unsel-pressed.png,sha256=u0R7DytIw1xzH6XPiol7XAI6UJPCvvgqFk8_9m4lxec,512
148
+ pdflinkcheck/data/themes/forest/forest-light/rect-accent-hover.png,sha256=XFCVCrwZ2w9KIBS-3YMXgAGCHrKtTt2xkAZnTkgRTOw,335
149
+ pdflinkcheck/data/themes/forest/forest-light/rect-accent.png,sha256=5z1HUtlEKTJmboVjyzdjneUBdL9yAdSA66rn0ZWZfdk,335
150
+ pdflinkcheck/data/themes/forest/forest-light/rect-basic.png,sha256=P7KEkUfUgjq61CxrM9YkwQaV9V6en_YUnED4KHojLDg,254
151
+ pdflinkcheck/data/themes/forest/forest-light/rect-hover.png,sha256=fVtJuiKsvdS_lcyT6ko0ornJyEFkE1FPcQoidr3JT0Q,272
152
+ pdflinkcheck/data/themes/forest/forest-light/right-focus.png,sha256=rwmK_20UP39GStTNFWPQVCnUDtrzxNjKi_Lb_PlBeDE,190
153
+ pdflinkcheck/data/themes/forest/forest-light/right.png,sha256=kMTXyH8kER_DqsAmx3GpH_1_bZL1fUKn69Nk93zR7Ys,284
154
+ pdflinkcheck/data/themes/forest/forest-light/scale-hor.png,sha256=E-XWMNU2jNqsTXcI442GGijNC0UvOF1zwTI30Yv6eAk,161
155
+ pdflinkcheck/data/themes/forest/forest-light/scale-vert.png,sha256=3kU2kZq_od93REwviNY_9nfovxwXBrHN6U-HXi0f-N4,162
156
+ pdflinkcheck/data/themes/forest/forest-light/separator.png,sha256=GIvc6YmJktvRcMmyQ3d-I6jPw4A3nDaDgNdLs5Oew9Y,128
157
+ pdflinkcheck/data/themes/forest/forest-light/sizegrip.png,sha256=bCzw55917nv47E6IPkZQTdRsqS2le7AFDBhJjtYw37A,471
158
+ pdflinkcheck/data/themes/forest/forest-light/spin-button-down-basic.png,sha256=-mdupa0cKCp841AkTF8ZLegFn0yVhOwxJ1pYsFke4YI,156
159
+ pdflinkcheck/data/themes/forest/forest-light/spin-button-down-focus.png,sha256=Ulm2AAhXCRH91r2zMxYmrKDcPFMoJjogoVElVTTa5Jw,163
160
+ pdflinkcheck/data/themes/forest/forest-light/spin-button-up.png,sha256=9BqiNmwhOBQxLUk3_z-fSYDoJwvb_fHcZ62vQEVC2hk,223
161
+ pdflinkcheck/data/themes/forest/forest-light/tab-accent.png,sha256=WZfG7ejt26QqgjGL3mbE1xHwvQqq6cPfdJ3-L-q9-Ro,184
162
+ pdflinkcheck/data/themes/forest/forest-light/tab-basic.png,sha256=1ckMXRBNCo6v_QGAOeKmnY90aDYDqXM8joajeYXqF38,183
163
+ pdflinkcheck/data/themes/forest/forest-light/tab-hover.png,sha256=xWcSyuCRSgnwsjoC68_KcX84_B53IHsgaJpdYq02kcI,184
164
+ pdflinkcheck/data/themes/forest/forest-light/thumb-hor-accent.png,sha256=IHrz8xqmxa0VfXE55lSjHj8B1NUGbQsUO6CQII4k8-M,316
165
+ pdflinkcheck/data/themes/forest/forest-light/thumb-hor-basic.png,sha256=FeibX0i_weUuw4qQlIg_vesSLt-YostwyJkIOeW3Ebk,242
166
+ pdflinkcheck/data/themes/forest/forest-light/thumb-hor-hover.png,sha256=hkYHxtviL9T8bLvtUvleeg8ggU02ko7PQ4XQPBGT6tA,316
167
+ pdflinkcheck/data/themes/forest/forest-light/thumb-vert-accent.png,sha256=cCRo8uU8Kz22x86oyE_pldVM-iUmHdZmyNJh3rpE91s,311
168
+ pdflinkcheck/data/themes/forest/forest-light/thumb-vert-basic.png,sha256=4SaeJeN4bWW198uxvo3ShG4lxUmXqrio7XGR62MVAGs,234
169
+ pdflinkcheck/data/themes/forest/forest-light/thumb-vert-hover.png,sha256=ExvieNh-UXIbjVTbRMxHNKd7bViwp2pzbLx7YNx8DtM,310
170
+ pdflinkcheck/data/themes/forest/forest-light/tree-basic.png,sha256=R8WngTzTDAWNqkfh-RhsdGkjnYkie5V1LioHttSUwUI,149
171
+ pdflinkcheck/data/themes/forest/forest-light/tree-pressed.png,sha256=Q0-OVBVYuJw00hBWXiNb8SxTcChsHgnGvRtWf3SToNo,168
172
+ pdflinkcheck/data/themes/forest/forest-light/up.png,sha256=qNsplPHruJhHV0mJDaomkfPaM0xEP3CfU3df_yL9wro,278
173
+ pdflinkcheck/data/themes/forest/forest-light/vert-accent.png,sha256=Eyj8nUQHnEzxNVFhMv7FH_Ezn9pOt2Xe0-Aquh8_9YY,158
174
+ pdflinkcheck/data/themes/forest/forest-light/vert-basic.png,sha256=tx9KswFqH_-ImUrm2M8cIjsBQKGupa2SJqjVjHCi9LM,158
175
+ pdflinkcheck/data/themes/forest/forest-light/vert-hover.png,sha256=BjEilGWGjr0ulvCfmFiBmS-8Dr1jSQjt4CUkxS1e2h4,158
176
+ pdflinkcheck-1.2.29.dist-info/licenses/LICENSE,sha256=npi0VqlkL0AlE0FsGEIOXxMqXlmH4toZfBHesJpP0lA,1866
177
+ pdflinkcheck-1.2.29.dist-info/licenses/LICENSE-AGPL3,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
178
+ pdflinkcheck-1.2.29.dist-info/licenses/LICENSE-MIT,sha256=hNjSMpr8jpZQzBj9tHKafry8bW1kfLnl-DxiSfw7Lyw,1127
179
+ pdflinkcheck-1.2.29.dist-info/METADATA,sha256=37Kicn3cP9WUYoBnudSyIVytLqfsXAD2UZph9Qhol7M,13317
180
+ pdflinkcheck-1.2.29.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
181
+ pdflinkcheck-1.2.29.dist-info/entry_points.txt,sha256=cZaB_inIfr2X9lxMo1RhZr4602F3nTjTm3cXquzfw3Q,54
182
+ pdflinkcheck-1.2.29.dist-info/top_level.txt,sha256=WdBg8l6l3TF1HQDpR_PwSmBCSu5atKWFnPfNbRNwrME,13
183
+ pdflinkcheck-1.2.29.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -1,3 +1,2 @@
1
1
  [console_scripts]
2
2
  pdflinkcheck = pdflinkcheck.cli:app
3
-
@@ -0,0 +1,27 @@
1
+ Some distributed binaries of this project include the PyMuPDF library, which is licensed under **AGPL3.0orlater**.
2
+ Any binary that incorporates PyMuPDF is therefore distributed under **AGPL3.0orlater**.
3
+ Other binaries use only the `pypdf` library and do not include PyMuPDF; these binaries are distributed under the **MIT License**.
4
+
5
+ For AGPLlicensed binaries, the complete corresponding source code must be made available to anyone who possesses a copy, upon request.
6
+ This obligation applies only to recipients of those binaries, and hosting the source code in GitHub Releases satisfies this requirement.
7
+
8
+ A binary becomes AGPLlicensed only when built with the optional `"full"` dependency group (as defined in `pyproject.toml` under `[project.optional-dependencies]`) or when PyMuPDF is otherwise included in the build environment.
9
+ The **source code of pdflinkcheck itself** remains licensed under the **MIT License**; only the distributed binary becomes AGPLlicensed when PyMuPDF is included.
10
+
11
+ Source code for each released version is available in the `pdflinkcheckVERSION.tar.gz` files on the projects GitHub Releases page.
12
+
13
+ Fulltext copies of **LICENSEMIT** and **LICENSEAGPL3** are included in the root of the repository.
14
+
15
+ **Links:**
16
+ - Project source code: https://github.com/City-of-Memphis-Wastewater/pdflinkcheck
17
+ - PyMuPDF source code: https://github.com/pymupdf/PyMuPDF
18
+ - pypdfium2 source code: https://github.com/pypdfium2-team/pypdfium2
19
+ - PDFium source code: https://pdfium.googlesource.com/pdfium/
20
+ - pypdf source code: https://github.com/py-pdf/pypdf
21
+ - AGPLv3 text (FSF): https://www.gnu.org/licenses/agpl-3.0.html
22
+ - MIT License text: https://opensource.org/license/mit
23
+ - BSD-3 License text: https://opensource.org/license/bsd-3-clause
24
+ - Apache-v2 License text: https://opensource.org/license/apache-2-0
25
+
26
+
27
+ Copyright 2025 George Clayton Bennett
@@ -0,0 +1,9 @@
1
+ MIT
2
+
3
+ Copyright © 2025 George Clayton Bennett <https://github.com/City-of-Memphis-Wastewater/>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1 @@
1
+ pdflinkcheck