pdflinkcheck 1.1.70__tar.gz → 1.3.8__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 (197) hide show
  1. pdflinkcheck-1.3.8/LICENSE +27 -0
  2. pdflinkcheck-1.3.8/LICENSE-MIT +9 -0
  3. pdflinkcheck-1.3.8/MANIFEST.in +4 -0
  4. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8}/PKG-INFO +95 -89
  5. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8}/README.md +75 -75
  6. {pdflinkcheck-1.1.70/src/pdflinkcheck/data → pdflinkcheck-1.3.8}/pyproject.toml +25 -40
  7. pdflinkcheck-1.3.8/setup.cfg +4 -0
  8. pdflinkcheck-1.3.8/src/pdflinkcheck/__init__.py +136 -0
  9. pdflinkcheck-1.3.8/src/pdflinkcheck/__main__.py +6 -0
  10. pdflinkcheck-1.3.8/src/pdflinkcheck/analysis_pdfium.py +131 -0
  11. pdflinkcheck-1.1.70/src/pdflinkcheck/analyze_pymupdf.py → pdflinkcheck-1.3.8/src/pdflinkcheck/analysis_pymupdf.py +109 -145
  12. pdflinkcheck-1.1.70/src/pdflinkcheck/analyze_pypdf.py → pdflinkcheck-1.3.8/src/pdflinkcheck/analysis_pypdf.py +67 -37
  13. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8}/src/pdflinkcheck/cli.py +206 -127
  14. pdflinkcheck-1.3.8/src/pdflinkcheck/data/I Have Questions.md +51 -0
  15. pdflinkcheck-1.3.8/src/pdflinkcheck/data/LICENSE +27 -0
  16. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8}/src/pdflinkcheck/data/README.md +75 -75
  17. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/BoxArt-1080x1080.png +0 -0
  18. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/Logo-150x150.png +0 -0
  19. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/Logo-300x300.png +0 -0
  20. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/Logo-71x71.png +0 -0
  21. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/PosterArt-720x1080.png +0 -0
  22. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/SmallLogo-44x44.png +0 -0
  23. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/SplashScreen-620x300.png +0 -0
  24. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/StoreLogo-50x50.png +0 -0
  25. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/WideLogo-310x150.png +0 -0
  26. pdflinkcheck-1.3.8/src/pdflinkcheck/data/icons/red_pdf_512px.ico +0 -0
  27. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8/src/pdflinkcheck/data}/pyproject.toml +25 -40
  28. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/border-accent-hover.png +0 -0
  29. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/border-accent.png +0 -0
  30. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/border-basic.png +0 -0
  31. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/border-hover.png +0 -0
  32. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/border-invalid.png +0 -0
  33. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/card.png +0 -0
  34. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-accent.png +0 -0
  35. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-basic.png +0 -0
  36. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-hover.png +0 -0
  37. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-tri-accent.png +0 -0
  38. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-tri-basic.png +0 -0
  39. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-tri-hover.png +0 -0
  40. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-unsel-accent.png +0 -0
  41. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-unsel-basic.png +0 -0
  42. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-unsel-hover.png +0 -0
  43. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/check-unsel-pressed.png +0 -0
  44. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/combo-button-basic.png +0 -0
  45. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/combo-button-focus.png +0 -0
  46. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/combo-button-hover.png +0 -0
  47. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/down.png +0 -0
  48. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/empty.png +0 -0
  49. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/hor-accent.png +0 -0
  50. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/hor-basic.png +0 -0
  51. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/hor-hover.png +0 -0
  52. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/notebook.png +0 -0
  53. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/off-accent.png +0 -0
  54. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/off-basic.png +0 -0
  55. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/off-hover.png +0 -0
  56. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/on-accent.png +0 -0
  57. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/on-basic.png +0 -0
  58. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/on-hover.png +0 -0
  59. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-accent.png +0 -0
  60. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-basic.png +0 -0
  61. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-hover.png +0 -0
  62. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-tri-accent.png +0 -0
  63. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-tri-basic.png +0 -0
  64. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-tri-hover.png +0 -0
  65. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-accent.png +0 -0
  66. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-basic.png +0 -0
  67. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-hover.png +0 -0
  68. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/radio-unsel-pressed.png +0 -0
  69. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/rect-accent-hover.png +0 -0
  70. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/rect-accent.png +0 -0
  71. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/rect-basic.png +0 -0
  72. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/rect-hover.png +0 -0
  73. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/right.png +0 -0
  74. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/scale-hor.png +0 -0
  75. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/scale-vert.png +0 -0
  76. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/separator.png +0 -0
  77. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/sizegrip.png +0 -0
  78. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/spin-button-down-basic.png +0 -0
  79. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/spin-button-down-focus.png +0 -0
  80. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/spin-button-up.png +0 -0
  81. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/tab-accent.png +0 -0
  82. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/tab-basic.png +0 -0
  83. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/tab-hover.png +0 -0
  84. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-accent.png +0 -0
  85. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-basic.png +0 -0
  86. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/thumb-hor-hover.png +0 -0
  87. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-accent.png +0 -0
  88. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-basic.png +0 -0
  89. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/thumb-vert-hover.png +0 -0
  90. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/tree-basic.png +0 -0
  91. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/tree-pressed.png +0 -0
  92. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/up.png +0 -0
  93. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/vert-accent.png +0 -0
  94. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/vert-basic.png +0 -0
  95. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark/vert-hover.png +0 -0
  96. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-dark.tcl +536 -0
  97. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/border-accent-hover.png +0 -0
  98. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/border-accent.png +0 -0
  99. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/border-basic.png +0 -0
  100. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/border-hover.png +0 -0
  101. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/border-invalid.png +0 -0
  102. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/card.png +0 -0
  103. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-accent.png +0 -0
  104. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-basic.png +0 -0
  105. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-hover.png +0 -0
  106. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-tri-accent.png +0 -0
  107. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-tri-basic.png +0 -0
  108. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-tri-hover.png +0 -0
  109. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-unsel-accent.png +0 -0
  110. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-unsel-basic.png +0 -0
  111. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-unsel-hover.png +0 -0
  112. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/check-unsel-pressed.png +0 -0
  113. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/combo-button-basic.png +0 -0
  114. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/combo-button-focus.png +0 -0
  115. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/combo-button-hover.png +0 -0
  116. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/down-focus.png +0 -0
  117. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/down.png +0 -0
  118. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/empty.png +0 -0
  119. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/hor-accent.png +0 -0
  120. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/hor-basic.png +0 -0
  121. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/hor-hover.png +0 -0
  122. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/notebook.png +0 -0
  123. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/off-accent.png +0 -0
  124. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/off-basic.png +0 -0
  125. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/off-hover.png +0 -0
  126. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/on-accent.png +0 -0
  127. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/on-basic.png +0 -0
  128. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/on-hover.png +0 -0
  129. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-accent.png +0 -0
  130. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-basic.png +0 -0
  131. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-hover.png +0 -0
  132. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-tri-accent.png +0 -0
  133. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-tri-basic.png +0 -0
  134. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-tri-hover.png +0 -0
  135. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-unsel-accent.png +0 -0
  136. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-unsel-basic.png +0 -0
  137. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-unsel-hover.png +0 -0
  138. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/radio-unsel-pressed.png +0 -0
  139. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/rect-accent-hover.png +0 -0
  140. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/rect-accent.png +0 -0
  141. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/rect-basic.png +0 -0
  142. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/rect-hover.png +0 -0
  143. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/right-focus.png +0 -0
  144. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/right.png +0 -0
  145. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/scale-hor.png +0 -0
  146. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/scale-vert.png +0 -0
  147. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/separator.png +0 -0
  148. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/sizegrip.png +0 -0
  149. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/spin-button-down-basic.png +0 -0
  150. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/spin-button-down-focus.png +0 -0
  151. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/spin-button-up.png +0 -0
  152. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/tab-accent.png +0 -0
  153. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/tab-basic.png +0 -0
  154. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/tab-hover.png +0 -0
  155. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/thumb-hor-accent.png +0 -0
  156. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/thumb-hor-basic.png +0 -0
  157. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/thumb-hor-hover.png +0 -0
  158. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/thumb-vert-accent.png +0 -0
  159. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/thumb-vert-basic.png +0 -0
  160. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/thumb-vert-hover.png +0 -0
  161. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/tree-basic.png +0 -0
  162. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/tree-pressed.png +0 -0
  163. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/up.png +0 -0
  164. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/vert-accent.png +0 -0
  165. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/vert-basic.png +0 -0
  166. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light/vert-hover.png +0 -0
  167. pdflinkcheck-1.3.8/src/pdflinkcheck/data/themes/forest/forest-light.tcl +544 -0
  168. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8}/src/pdflinkcheck/datacopy.py +18 -1
  169. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8}/src/pdflinkcheck/dev.py +12 -25
  170. pdflinkcheck-1.3.8/src/pdflinkcheck/environment.py +83 -0
  171. pdflinkcheck-1.3.8/src/pdflinkcheck/gui.py +555 -0
  172. pdflinkcheck-1.3.8/src/pdflinkcheck/helpers.py +134 -0
  173. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8}/src/pdflinkcheck/io.py +62 -29
  174. pdflinkcheck-1.3.8/src/pdflinkcheck/report copy.py +878 -0
  175. pdflinkcheck-1.3.8/src/pdflinkcheck/report.py +561 -0
  176. pdflinkcheck-1.3.8/src/pdflinkcheck/security.py +189 -0
  177. pdflinkcheck-1.3.8/src/pdflinkcheck/splash.py +38 -0
  178. pdflinkcheck-1.3.8/src/pdflinkcheck/spreadsheet.py +271 -0
  179. pdflinkcheck-1.3.8/src/pdflinkcheck/stdlib_server.py +612 -0
  180. pdflinkcheck-1.3.8/src/pdflinkcheck/tk_utils.py +188 -0
  181. pdflinkcheck-1.3.8/src/pdflinkcheck/update_msix_version.py +49 -0
  182. pdflinkcheck-1.3.8/src/pdflinkcheck/validate.py +298 -0
  183. {pdflinkcheck-1.1.70 → pdflinkcheck-1.3.8}/src/pdflinkcheck/version_info.py +6 -3
  184. pdflinkcheck-1.3.8/src/pdflinkcheck.egg-info/PKG-INFO +328 -0
  185. pdflinkcheck-1.3.8/src/pdflinkcheck.egg-info/SOURCES.txt +188 -0
  186. pdflinkcheck-1.3.8/src/pdflinkcheck.egg-info/dependency_links.txt +1 -0
  187. pdflinkcheck-1.3.8/src/pdflinkcheck.egg-info/entry_points.txt +2 -0
  188. pdflinkcheck-1.3.8/src/pdflinkcheck.egg-info/requires.txt +15 -0
  189. pdflinkcheck-1.3.8/src/pdflinkcheck.egg-info/top_level.txt +1 -0
  190. pdflinkcheck-1.1.70/src/pdflinkcheck/__init__.py +0 -69
  191. pdflinkcheck-1.1.70/src/pdflinkcheck/analyze_pypdf_v2.py +0 -218
  192. pdflinkcheck-1.1.70/src/pdflinkcheck/data/LICENSE +0 -661
  193. pdflinkcheck-1.1.70/src/pdflinkcheck/gui.py +0 -590
  194. pdflinkcheck-1.1.70/src/pdflinkcheck/report.py +0 -280
  195. pdflinkcheck-1.1.70/src/pdflinkcheck/stdlib_server.py +0 -176
  196. pdflinkcheck-1.1.70/src/pdflinkcheck/validate.py +0 -380
  197. /pdflinkcheck-1.1.70/LICENSE → /pdflinkcheck-1.3.8/LICENSE-AGPL3 +0 -0
