Experimental change to use qpdf to merge files (disables Ghostscript)
All but one tests pass, test_input_file_not_a_pdf Not sure if PyPDF2 metadata generation will mangle the first page.
This commit is contained in:
+25
-4
@@ -1134,8 +1134,8 @@ def merge_pages_ghostscript(
|
||||
@active_if(options.output_type == 'pdf')
|
||||
@merge(
|
||||
input=[add_text_layer, render_hocr_debug_page, skip_page,
|
||||
tesseract_ocr_and_render_pdf],
|
||||
output=os.path.join(work_folder, 'merged_nometadata.pdf'),
|
||||
tesseract_ocr_and_render_pdf, repair_pdf],
|
||||
output=os.path.join(work_folder, 'merged.pdf'),
|
||||
extras=[_log, _pdfinfo, _pdfinfo_lock])
|
||||
def merge_pages_qpdf(
|
||||
input_files,
|
||||
@@ -1144,6 +1144,10 @@ def merge_pages_qpdf(
|
||||
pdfinfo,
|
||||
pdfinfo_lock):
|
||||
|
||||
metadata_file = next(
|
||||
(ii for ii in input_files if ii.endswith('.repaired.pdf')))
|
||||
input_files.remove(metadata_file)
|
||||
|
||||
def input_file_order(s):
|
||||
'''Sort order: All rendered pages followed
|
||||
by their debug page.'''
|
||||
@@ -1154,10 +1158,27 @@ def merge_pages_qpdf(
|
||||
|
||||
pdf_pages = sorted(input_files, key=input_file_order)
|
||||
log.debug("Final pages: " + "\n".join(pdf_pages))
|
||||
|
||||
reader_metadata = pypdf.PdfFileReader(metadata_file)
|
||||
pdfmark = get_pdfmark(reader_metadata)
|
||||
pdfmark['/Producer'] = 'qpdf ' + qpdf.version()
|
||||
|
||||
first_page = pypdf.PdfFileReader(pdf_pages[0])
|
||||
|
||||
writer = pypdf.PdfFileWriter()
|
||||
writer.appendPagesFromReader(first_page)
|
||||
writer.addMetadata(pdfmark)
|
||||
writer_file = pdf_pages[0].replace('.pdf', '.metadata.pdf')
|
||||
with open(writer_file, 'wb') as f:
|
||||
writer.write(f)
|
||||
|
||||
pdf_pages[0] = writer_file
|
||||
|
||||
qpdf.merge(pdf_pages, output_file)
|
||||
|
||||
|
||||
@active_if(options.output_type == 'pdf')
|
||||
#@active_if(options.output_type == 'pdf')
|
||||
@active_if(False)
|
||||
@merge(
|
||||
input=[merge_pages_qpdf, repair_pdf],
|
||||
output=os.path.join(work_folder, 'merged.pdf'),
|
||||
@@ -1188,7 +1209,7 @@ def copy_metadata(
|
||||
|
||||
|
||||
@merge(
|
||||
input=[merge_pages_ghostscript, copy_metadata],
|
||||
input=[merge_pages_ghostscript, merge_pages_qpdf],
|
||||
output=options.output_file,
|
||||
extras=[_log, _pdfinfo, _pdfinfo_lock])
|
||||
def copy_final(
|
||||
|
||||
+21
-1
@@ -2,12 +2,32 @@
|
||||
# © 2015 James R. Barlow: github.com/jbarlow83
|
||||
|
||||
from subprocess import CalledProcessError, check_output, STDOUT, check_call
|
||||
from functools import lru_cache
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
|
||||
from . import ExitCode, get_program
|
||||
|
||||
|
||||
@lru_cache(maxsize=1)
|
||||
def version():
|
||||
args_qpdf = [
|
||||
get_program('qpdf'),
|
||||
'--version'
|
||||
]
|
||||
try:
|
||||
versions = check_output(
|
||||
args_qpdf, close_fds=True, universal_newlines=True,
|
||||
stderr=STDOUT)
|
||||
except CalledProcessError:
|
||||
print("Could not find qpdf executable on system PATH.")
|
||||
sys.exit(ExitCode.missing_dependency)
|
||||
|
||||
qpdf_version = re.match(r'qpdf version (.+)', versions).group(1)
|
||||
return qpdf_version
|
||||
|
||||
|
||||
def check(input_file, log):
|
||||
args_qpdf = [
|
||||
get_program('qpdf'),
|
||||
@@ -20,7 +40,7 @@ def check(input_file, log):
|
||||
except CalledProcessError as e:
|
||||
if e.returncode == 2:
|
||||
log.error("{0}: not a valid PDF, and could not repair it.".format(
|
||||
input_file))
|
||||
input_file))
|
||||
log.error("Details:")
|
||||
log.error(e.output)
|
||||
elif e.returncode == 3:
|
||||
|
||||
Reference in New Issue
Block a user