opendataloader-pdf 1.0.6__py3-none-any.whl → 1.1.1__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.
Potentially problematic release.
This version of opendataloader-pdf might be problematic. Click here for more details.
- opendataloader_pdf/__init__.py +2 -2
- opendataloader_pdf/jar/opendataloader-pdf-cli.jar +0 -0
- opendataloader_pdf/wrapper.py +113 -79
- {opendataloader_pdf-1.0.6.dist-info → opendataloader_pdf-1.1.1.dist-info}/METADATA +38 -36
- {opendataloader_pdf-1.0.6.dist-info → opendataloader_pdf-1.1.1.dist-info}/RECORD +8 -8
- {opendataloader_pdf-1.0.6.dist-info → opendataloader_pdf-1.1.1.dist-info}/WHEEL +0 -0
- {opendataloader_pdf-1.0.6.dist-info → opendataloader_pdf-1.1.1.dist-info}/entry_points.txt +0 -0
- {opendataloader_pdf-1.0.6.dist-info → opendataloader_pdf-1.1.1.dist-info}/top_level.txt +0 -0
opendataloader_pdf/__init__.py
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
from .wrapper import run
|
|
1
|
+
from .wrapper import run, convert
|
|
2
2
|
|
|
3
|
-
__all__ = ["run"]
|
|
3
|
+
__all__ = ["run", "convert"]
|
|
Binary file
|
opendataloader_pdf/wrapper.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import subprocess
|
|
3
3
|
import sys
|
|
4
|
-
import importlib.resources as
|
|
4
|
+
import importlib.resources as resources
|
|
5
5
|
import locale
|
|
6
6
|
from pathlib import Path
|
|
7
|
+
from typing import List, Optional
|
|
7
8
|
|
|
8
9
|
# The consistent name of the JAR file bundled with the package
|
|
9
10
|
_JAR_NAME = "opendataloader-pdf-cli.jar"
|
|
@@ -41,9 +42,6 @@ def run(
|
|
|
41
42
|
no_json: If True, disable the JSON output.
|
|
42
43
|
debug: If True, prints all messages from the CLI to the console during execution.
|
|
43
44
|
|
|
44
|
-
Returns:
|
|
45
|
-
The stdout from the CLI tool if successful.
|
|
46
|
-
|
|
47
45
|
Raises:
|
|
48
46
|
FileNotFoundError: If the 'java' command is not found or input_path is invalid.
|
|
49
47
|
subprocess.CalledProcessError: If the CLI tool returns a non-zero exit code.
|
|
@@ -52,6 +50,7 @@ def run(
|
|
|
52
50
|
raise FileNotFoundError(f"Input file or folder not found: {input_path}")
|
|
53
51
|
|
|
54
52
|
args = []
|
|
53
|
+
args.append(input_path)
|
|
55
54
|
if output_folder:
|
|
56
55
|
args.extend(["--output-dir", output_folder])
|
|
57
56
|
if password:
|
|
@@ -75,49 +74,94 @@ def run(
|
|
|
75
74
|
if no_json:
|
|
76
75
|
args.append("--no-json")
|
|
77
76
|
|
|
78
|
-
|
|
77
|
+
# Run the command
|
|
78
|
+
run_jar(args, quiet=not debug)
|
|
79
|
+
|
|
79
80
|
|
|
81
|
+
def convert(
|
|
82
|
+
input_path: List[str],
|
|
83
|
+
output_dir: Optional[str] = None,
|
|
84
|
+
password: Optional[str] = None,
|
|
85
|
+
format: Optional[List[str]] = None,
|
|
86
|
+
quiet: bool = False,
|
|
87
|
+
content_safety_off: Optional[List[str]] = None,
|
|
88
|
+
keep_line_breaks: bool = False,
|
|
89
|
+
replace_invalid_chars: Optional[str] = None,
|
|
90
|
+
) -> None:
|
|
91
|
+
"""
|
|
92
|
+
Convert PDF(s) into the requested output format(s).
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
input_path: One or more input PDF file paths or directories
|
|
96
|
+
output_dir: Directory where outputs are written
|
|
97
|
+
password: Password for encrypted PDFs
|
|
98
|
+
format: List of output formats (e.g., ["json", "html"])
|
|
99
|
+
quiet: Suppress CLI logging output
|
|
100
|
+
content_safety_off: List of content safety filters to disable
|
|
101
|
+
keep_line_breaks: Preserve line breaks in text output
|
|
102
|
+
replace_invalid_chars: Replacement character for invalid/unrecognized characters
|
|
103
|
+
"""
|
|
104
|
+
args: List[str] = []
|
|
105
|
+
args.extend(input_path)
|
|
106
|
+
if output_dir:
|
|
107
|
+
args.extend(["--output-dir", output_dir])
|
|
108
|
+
if password:
|
|
109
|
+
args.extend(["--password", password])
|
|
110
|
+
if format:
|
|
111
|
+
args.extend(["--format", *format])
|
|
112
|
+
if quiet:
|
|
113
|
+
args.append("--quiet")
|
|
114
|
+
if content_safety_off:
|
|
115
|
+
args.extend(["--content-safety-off", *content_safety_off])
|
|
116
|
+
if keep_line_breaks:
|
|
117
|
+
args.append("--keep-line-breaks")
|
|
118
|
+
if replace_invalid_chars:
|
|
119
|
+
args.extend(["--replace-invalid-chars", replace_invalid_chars])
|
|
120
|
+
|
|
121
|
+
# Run the command
|
|
122
|
+
run_jar(args, quiet)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def run_jar(args: List[str], quiet: bool = False) -> str:
|
|
126
|
+
"""Run the opendataloader-pdf JAR with the given arguments."""
|
|
80
127
|
try:
|
|
81
|
-
#
|
|
82
|
-
jar_ref =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
with importlib_resources.as_file(jar_ref) as jar_path:
|
|
86
|
-
command = ["java", "-jar", str(jar_path)] + args
|
|
128
|
+
# Access the embedded JAR inside the package
|
|
129
|
+
jar_ref = resources.files("opendataloader_pdf").joinpath("jar", _JAR_NAME)
|
|
130
|
+
with resources.as_file(jar_ref) as jar_path:
|
|
131
|
+
command = ["java", "-jar", str(jar_path), *args]
|
|
87
132
|
|
|
88
|
-
if
|
|
89
|
-
|
|
133
|
+
if quiet:
|
|
134
|
+
# Quiet mode → capture all output
|
|
135
|
+
result = subprocess.run(
|
|
90
136
|
command,
|
|
91
|
-
|
|
92
|
-
stderr=subprocess.STDOUT,
|
|
137
|
+
capture_output=True,
|
|
93
138
|
text=True,
|
|
139
|
+
check=True,
|
|
94
140
|
encoding=locale.getpreferredencoding(False),
|
|
95
141
|
)
|
|
142
|
+
return result.stdout
|
|
96
143
|
|
|
97
|
-
|
|
98
|
-
|
|
144
|
+
# Streaming mode → live output
|
|
145
|
+
with subprocess.Popen(
|
|
146
|
+
command,
|
|
147
|
+
stdout=subprocess.PIPE,
|
|
148
|
+
stderr=subprocess.STDOUT,
|
|
149
|
+
text=True,
|
|
150
|
+
encoding=locale.getpreferredencoding(False),
|
|
151
|
+
) as process:
|
|
152
|
+
output_lines: List[str] = []
|
|
153
|
+
for line in process.stdout:
|
|
99
154
|
sys.stdout.write(line)
|
|
100
155
|
output_lines.append(line)
|
|
101
156
|
|
|
102
|
-
process.stdout.close()
|
|
103
157
|
return_code = process.wait()
|
|
104
158
|
captured_output = "".join(output_lines)
|
|
105
159
|
|
|
106
160
|
if return_code:
|
|
107
|
-
# Manually raise error with the combined output
|
|
108
161
|
raise subprocess.CalledProcessError(
|
|
109
162
|
return_code, command, output=captured_output
|
|
110
163
|
)
|
|
111
164
|
return captured_output
|
|
112
|
-
else:
|
|
113
|
-
result = subprocess.run(
|
|
114
|
-
command,
|
|
115
|
-
capture_output=True,
|
|
116
|
-
text=True,
|
|
117
|
-
check=True,
|
|
118
|
-
encoding=locale.getpreferredencoding(False),
|
|
119
|
-
)
|
|
120
|
-
return result.stdout
|
|
121
165
|
|
|
122
166
|
except FileNotFoundError:
|
|
123
167
|
print(
|
|
@@ -126,16 +170,16 @@ def run(
|
|
|
126
170
|
)
|
|
127
171
|
raise
|
|
128
172
|
|
|
129
|
-
except subprocess.CalledProcessError as
|
|
173
|
+
except subprocess.CalledProcessError as error:
|
|
130
174
|
print("Error running opendataloader-pdf CLI.", file=sys.stderr)
|
|
131
|
-
print(f"Return code: {
|
|
132
|
-
if
|
|
133
|
-
print(f"Output: {
|
|
134
|
-
|
|
135
|
-
print(f"Stderr: {
|
|
136
|
-
if
|
|
137
|
-
print(f"Stdout: {
|
|
138
|
-
raise
|
|
175
|
+
print(f"Return code: {error.returncode}", file=sys.stderr)
|
|
176
|
+
if error.output:
|
|
177
|
+
print(f"Output: {error.output}", file=sys.stderr)
|
|
178
|
+
if error.stderr:
|
|
179
|
+
print(f"Stderr: {error.stderr}", file=sys.stderr)
|
|
180
|
+
if error.stdout:
|
|
181
|
+
print(f"Stdout: {error.stdout}", file=sys.stderr)
|
|
182
|
+
raise
|
|
139
183
|
|
|
140
184
|
|
|
141
185
|
def main(argv=None) -> int:
|
|
@@ -143,39 +187,47 @@ def main(argv=None) -> int:
|
|
|
143
187
|
parser = argparse.ArgumentParser(
|
|
144
188
|
description="Run the opendataloader-pdf CLI using the bundled JAR."
|
|
145
189
|
)
|
|
146
|
-
parser.add_argument(
|
|
190
|
+
parser.add_argument(
|
|
191
|
+
"input_path", nargs="+", help="Path to the input PDF file or directory."
|
|
192
|
+
)
|
|
147
193
|
parser.add_argument(
|
|
148
194
|
"-o",
|
|
149
195
|
"--output-dir",
|
|
150
|
-
dest="output_folder",
|
|
151
196
|
help="Directory where outputs are written.",
|
|
152
197
|
)
|
|
153
198
|
parser.add_argument("-p", "--password", help="Password for encrypted PDFs.")
|
|
154
199
|
parser.add_argument(
|
|
155
|
-
"
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
200
|
+
"-f",
|
|
201
|
+
"--format",
|
|
202
|
+
nargs="+",
|
|
203
|
+
choices=[
|
|
204
|
+
"json",
|
|
205
|
+
"text",
|
|
206
|
+
"html",
|
|
207
|
+
"pdf",
|
|
208
|
+
"markdown",
|
|
209
|
+
"markdown-with-html",
|
|
210
|
+
"markdown-with-images",
|
|
211
|
+
],
|
|
212
|
+
help="Output format(s) to generate.",
|
|
167
213
|
)
|
|
168
214
|
parser.add_argument(
|
|
169
|
-
"
|
|
170
|
-
|
|
215
|
+
"-q",
|
|
216
|
+
"--quiet",
|
|
171
217
|
action="store_true",
|
|
172
|
-
help="
|
|
218
|
+
help="Suppress CLI logging output.",
|
|
173
219
|
)
|
|
174
220
|
parser.add_argument(
|
|
175
|
-
"--
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
221
|
+
"--content-safety-off",
|
|
222
|
+
nargs="+",
|
|
223
|
+
choices=[
|
|
224
|
+
"all",
|
|
225
|
+
"hidden-text",
|
|
226
|
+
"off-page",
|
|
227
|
+
"tiny",
|
|
228
|
+
"hidden-ocg",
|
|
229
|
+
],
|
|
230
|
+
help="Disables one or more content safety filters. Accepts a list of filter names.",
|
|
179
231
|
)
|
|
180
232
|
parser.add_argument(
|
|
181
233
|
"--keep-line-breaks",
|
|
@@ -183,31 +235,13 @@ def main(argv=None) -> int:
|
|
|
183
235
|
help="Preserve line breaks in text output.",
|
|
184
236
|
)
|
|
185
237
|
parser.add_argument(
|
|
186
|
-
"--
|
|
187
|
-
|
|
188
|
-
action="store_true",
|
|
189
|
-
help="Allow raw HTML within Markdown output.",
|
|
190
|
-
)
|
|
191
|
-
parser.add_argument(
|
|
192
|
-
"--markdown-with-images",
|
|
193
|
-
dest="add_image_to_markdown",
|
|
194
|
-
action="store_true",
|
|
195
|
-
help="Embed images in Markdown output.",
|
|
196
|
-
)
|
|
197
|
-
parser.add_argument(
|
|
198
|
-
"--no-json",
|
|
199
|
-
action="store_true",
|
|
200
|
-
help="Disable JSON output generation.",
|
|
201
|
-
)
|
|
202
|
-
parser.add_argument(
|
|
203
|
-
"--debug",
|
|
204
|
-
action="store_true",
|
|
205
|
-
help="Stream CLI logs directly to stdout.",
|
|
238
|
+
"--replace-invalid-chars",
|
|
239
|
+
help="Replacement character for invalid or unrecognized characters.",
|
|
206
240
|
)
|
|
207
241
|
args = parser.parse_args(argv)
|
|
208
242
|
|
|
209
243
|
try:
|
|
210
|
-
|
|
244
|
+
convert(**vars(args))
|
|
211
245
|
except FileNotFoundError as err:
|
|
212
246
|
print(err, file=sys.stderr)
|
|
213
247
|
return 1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opendataloader-pdf
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.1
|
|
4
4
|
Summary: A Python wrapper for the opendataloader-pdf Java CLI.
|
|
5
5
|
Home-page: https://github.com/opendataloader-project/opendataloader-pdf
|
|
6
6
|
Author: opendataloader-project
|
|
@@ -97,47 +97,42 @@ pip install -U opendataloader-pdf
|
|
|
97
97
|
|
|
98
98
|
### Usage
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
- If you don’t specify an output_folder, the output data will be saved in the same directory as the input document.
|
|
100
|
+
input_path can be either the path to a single document or the path to a folder.
|
|
102
101
|
|
|
103
102
|
```python
|
|
104
103
|
import opendataloader_pdf
|
|
105
104
|
|
|
106
|
-
opendataloader_pdf.
|
|
107
|
-
input_path="path/to/document.pdf",
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
generate_html=True,
|
|
111
|
-
generate_annotated_pdf=True,
|
|
112
|
-
debug=True,
|
|
105
|
+
opendataloader_pdf.convert(
|
|
106
|
+
input_path=["path/to/document.pdf", "path/to/folder"],
|
|
107
|
+
output_dir="path/to/output",
|
|
108
|
+
format=["json", "html", "pdf", "markdown"]
|
|
113
109
|
)
|
|
114
110
|
```
|
|
115
111
|
|
|
116
|
-
|
|
112
|
+
If you want to run it via CLI, you can use the following command on the terminal:
|
|
117
113
|
|
|
118
|
-
```
|
|
119
|
-
opendataloader-pdf path/to/document.pdf
|
|
114
|
+
```bash
|
|
115
|
+
opendataloader-pdf path/to/document.pdf path/to/folder -o path/to/output -f json html pdf markdown
|
|
120
116
|
```
|
|
121
117
|
|
|
122
|
-
### Function:
|
|
118
|
+
### Function: convert()
|
|
123
119
|
|
|
124
120
|
The main function to process PDFs.
|
|
125
121
|
|
|
126
|
-
| Parameter | Type
|
|
127
|
-
|
|
128
|
-
| `input_path` | `str`
|
|
129
|
-
| `
|
|
130
|
-
| `password` | `str`
|
|
131
|
-
| `
|
|
132
|
-
| `
|
|
133
|
-
| `
|
|
134
|
-
| `
|
|
135
|
-
| `
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
| `debug` | `bool` | No | `False` | If `True`, prints CLI messages to the console during execution. |
|
|
122
|
+
| Parameter | Type | Required | Default | Description |
|
|
123
|
+
|--------------------------|----------------| -------- |--------------|---------------------------------------------------------------------------------------------------------------------------------------------|
|
|
124
|
+
| `input_path` | `List[str]` | ✅ Yes | — | One or more PDF file paths or directories to process. |
|
|
125
|
+
| `output_dir` | `Optional[str]` | No | input folder | Directory where outputs are written. |
|
|
126
|
+
| `password` | `Optional[str]` | No | `None` | Password used for encrypted PDFs. |
|
|
127
|
+
| `format` | `Optional[List[str]]` | No | `None` | Output formats to generate (e.g. `"json"`, `"html"`, `"pdf"`, `"text"`, `"markdown"`, `"markdown-with-html"`, `"markdown-with-images"`). |
|
|
128
|
+
| `quiet` | `bool` | No | `False` | Suppresses CLI logging output when `True`. |
|
|
129
|
+
| `content_safety_off` | `Optional[List[str]]` | No | `None` | List of content safety filters to disable (e.g. `"all"`, `"hidden-text"`, `"off-page"`, `"tiny"`, `"hidden-ocg"`). |
|
|
130
|
+
| `keep_line_breaks` | `bool` | No | `False` | Preserves line breaks in text output when `True`. |
|
|
131
|
+
| `replace_invalid_chars` | `Optional[str]` | No | `None` | Replacement character for invalid or unrecognized characters (e.g., �, `\u0000`). |
|
|
132
|
+
|
|
133
|
+
### Function: run()
|
|
134
|
+
|
|
135
|
+
Deprecated.
|
|
141
136
|
|
|
142
137
|
<br/>
|
|
143
138
|
|
|
@@ -368,16 +363,23 @@ The images are extracted from PDF as individual files and stored in a subfolder
|
|
|
368
363
|
```
|
|
369
364
|
Options:
|
|
370
365
|
-o,--output-dir <arg> Specifies the output directory for generated files
|
|
366
|
+
-p,--password <arg> Specifies the password for an encrypted PDF
|
|
367
|
+
-f,--format <arg> List of output formats to generate (json, text, html, pdf, markdown, markdown-with-html, markdown-with-images). Default: json
|
|
368
|
+
-q,--quiet Suppresses console logging output
|
|
369
|
+
--content-safety-off <arg> Disables one or more content safety filters. Accepts a list of filter names. Arguments: all, hidden-text, off-page, tiny, hidden-ocg
|
|
371
370
|
--keep-line-breaks Preserves original line breaks in the extracted text
|
|
372
|
-
--
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
371
|
+
--replace-invalid-chars <arg> Replaces invalid or unrecognized characters (e.g., �, \u0000) with the specified character
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
The legacy options (for backward compatibility):
|
|
375
|
+
|
|
376
|
+
```
|
|
377
377
|
--no-json Disables the JSON output format
|
|
378
|
-
|
|
378
|
+
--html Sets the data extraction output format to HTML
|
|
379
379
|
--pdf Generates a new PDF file where the extracted layout data is visualized as annotations
|
|
380
|
-
--
|
|
380
|
+
--markdown Sets the data extraction output format to Markdown
|
|
381
|
+
--markdown-with-html Sets the data extraction output format to Markdown with rendering complex elements like tables as HTML for better structure
|
|
382
|
+
--markdown-with-images Sets the data extraction output format to Markdown with extracting images from the PDF and includes them as links
|
|
381
383
|
```
|
|
382
384
|
|
|
383
385
|
### Schema of the JSON output
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
opendataloader_pdf/LICENSE,sha256=rxdbnZbuk8IaA2FS4bkFsLlTBNSujCySHHYJEAuo334,15921
|
|
2
2
|
opendataloader_pdf/NOTICE.md,sha256=Uxc6sEbVz2hfsDinzzSNMtmsjx9HsQUod0yy0cswUwg,562
|
|
3
|
-
opendataloader_pdf/__init__.py,sha256=
|
|
3
|
+
opendataloader_pdf/__init__.py,sha256=xkTyVWNu1W2YrI1tPpGnd11DwwcwFDyBp8b4agLdd7A,64
|
|
4
4
|
opendataloader_pdf/__main__.py,sha256=lmla4yz3SaYBfRJXOXnwO_8ID31-Ja20aQmomiz1eEc,84
|
|
5
|
-
opendataloader_pdf/wrapper.py,sha256=
|
|
5
|
+
opendataloader_pdf/wrapper.py,sha256=h7QhPlHKFRL-ppeU2ZO-M7HKMFBJARPOENJhKRnMtFE,8477
|
|
6
6
|
opendataloader_pdf/THIRD_PARTY/THIRD_PARTY_LICENSES.md,sha256=QRYYiXFS2zBDGdmWRo_SrRfGhrdRBwhiRo1SdUKfrQo,11235
|
|
7
7
|
opendataloader_pdf/THIRD_PARTY/THIRD_PARTY_NOTICES.md,sha256=pB2ZitFM1u0x3rIDpMHsLxOe4OFNCZRqkzeR-bfpFzE,8911
|
|
8
8
|
opendataloader_pdf/THIRD_PARTY/licenses/Apache-2.0.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
@@ -14,9 +14,9 @@ opendataloader_pdf/THIRD_PARTY/licenses/LICENSE-JJ2000.txt,sha256=itSesIy3XiNWgJ
|
|
|
14
14
|
opendataloader_pdf/THIRD_PARTY/licenses/MIT.txt,sha256=JPCdbR3BU0uO_KypOd3sGWnKwlVHGq4l0pmrjoGtop8,1078
|
|
15
15
|
opendataloader_pdf/THIRD_PARTY/licenses/MPL-2.0.txt,sha256=CGF6Fx5WV7DJmRZJ8_6w6JEt2N9bu4p6zDo18fTHHRw,15818
|
|
16
16
|
opendataloader_pdf/THIRD_PARTY/licenses/Plexus Classworlds License.txt,sha256=ZQuKXwVz4FeC34ApB20vYg8kPTwgIUKRzEk5ew74-hU,1937
|
|
17
|
-
opendataloader_pdf/jar/opendataloader-pdf-cli.jar,sha256=
|
|
18
|
-
opendataloader_pdf-1.
|
|
19
|
-
opendataloader_pdf-1.
|
|
20
|
-
opendataloader_pdf-1.
|
|
21
|
-
opendataloader_pdf-1.
|
|
22
|
-
opendataloader_pdf-1.
|
|
17
|
+
opendataloader_pdf/jar/opendataloader-pdf-cli.jar,sha256=WjlTt3xWmCO_shYd8b13G_SdidD0Y2CqZiAbbh360vc,20485422
|
|
18
|
+
opendataloader_pdf-1.1.1.dist-info/METADATA,sha256=Rn2U8ighQJivylQGtf1mvZwgK0wqh6lIAM3r9Yjn-mw,25270
|
|
19
|
+
opendataloader_pdf-1.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
20
|
+
opendataloader_pdf-1.1.1.dist-info/entry_points.txt,sha256=Tupa9pVNF6nXD9sqzCLI8PCHbSu0jKkL3SYyTkQy0dc,71
|
|
21
|
+
opendataloader_pdf-1.1.1.dist-info/top_level.txt,sha256=xee0qFQd6HPfS50E2NLICGuR6cq9C9At5SJ81yv5HkY,19
|
|
22
|
+
opendataloader_pdf-1.1.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|