@@ -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 AGPL-licensed 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 AGPL-licensed 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 a distributed binary (or a publicly served web app) becomes AGPL-licensed 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,4 @@
1
+ include src/pdflinkcheck/data/*
2
+ recursive-include src/pdflinkcheck/data/themes *
3
+ recursive-include src/pdflinkcheck/data/icons *
4
+
@@ -1,18 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pdflinkcheck
3
- Version: 1.1.70
3
+ Version: 1.3.8
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,28 +29,34 @@ 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: openpyxl>=3.1.5
38
+ Requires-Dist: pyhabitat>=1.1.6
31
39
  Requires-Dist: pypdf>=6.4.2
32
40
  Requires-Dist: rich>=14.2.0
33
41
  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
42
+ Provides-Extra: pymupdf
43
+ Requires-Dist: pymupdf<2.0.0,>=1.24.0; extra == "pymupdf"
44
+ Provides-Extra: pdfium
45
+ Requires-Dist: pypdfium2<6.0.0,>=5.2.0; extra == "pdfium"
41
46
  Provides-Extra: full
42
- Provides-Extra: gui
43
- Description-Content-Type: text/markdown
47
+ Requires-Dist: pymupdf<2.0.0,>=1.24.0; extra == "full"
48
+ Requires-Dist: pypdfium2<6.0.0,>=5.2.0; extra == "full"
49
+ Dynamic: license-file
44
50
 
45
51
  # pdflinkcheck
46
52
 
47
53
  A purpose-built tool for comprehensive analysis of hyperlinks and GoTo links within PDF documents. Users may leverage either the PyMuPDF or the pypdf library. Use the CLI or the GUI.
48
54
 
55
+ [![Get it from the Microsoft Store](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/ms_store_badge_en-us-light.svg)](https://apps.microsoft.com/store/detail/9n11hxvls1wg)
56
+
49
57
  -----
50
58
 
51
- ![Screenshot of the pdflinkcheck GUI](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_gui_v1.1.58.png)
59
+ ![Screenshot of the pdflinkcheck GUI](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_gui_v1.3.3.png)
52
60
 
53
61
  -----
54
62
 
@@ -63,7 +71,7 @@ For the most user-typical experience, download the single-file binary matching y
63
71
  | **File Type** | **Primary Use Case** | **Recommended Launch Method** |
64
72
  | :--- | :--- | :--- |
65
73
  | **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` |
74
+ | **PYZ (Python Zip App)** | **CLI** or **GUI** | Run using your system's `python` command: `python pdflinkcheck-VERSION.pyz --help` |
67
75
 
68
76
  ### Installation via pipx
69
77
 
@@ -86,20 +94,9 @@ The tool can be run as simple cross-platform graphical interface (Tkinter).
86
94
 
87
95
  ### Launching the GUI
88
96
 
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`).
97
+ Ways to launch the GUI interface:
98
+ 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
99
  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
100
 
104
101
  -----
105
102
 
@@ -107,20 +104,30 @@ We are actively working on the following enhancements:
107
104
 
108
105
  The core functionality is accessed via the `analyze` command.
109
106
 
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
107
  `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)
108
+ ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.3.3.png)
109
+
110
+
111
+ See the Help Tree by unlocking the help-tree CLI command, using the DEV_TYPER_HELP_TREE env var.
112
+
113
+ ```
114
+ DEV_TYPER_HELP_TREE=1 pdflinkcheck help-tree` # bash
115
+ $env:DEV_TYPER_HELP_TREE = "1"; pdflinkcheck help-tree` # PowerShell
116
+ ```
117
+
118
+ ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.3.3_tree_help.png)
119
+
115
120
 
116
121
 
117
122
  ### Available Commands
118
123
 
119
124
  |**Command**|**Description**|
120
125
  |---|---|
121
- |`pdflinkcheck analyze`|Analyzes a PDF file for links |
126
+ |`pdflinkcheck analyze`|Analyzes a PDF file for links and validates their reasonableness.|
122
127
  |`pdflinkcheck gui`|Explicitly launch the Graphical User Interface.|
123
128
  |`pdflinkcheck docs`|Access documentation, including the README and AGPLv3+ license.|
129
+ |`pdflinkcheck serve`|Serve a basic local web app which uses only the Python standard library.|
130
+ |`pdflinkcheck tools`|Access additional tools, like `--clear-cache`.|
124
131
 
125
132
  ### `analyze` Command Options
126
133
 
@@ -128,8 +135,7 @@ The core functionality is accessed via the `analyze` command.
128
135
  |---|---|---|
129
136
  |`<PDF_PATH>`|**Required.** The path to the PDF file to analyze.|N/A|
130
137
  |`--pdf-library / -p`|Select engine: `pymupdf` or `pypdf`.|`pypdf`|
131
- |`--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`|
138
+ |`--format / -f`|Export to `JSON`, `TXT`, `XLSX`, and/or `None` to suppress file output.|`JSON`|
133
139
 
134
140
  ### `gui` Command Options
135
141
 
@@ -140,11 +146,8 @@ The core functionality is accessed via the `analyze` command.
140
146
  #### Example Runs
141
147
 
142
148
  ```bash
143
- # Analyze a document, show all links, and save the report as JSON and TXT
144
- pdflinkcheck analyze "TE Maxson WWTF O&M Manual.pdf" --export-format JSON,TXT
145
-
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
149
+ # Analyze a document, show all links, and save the report as XLSX, JSON, and TXT
150
+ pdflinkcheck analyze "TE Maxson WWTF O&M Manual.pdf" --format xlsx -f json -f txt
148
151
 
149
152
  # Show the GUI for only a moment, like in a build check
150
153
  pdflinkcheck gui --auto-close 3000
@@ -157,27 +160,28 @@ pdflinkcheck docs --license --readme
157
160
 
158
161
  ## 📦 Library Access (Advanced)
159
162
 
160
- For developers importing `pdflinkcheck` into other Python projects, the core analysis functions are exposed directly in the root namespace:
163
+ 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
164
 
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.|
165
+ |**Function**|**Library**|**Description**|
166
+ |---|---|---|
167
+ |`run_report()`|pdflinkcheck | **(Primary function)** Performs the full analysis, prints to console, and handles file export.|
168
+ |`analyze_pdf_pdfium()`| pypdfium2 | Fast, ~10 mb, Permissively licensed |
169
+ |`analyze_pdf_pymupdf()`| PyMuPDF | Fast, ~30 mb, AGPL3+ licensed |
170
+ |`analyze_pdf_pypdf()`| pypdf library | Slow, ~2 mb, Permissively licensed |
169
171
 
170
172
  Exanple:
171
173
 
172
174
  ```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
175
+ from pdflinkcheck import ( run_report,
176
+ analyze_pdf_pymupdf,
177
+ analyze_pdf_pypdf,
178
+ analyze_pdf_pdfium,
179
+ )
176
180
 
177
181
  file = "document1.pdf"
178
182
  report_data = run_report(file)
179
- links_pymupdf = extract_links_pymupdf(file)
180
- links_pypdf = extract_links_pypdf(file)
183
+ links_pdfium = analyze_pdf_pdfium(file)
184
+ links_pypdf = analyze_pdf_pypdf(file)
181
185
  ```
182
186
 
183
187
  -----
@@ -232,22 +236,34 @@ This `help-tree` feature has not yet been submitted for inclusion into Typer.
232
236
 
233
237
  ## ⚠️ Compatibility Notes
234
238
 
235
- #### Termux Compatibility as a Key Goal
239
+ ### Termux Compatibility as a Key Goal
236
240
  A key goal of City-of-Memphis-Wastewater is to release all software as Termux-compatible.
237
241
 
238
- Termux compatibility is important in the modern age as Android devices are common among technicians, field engineers, and maintenace staff.
242
+ Termux compatibility is important in the modern age, because Android devices are common among technicians, field engineers, and maintenace staff.
239
243
  Android is the most common operating system in the Global South.
240
244
  We aim to produce stable software that can do the most possible good.
241
245
 
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.
246
+ Now `pdflinkcheck` can run on Termux by using the `pypdf` engine and the `pdfium` engine.
247
+ Benefits:
248
+ - `pypdf`-only artifacts, to reduce size to about 6% compared to artifacts that include `PyMuPDF`.
249
+ - Web-stack GUI as an alternative to the Tkinter GUI, which can be run locally on Termux or as a web app.
250
+
251
+
252
+ ### PDF Library Selection
253
+ 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+.
254
+
255
+ 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.
245
256
 
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.
257
+ To install the complete version use one of these options:
258
+
259
+ ```bash
260
+ pip install "pdflinkcheck[pymupdf]"
261
+ pipx install "pdflinkcheck[pdfium]"
262
+ uv tool install "pdflinkcheck[pdfium]"
263
+ uv add "pdflinkcheck[pdfium]"
264
+ ```
249
265
 
250
- Because it works, we plan to keep the `PyMuPDF` portion of the codebase.
266
+ ---
251
267
 
252
268
  ### Document Compatibility:
253
269
  Not all PDF files can be processed successfully. This tool is designed primarily for digitally generated (vector-based) PDFs.
@@ -259,22 +275,6 @@ Processing may fail or yield incomplete results for:
259
275
 
260
276
  -----
261
277
 
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
278
  ## Run from Source (Developers)
279
279
 
280
280
  ```bash
@@ -282,12 +282,12 @@ git clone http://github.com/city-of-memphis-wastewater/pdflinkcheck.git
282
282
  cd pdflinkcheck
283
283
 
284
284
  # To include the PyMuPDF dependency in the installation:
285
- uv sync --extras full
285
+ uv sync --extras pdfium --extra pymupdf
286
286
 
287
287
  # On Termux, to not include PyMuPDF:
288
- uv sync
288
+ uv sync --extra pdfium
289
289
 
290
- # To include developer depedecies:
290
+ # To include developer dependencies:
291
291
  uv sync --all-extras --group dev
292
292
 
293
293
  # Run the CLI
@@ -301,22 +301,28 @@ uv run python -m pdflinkcheck.stdlib_server
301
301
 
302
302
  ## 📜 License Implications (AGPLv3+)
303
303
 
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
304
 
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.
305
+ The `AGPL3-or-later` is required for binaries of `pdflinkcheck` which include `PyMuPDF`, which is licensed under the `AGPL3`.
306
+ The source code itself for `pdflinkcheck` is licensed under the `MIT`.
310
307
 
311
- This license has significant implications for **distribution and network use**, particularly for organizations:
308
+ The AGPL3-or-later license has significant implications for **distribution and network use**, particularly for organizations:
312
309
 
313
310
  * **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
311
  * **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
312
 
316
313
  > **Before deploying or modifying this tool for organizational use, especially for internal web services or distribution, please ensure compliance with the AGPLv3+ terms.**
317
314
 
315
+ 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.
316
+
317
+ The source code of pdflinkcheck itself remains licensed under the **MIT License**; only the distributed binary becomes AGPL‑licensed when PyMuPDF is included.
318
+
319
+
318
320
  Links:
319
321
  - Source code: https://github.com/City-of-Memphis-Wastewater/pdflinkcheck/
320
- - Official AGPLv3 Text (FSF): https://www.gnu.org/licenses/agpl-3.0.html
322
+ - PyMuPDF source code: https://github.com/pymupdf/PyMuPDF/
323
+ - pypdfium2 source code: https://github.com/pypdfium2-team/pypdfium2
324
+ - pypdf source code: https://github.com/py-pdf/pypdf/
325
+ - AGPLv3 text (FSF): https://www.gnu.org/licenses/agpl-3.0.html
326
+ - MIT License text: https://opensource.org/license/mit
321
327
 
322
328
  Copyright © 2025 George Clayton Bennett
@@ -2,9 +2,11 @@
2
2
 
3
3
  A purpose-built tool for comprehensive analysis of hyperlinks and GoTo links within PDF documents. Users may leverage either the PyMuPDF or the pypdf library. Use the CLI or the GUI.
4
4
 
5
+ [![Get it from the Microsoft Store](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/ms_store_badge_en-us-light.svg)](https://apps.microsoft.com/store/detail/9n11hxvls1wg)
6
+
5
7
  -----
6
8
 
7
- ![Screenshot of the pdflinkcheck GUI](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_gui_v1.1.58.png)
9
+ ![Screenshot of the pdflinkcheck GUI](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_gui_v1.3.3.png)
8
10
 
9
11
  -----
10
12
 
@@ -19,7 +21,7 @@ For the most user-typical experience, download the single-file binary matching y
19
21
  | **File Type** | **Primary Use Case** | **Recommended Launch Method** |
20
22
  | :--- | :--- | :--- |
21
23
  | **Executable (.exe, .elf)** | **GUI** | Double-click the file. |
22
- | **PYZ (Python Zip App)** | **CLI** or **GUI** | Run using your system's `python` command: `python pdflinkcheck-VERSION.pyz --help` |
24
+ | **PYZ (Python Zip App)** | **CLI** or **GUI** | Run using your system's `python` command: `python pdflinkcheck-VERSION.pyz --help` |
23
25
 
24
26
  ### Installation via pipx
25
27
 
@@ -42,20 +44,9 @@ The tool can be run as simple cross-platform graphical interface (Tkinter).
42
44
 
43
45
  ### Launching the GUI
44
46
 
45
- There are three ways to launch the GUI interface:
46
-
47
- 1. **Implicit Launch:** Run the main command with no arguments, subcommands, or flags (`pdflinkcheck`).
47
+ Ways to launch the GUI interface:
48
+ 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.)
48
49
  2. **Explicit Command:** Use the dedicated GUI subcommand (`pdflinkcheck gui`).
49
- 3. **Binary Double-Click:**
50
- * **Windows:** Double-click the `pdflinkcheck-VERSION-gui.bat` file.
51
- * **macOS/Linux:** Double-click the downloaded `.pyz` or `.elf` file.
52
-
53
- ### Planned GUI Updates
54
-
55
- We are actively working on the following enhancements:
56
-
57
- * **Report Export:** Functionality to export the full analysis report to a plain text file.
58
- * **License Visibility:** A dedicated "License Info" button within the GUI to display the terms of the AGPLv3+ license.
59
50
 
60
51
  -----
61
52
 
@@ -63,20 +54,30 @@ We are actively working on the following enhancements:
63
54
 
64
55
  The core functionality is accessed via the `analyze` command.
65
56
 
66
- `DEV_TYPER_HELP_TREE=1 pdflinkcheck help-tree`:
67
- ![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)
68
-
69
57
  `pdflinkcheck --help`:
70
- ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.1.58.png)
58
+ ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.3.3.png)
59
+
60
+
61
+ See the Help Tree by unlocking the help-tree CLI command, using the DEV_TYPER_HELP_TREE env var.
62
+
63
+ ```
64
+ DEV_TYPER_HELP_TREE=1 pdflinkcheck help-tree` # bash
65
+ $env:DEV_TYPER_HELP_TREE = "1"; pdflinkcheck help-tree` # PowerShell
66
+ ```
67
+
68
+ ![Screenshot of the pdflinkcheck CLI Tree Help](https://raw.githubusercontent.com/City-of-Memphis-Wastewater/pdflinkcheck/main/assets/pdflinkcheck_cli_v1.3.3_tree_help.png)
69
+
71
70
 
72
71
 
73
72
  ### Available Commands
74
73
 
75
74
  |**Command**|**Description**|
76
75
  |---|---|
77
- |`pdflinkcheck analyze`|Analyzes a PDF file for links |
76
+ |`pdflinkcheck analyze`|Analyzes a PDF file for links and validates their reasonableness.|
78
77
  |`pdflinkcheck gui`|Explicitly launch the Graphical User Interface.|
79
78
  |`pdflinkcheck docs`|Access documentation, including the README and AGPLv3+ license.|
79
+ |`pdflinkcheck serve`|Serve a basic local web app which uses only the Python standard library.|
80
+ |`pdflinkcheck tools`|Access additional tools, like `--clear-cache`.|
80
81
 
81
82
  ### `analyze` Command Options
82
83
 
@@ -84,8 +85,7 @@ The core functionality is accessed via the `analyze` command.
84
85
  |---|---|---|
85
86
  |`<PDF_PATH>`|**Required.** The path to the PDF file to analyze.|N/A|
86
87
  |`--pdf-library / -p`|Select engine: `pymupdf` or `pypdf`.|`pypdf`|
87
- |`--export-format / -e`|Export to `JSON`, `TXT`, or `None` to suppress file output.|`JSON`|
88
- |`--max-links / -m`|Maximum links to display per section. Use `0` for all.|`0`|
88
+ |`--format / -f`|Export to `JSON`, `TXT`, `XLSX`, and/or `None` to suppress file output.|`JSON`|
89
89
 
90
90
  ### `gui` Command Options
91
91
 
@@ -96,11 +96,8 @@ The core functionality is accessed via the `analyze` command.
96
96
  #### Example Runs
97
97
 
98
98
  ```bash
99
- # Analyze a document, show all links, and save the report as JSON and TXT
100
- pdflinkcheck analyze "TE Maxson WWTF O&M Manual.pdf" --export-format JSON,TXT
101
-
102
- # Analyze a document but keep the print block short, showing only the first 10 links for each type
103
- pdflinkcheck analyze "TE Maxson WWTF O&M Manual.pdf" --max-links 10
99
+ # Analyze a document, show all links, and save the report as XLSX, JSON, and TXT
100
+ pdflinkcheck analyze "TE Maxson WWTF O&M Manual.pdf" --format xlsx -f json -f txt
104
101
 
105
102
  # Show the GUI for only a moment, like in a build check
106
103
  pdflinkcheck gui --auto-close 3000
@@ -113,27 +110,28 @@ pdflinkcheck docs --license --readme
113
110
 
114
111
  ## 📦 Library Access (Advanced)
115
112
 
116
- For developers importing `pdflinkcheck` into other Python projects, the core analysis functions are exposed directly in the root namespace:
113
+ 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.
117
114
 
118
- |**Function**|**Description**|
119
- |---|---|
120
- |`run_report()`|**(Primary function)** Performs the full analysis, prints to console, and handles file export.|
121
- |`extract_links_pynupdf()`|Function to retrieve all explicit links (URIs, GoTo, etc.) from a PDF path.|
122
- |`extract_toc_pymupdf()`|Function to extract the PDF's internal Table of Contents (bookmarks/outline).|
123
- |`extract_links_pynupdf()`|Function to retrieve all explicit links (URIs, GoTo, etc.) from a PDF path, using the pypdf library.|
124
- |`extract_toc_pymupdf()`|Function to extract the PDF's internal Table of Contents (bookmarks/outline), using the pypdf library.|
115
+ |**Function**|**Library**|**Description**|
116
+ |---|---|---|
117
+ |`run_report()`|pdflinkcheck | **(Primary function)** Performs the full analysis, prints to console, and handles file export.|
118
+ |`analyze_pdf_pdfium()`| pypdfium2 | Fast, ~10 mb, Permissively licensed |
119
+ |`analyze_pdf_pymupdf()`| PyMuPDF | Fast, ~30 mb, AGPL3+ licensed |
120
+ |`analyze_pdf_pypdf()`| pypdf library | Slow, ~2 mb, Permissively licensed |
125
121
 
126
122
  Exanple:
127
123
 
128
124
  ```python
129
- from pdflinkcheck.report import run_report
130
- from pdflinkcheck.analysis_pymupdf import extract_links_pymupdf, extract_toc_pymupdf 130 from pdflinkcheck.analysis_pymupdf import extract_links_pynupdf, extract_toc_pymupdf
131
- from pdflinkcheck.analysis_pypdf import extract_links_pypdf, extract_toc_pypdf
125
+ from pdflinkcheck import ( run_report,
126
+ analyze_pdf_pymupdf,
127
+ analyze_pdf_pypdf,
128
+ analyze_pdf_pdfium,
129
+ )
132
130
 
133
131
  file = "document1.pdf"
134
132
  report_data = run_report(file)
135
- links_pymupdf = extract_links_pymupdf(file)
136
- links_pypdf = extract_links_pypdf(file)
133
+ links_pdfium = analyze_pdf_pdfium(file)
134
+ links_pypdf = analyze_pdf_pypdf(file)
137
135
  ```
138
136
 
139
137
  -----
@@ -188,22 +186,34 @@ This `help-tree` feature has not yet been submitted for inclusion into Typer.
188
186
 
189
187
  ## ⚠️ Compatibility Notes
190
188
 
191
- #### Termux Compatibility as a Key Goal
189
+ ### Termux Compatibility as a Key Goal
192
190
  A key goal of City-of-Memphis-Wastewater is to release all software as Termux-compatible.
193
191
 
194
- Termux compatibility is important in the modern age as Android devices are common among technicians, field engineers, and maintenace staff.
192
+ Termux compatibility is important in the modern age, because Android devices are common among technicians, field engineers, and maintenace staff.
195
193
  Android is the most common operating system in the Global South.
196
194
  We aim to produce stable software that can do the most possible good.
197
195
 
198
- 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`!
199
- Now, there is PDF Engine selection in both the CLI and the GUI.
200
- `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.
196
+ Now `pdflinkcheck` can run on Termux by using the `pypdf` engine and the `pdfium` engine.
197
+ Benefits:
198
+ - `pypdf`-only artifacts, to reduce size to about 6% compared to artifacts that include `PyMuPDF`.
199
+ - Web-stack GUI as an alternative to the Tkinter GUI, which can be run locally on Termux or as a web app.
200
+
201
+
202
+ ### PDF Library Selection
203
+ 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+.
201
204
 
202
- Now that `pdflinkcheck` can run on Termux, we may find a work-around and be able to drop the PyMuPDF dependency.
203
- - Build `pypdf`-only artifacts, to reduce size.
204
- - Build a web-stack GUI as an alternative to the Tkinter GUI, to be compatible with Termux.
205
+ 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.
205
206
 
206
- Because it works, we plan to keep the `PyMuPDF` portion of the codebase.
207
+ To install the complete version use one of these options:
208
+
209
+ ```bash
210
+ pip install "pdflinkcheck[pymupdf]"
211
+ pipx install "pdflinkcheck[pdfium]"
212
+ uv tool install "pdflinkcheck[pdfium]"
213
+ uv add "pdflinkcheck[pdfium]"
214
+ ```
215
+
216
+ ---
207
217
 
208
218
  ### Document Compatibility:
209
219
  Not all PDF files can be processed successfully. This tool is designed primarily for digitally generated (vector-based) PDFs.
@@ -215,22 +225,6 @@ Processing may fail or yield incomplete results for:
215
225
 
216
226
  -----
217
227
 
218
- ## PDF Library Selection
219
- 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.
220
-
221
- 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.
222
-
223
- To install the complete version use one of these options:
224
-
225
- ```bash
226
- pip install "pdflinkcheck[full]"
227
- pipx install "pdflinkcheck[full]"
228
- uv tool install "pdflinkcheck[full]"
229
- uv add "pdflinkcheck[full]"
230
- ```
231
-
232
- -----
233
-
234
228
  ## Run from Source (Developers)
235
229
 
236
230
  ```bash
@@ -238,12 +232,12 @@ git clone http://github.com/city-of-memphis-wastewater/pdflinkcheck.git
238
232
  cd pdflinkcheck
239
233
 
240
234
  # To include the PyMuPDF dependency in the installation:
241
- uv sync --extras full
235
+ uv sync --extras pdfium --extra pymupdf
242
236
 
243
237
  # On Termux, to not include PyMuPDF:
244
- uv sync
238
+ uv sync --extra pdfium
245
239
 
246
- # To include developer depedecies:
240
+ # To include developer dependencies:
247
241
  uv sync --all-extras --group dev
248
242
 
249
243
  # Run the CLI
@@ -257,22 +251,28 @@ uv run python -m pdflinkcheck.stdlib_server
257
251
 
258
252
  ## 📜 License Implications (AGPLv3+)
259
253
 
260
- **`pdflinkcheck` is licensed under the `GNU Affero General Public License` version 3 or later (`AGPLv3+`).**
261
254
 
262
- The `AGPL3+` is required for portions of this codebase because `pdflinkcheck` uses `PyMuPDF`, which is licensed under the `AGPL3`.
255
+ The `AGPL3-or-later` is required for binaries of `pdflinkcheck` which include `PyMuPDF`, which is licensed under the `AGPL3`.
256
+ The source code itself for `pdflinkcheck` is licensed under the `MIT`.
263
257
 
264
- 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.
265
- 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.
266
-
267
- This license has significant implications for **distribution and network use**, particularly for organizations:
258
+ The AGPL3-or-later license has significant implications for **distribution and network use**, particularly for organizations:
268
259
 
269
260
  * **Source Code Provision:** If you distribute this tool (modified or unmodified) to anyone, you **must** provide the full source code under the same license.
270
261
  * **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.
271
262
 
272
263
  > **Before deploying or modifying this tool for organizational use, especially for internal web services or distribution, please ensure compliance with the AGPLv3+ terms.**
273
264
 
265
+ 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.
266
+
267
+ The source code of pdflinkcheck itself remains licensed under the **MIT License**; only the distributed binary becomes AGPL‑licensed when PyMuPDF is included.
268
+
269
+
274
270
  Links:
275
271
  - Source code: https://github.com/City-of-Memphis-Wastewater/pdflinkcheck/
276
- - Official AGPLv3 Text (FSF): https://www.gnu.org/licenses/agpl-3.0.html
272
+ - PyMuPDF source code: https://github.com/pymupdf/PyMuPDF/
273
+ - pypdfium2 source code: https://github.com/pypdfium2-team/pypdfium2
274
+ - pypdf source code: https://github.com/py-pdf/pypdf/
275
+ - AGPLv3 text (FSF): https://www.gnu.org/licenses/agpl-3.0.html
276
+ - MIT License text: https://opensource.org/license/mit
277
277
 
278
278
  Copyright © 2025 George Clayton Bennett