blob: 19452946ffc737a132e408498255711b4eebfb62 [file]
"""Check an exported archive against its source-coverage manifest."""
import argparse
import hashlib
import json
from pathlib import Path
from pypdf import PdfReader
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('directory', type=Path)
parser.add_argument('--allow-missing-images', action='store_true')
args = parser.parse_args()
directory = args.directory
manifest = json.loads((directory / 'manifest.json').read_text())
assert manifest['files'], 'No PDF files in manifest'
for item in manifest['files']:
assert args.allow_missing_images or not item['imageWarnings'], item['filename']
file = directory / item['filename']
data = file.read_bytes()
assert len(data) == item['bytes'], file
assert hashlib.sha256(data).hexdigest() == item['sha256'], file
reader = PdfReader(file)
assert len(reader.pages) == item['pages'], file
assert len(reader.outline) == item['documents'] + 1, file
assert len(set(item['sourceFiles'])) == item['documents'], file
assert reader.metadata.author == 'Apache Doris', file
for page in reader.pages:
for ref in page.get('/Annots', []):
uri = str(ref.get_object().get('/A', {}).get('/URI', ''))
assert 'archive.invalid' not in uri, (file, uri)
sample = sorted({index for index in [0, 1, 30, len(reader.pages) // 2, len(reader.pages) - 1] if index < len(reader.pages)})
for index in sample:
text = reader.pages[index].extract_text()
assert text.strip(), (file, index)
assert '\ufffd' not in text, (file, index)
print(json.dumps({'file': item['filename'], 'pages': len(reader.pages),
'documents': item['documents'], 'imageWarnings': len(item['imageWarnings']),
'status': 'pass'}))