Can now generate PDF/A files, multipage and single page
This commit is contained in:
+65
-8
@@ -1,31 +1,33 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from contextlib import suppress
|
||||
from tempfile import NamedTemporaryFile
|
||||
import sys
|
||||
import os.path
|
||||
import os
|
||||
import fileinput
|
||||
import re
|
||||
from parse import parse
|
||||
import PyPDF2 as pypdf
|
||||
import shutil
|
||||
from contextlib import suppress
|
||||
import warnings
|
||||
import multiprocessing
|
||||
|
||||
import PyPDF2 as pypdf
|
||||
from parse import parse
|
||||
|
||||
from subprocess import Popen, check_call, PIPE, CalledProcessError, \
|
||||
TimeoutExpired
|
||||
try:
|
||||
from subprocess import DEVNULL
|
||||
except ImportError:
|
||||
import os
|
||||
DEVNULL = open(os.devnull, 'wb')
|
||||
|
||||
|
||||
from ruffus import transform, suffix, merge, active_if, regex, jobs_limit, \
|
||||
mkdir, formatter, follows, subdivide
|
||||
import ruffus.cmdline as cmdline
|
||||
import warnings
|
||||
import multiprocessing
|
||||
|
||||
from .hocrtransform import HocrTransform
|
||||
from .pageinfo import pdf_get_all_pageinfo
|
||||
from .pdfa import generate_pdfa_def
|
||||
|
||||
|
||||
warnings.simplefilter('ignore', pypdf.utils.PdfReadWarning)
|
||||
@@ -277,11 +279,66 @@ def split_pages(
|
||||
]
|
||||
check_call(args_pdfseparate)
|
||||
|
||||
log.info(pdfinfo[0]['width_inches'])
|
||||
|
||||
@transform(
|
||||
input=split_pages,
|
||||
filter=suffix('.page.pdf'),
|
||||
output='.done.pdf',
|
||||
output_dir=options.temp_folder,
|
||||
extras=[_log, _pdfinfo, _pdfinfo_lock])
|
||||
def noop(
|
||||
input_file,
|
||||
output_file,
|
||||
log,
|
||||
pdfinfo,
|
||||
pdfinfo_lock):
|
||||
shutil.copy(input_file, output_file)
|
||||
|
||||
|
||||
@transform(
|
||||
input=clean_pdf,
|
||||
filter=suffix('.cleaned.pdf'),
|
||||
output='.pdfa_def.ps',
|
||||
output_dir=options.temp_folder,
|
||||
extras=[_log])
|
||||
def generate_postscript_stub(
|
||||
input_file,
|
||||
output_file,
|
||||
log):
|
||||
generate_pdfa_def(output_file)
|
||||
|
||||
|
||||
@merge(
|
||||
input=[noop, generate_postscript_stub],
|
||||
output=options.output_file,
|
||||
extras=[_log, _pdfinfo, _pdfinfo_lock])
|
||||
def merge_pages(
|
||||
input_files,
|
||||
output_file,
|
||||
log,
|
||||
pdfinfo,
|
||||
pdfinfo_lock):
|
||||
|
||||
ocr_pages, postscript = input_files[0:-1], input_files[-1]
|
||||
|
||||
with NamedTemporaryFile(delete=True) as gs_pdf:
|
||||
args_gs = [
|
||||
"gs",
|
||||
"-dQUIET",
|
||||
"-dBATCH",
|
||||
"-dNOPAUSE",
|
||||
"-sDEVICE=pdfwrite",
|
||||
"-sColorConversionStrategy=/RGB",
|
||||
"-sProcessColorModel=DeviceRGB",
|
||||
"-dPDFA",
|
||||
"-sPDFACompatibilityPolicy=2",
|
||||
"-sOutputICCProfile=srgb.icc",
|
||||
"-sOutputFile=" + gs_pdf.name,
|
||||
postscript, # the PDF/A definition header
|
||||
]
|
||||
args_gs.extend(ocr_pages)
|
||||
check_call(args_gs)
|
||||
shutil.copy(gs_pdf.name, output_file)
|
||||
|
||||
|
||||
|
||||
|
||||
+4
-3
@@ -3,6 +3,7 @@
|
||||
|
||||
from subprocess import Popen, PIPE
|
||||
import PyPDF2 as pypdf
|
||||
from decimal import Decimal
|
||||
|
||||
|
||||
FRIENDLY_COLORSPACE = {
|
||||
@@ -53,8 +54,8 @@ def _pdf_get_pageinfo(infile, page: int):
|
||||
page = pdf.pages[page - 1]
|
||||
width_pt = page['/MediaBox'][2] - page['/MediaBox'][0]
|
||||
height_pt = page['/MediaBox'][3] - page['/MediaBox'][1]
|
||||
pageinfo['width_inches'] = width_pt / 72.0
|
||||
pageinfo['height_inches'] = height_pt / 72.0
|
||||
pageinfo['width_inches'] = width_pt / Decimal(72.0)
|
||||
pageinfo['height_inches'] = height_pt / Decimal(72.0)
|
||||
|
||||
if '/XObject' not in page['/Resources']:
|
||||
# Missing /XObject means no images or possibly corrupt PDF
|
||||
@@ -90,7 +91,7 @@ def _pdf_get_pageinfo(infile, page: int):
|
||||
image['comp'] = FRIENDLY_COMP.get(image['color'], '?')
|
||||
image['dpi_w'] = image['width'] / pageinfo['width_inches']
|
||||
image['dpi_h'] = image['height'] / pageinfo['height_inches']
|
||||
image['dpi'] = (image['dpi_w'] * image['dpi_h']) ** 0.5
|
||||
image['dpi'] = (image['dpi_w'] * image['dpi_h']) ** Decimal(0.5)
|
||||
pageinfo['images'].append(image)
|
||||
|
||||
if pageinfo['images']:
|
||||
|
||||
Reference in New Issue
Block a user