Do not include foreground layer if no foreground pixels
This commit is contained in:
parent
18cbc2bd56
commit
6fbd9de2c9
@ -43,8 +43,8 @@ class CompressionOptions:
|
|||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CompressedPage:
|
class CompressedPage:
|
||||||
fg: CompressedLayer
|
fg: Optional[CompressedLayer]
|
||||||
bg: CompressedLayer
|
bg: Optional[CompressedLayer]
|
||||||
|
|
||||||
def compress_pages(
|
def compress_pages(
|
||||||
input_pages: InputPages,
|
input_pages: InputPages,
|
||||||
@ -104,6 +104,9 @@ def compress_layer(
|
|||||||
tempdir: str
|
tempdir: str
|
||||||
) -> CompressedLayer:
|
) -> CompressedLayer:
|
||||||
|
|
||||||
|
if layer is None:
|
||||||
|
return None
|
||||||
|
|
||||||
# Compress the given layer
|
# Compress the given layer
|
||||||
if compression == 'iw44':
|
if compression == 'iw44':
|
||||||
return iw44_compress_layer(layer=layer, dpi=input_pages.dpi, tempdir=tempdir)
|
return iw44_compress_layer(layer=layer, dpi=input_pages.dpi, tempdir=tempdir)
|
||||||
|
@ -42,17 +42,20 @@ def djvu_write_pages(
|
|||||||
# Combine foreground and background
|
# Combine foreground and background
|
||||||
_, page_djvu_file = tempfile.mkstemp(suffix='.djvu', dir=tempdir)
|
_, page_djvu_file = tempfile.mkstemp(suffix='.djvu', dir=tempdir)
|
||||||
|
|
||||||
# TODO: Handle case where empty background or foreground
|
|
||||||
args = ['djvumake', page_djvu_file, 'INFO={},{},{}'.format(input_pages.width, input_pages.height, round(input_pages.dpi))]
|
args = ['djvumake', page_djvu_file, 'INFO={},{},{}'.format(input_pages.width, input_pages.height, round(input_pages.dpi))]
|
||||||
args.append('Sjbz={}'.format(compressed_page.fg.filename))
|
if compressed_page.fg:
|
||||||
args.append('BG44={}'.format(compressed_page.bg.filename))
|
args.append('Sjbz={}'.format(compressed_page.fg.filename))
|
||||||
|
if compressed_page.bg:
|
||||||
|
args.append('BG44={}'.format(compressed_page.bg.filename))
|
||||||
subprocess.run(args, check=True, capture_output=True)
|
subprocess.run(args, check=True, capture_output=True)
|
||||||
|
|
||||||
djvu_page_files.append(page_djvu_file)
|
djvu_page_files.append(page_djvu_file)
|
||||||
finally:
|
finally:
|
||||||
# Clean up
|
# Clean up
|
||||||
compressed_page.bg.cleanup()
|
if compressed_page.bg:
|
||||||
compressed_page.fg.cleanup()
|
compressed_page.bg.cleanup()
|
||||||
|
if compressed_page.fg:
|
||||||
|
compressed_page.fg.cleanup()
|
||||||
|
|
||||||
# Combine pages
|
# Combine pages
|
||||||
subprocess.run(['djvm', '-c', output_file] + djvu_page_files, check=True)
|
subprocess.run(['djvm', '-c', output_file] + djvu_page_files, check=True)
|
||||||
|
@ -42,14 +42,15 @@ def pdf_write_pages(
|
|||||||
page = pdf.add_blank_page(page_size=(width_pt, height_pt))
|
page = pdf.add_blank_page(page_size=(width_pt, height_pt))
|
||||||
|
|
||||||
# Write each layer to the page
|
# Write each layer to the page
|
||||||
# TODO: Handle case where empty background or foreground
|
|
||||||
content_instructions = []
|
content_instructions = []
|
||||||
pdf_write_layer(input_pages=input_pages, pdf=pdf, page=page, layer=compressed_page.bg, is_foreground=False, content_instructions=content_instructions)
|
pdf_write_layer(input_pages=input_pages, pdf=pdf, page=page, layer=compressed_page.bg, is_foreground=False, content_instructions=content_instructions)
|
||||||
pdf_write_layer(input_pages=input_pages, pdf=pdf, page=page, layer=compressed_page.fg, is_foreground=True, content_instructions=content_instructions)
|
pdf_write_layer(input_pages=input_pages, pdf=pdf, page=page, layer=compressed_page.fg, is_foreground=True, content_instructions=content_instructions)
|
||||||
|
|
||||||
# Clean up
|
# Clean up
|
||||||
compressed_page.bg.cleanup()
|
if compressed_page.bg:
|
||||||
compressed_page.fg.cleanup()
|
compressed_page.bg.cleanup()
|
||||||
|
if compressed_page.fg:
|
||||||
|
compressed_page.fg.cleanup()
|
||||||
|
|
||||||
# Generate content stream
|
# Generate content stream
|
||||||
wrapped_instructions = [
|
wrapped_instructions = [
|
||||||
@ -73,6 +74,9 @@ def pdf_write_layer(
|
|||||||
content_instructions,
|
content_instructions,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
|
if layer is None:
|
||||||
|
return
|
||||||
|
|
||||||
# Write the layer to PDF
|
# Write the layer to PDF
|
||||||
if isinstance(layer, JBIG2Layer):
|
if isinstance(layer, JBIG2Layer):
|
||||||
pdf_write_image(
|
pdf_write_image(
|
||||||
|
@ -20,12 +20,12 @@ import numpy
|
|||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Generator, List
|
from typing import Generator, List, Optional
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class SegmentedPage:
|
class SegmentedPage:
|
||||||
fg: Image
|
fg: Optional[Image]
|
||||||
bg: Image
|
bg: Optional[Image]
|
||||||
|
|
||||||
def segment_pages(input_pages: InputPages) -> Generator[SegmentedPage]:
|
def segment_pages(input_pages: InputPages) -> Generator[SegmentedPage]:
|
||||||
for page_num, input_page in enumerate(input_pages.pages):
|
for page_num, input_page in enumerate(input_pages.pages):
|
||||||
@ -81,6 +81,8 @@ def segment_page(input_page: Image) -> SegmentedPage:
|
|||||||
numpy_bg[fg_pixels,:] = [255, 255, 255]
|
numpy_bg[fg_pixels,:] = [255, 255, 255]
|
||||||
image_bg = Image.fromarray(numpy_bg, image_rgb.mode)
|
image_bg = Image.fromarray(numpy_bg, image_rgb.mode)
|
||||||
|
|
||||||
# TODO: Handle case where empty background or foreground
|
# Handle case where empty background or foreground
|
||||||
|
if numpy.any(fg_pixels):
|
||||||
return SegmentedPage(fg=image_fg, bg=image_bg)
|
return SegmentedPage(fg=image_fg, bg=image_bg)
|
||||||
|
else:
|
||||||
|
return SegmentedPage(fg=None, bg=image_bg)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user