Detect when metadata is dropped during PDF/A conversion

This commit is contained in:
James R. Barlow
2018-12-30 00:13:25 -08:00
parent 1ca1221432
commit b4a51907d6
2 changed files with 57 additions and 6 deletions
+19 -5
View File
@@ -878,19 +878,19 @@ def metadata_fixup(
options = context.get_options()
input_files = list(f for f in flatten_groups(input_files_groups))
metadata_file = next(
original_file = next(
(ii for ii in input_files if ii.endswith('.repaired.pdf')), None
)
layers_file = next(
(ii for ii in input_files if ii.endswith('layers.rendered.pdf')), None
)
pdfa = next(
pdfa_file = next(
(ii for ii in input_files if ii.endswith('pdfa.pdf')), None
)
metadata = pikepdf.open(metadata_file)
docinfo = get_docinfo(metadata, options)
original = pikepdf.open(original_file)
docinfo = get_docinfo(original, options)
working_file = pdfa if pdfa else layers_file
working_file = pdfa_file if pdfa_file else layers_file
pdf = pikepdf.open(working_file)
with pdf.open_metadata() as meta:
@@ -899,6 +899,20 @@ def metadata_fixup(
# match Ghostscript, for consistency
if 'xmp:CreateDate' not in meta:
meta['xmp:CreateDate'] = meta.get('xmp:ModifyDate', '')
if pdfa_file:
meta_original = original.open_metadata()
not_copied = set(meta_original.keys()) - set(meta.keys())
if not_copied:
log.warning(
"Some input metadata could not be copied because it is not "
"permitted in PDF/A. You may wish to examine the output "
"PDF's XMP metadata."
)
log.debug(
"The following metadata fields were not copied: %r",
not_copied
)
pdf.save(output_file, compress_streams=True,
object_stream_mode=pikepdf.ObjectStreamMode.generate)
+38 -1
View File
@@ -21,8 +21,9 @@ import pytest
from datetime import timezone
from pathlib import Path
from shutil import copyfile
from unittest.mock import patch
from unittest.mock import patch, MagicMock
import datetime
from shutil import copyfile
import pikepdf
from pikepdf.models.metadata import decode_pdf_date
@@ -278,3 +279,39 @@ def test_kodak_toc(resources, outpdf, spoof_tesseract_noop):
if pikepdf.Name.First in p.root.Outlines:
assert isinstance(p.root.Outlines.First, pikepdf.Dictionary)
def test_metadata_fixup_warning(resources, outdir):
from ocrmypdf._pipeline import metadata_fixup
input_files = [
str(outdir / 'graph.repaired.pdf'),
str(outdir / 'layers.rendered.pdf'),
str(outdir / 'pdfa.pdf'), # It is okay that this is not a PDF/A
]
for f in input_files:
copyfile(resources / 'graph.pdf', f)
log = MagicMock()
context = MagicMock()
metadata_fixup(
input_files_groups=input_files,
output_file=outdir / 'out.pdf',
log=log,
context=context)
log.warning.assert_not_called()
# Now add some metadata that will not be copyable
graph = pikepdf.open(outdir / 'graph.repaired.pdf')
with graph.open_metadata() as meta:
meta['prism2:publicationName'] = 'OCRmyPDF Test'
graph.save(outdir / 'graph.repaired.pdf')
log = MagicMock()
context = MagicMock()
metadata_fixup(
input_files_groups=input_files,
output_file=outdir / 'out.pdf',
log=log,
context=context)
log.warning.assert_called_once()