Merge in RR/cv-analysis from new_pyinfra to master
Squashed commit of the following:
commit f7a01a90aad1c402ac537de5bdf15df628ad54df
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Wed Jul 27 10:40:59 2022 +0200
fix typo
commit ff4d549fac5b612c2d391ae85823c5eca1e91916
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Wed Jul 27 10:34:04 2022 +0200
adjust build scripts for new pyinfra
commit ecd70f60d46406d8b6cc7f36a1533d706c917ca8
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Wed Jul 27 09:42:55 2022 +0200
simplify logging by using default configurations
commit 20193c14c940eed2b0a7a72058167e26064119d0
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Tue Jul 26 17:16:57 2022 +0200
tidy-up, refactor config logic to not dependent on external files
commit d8069cd4d404a570bb04a04278161669d1c83332
Author: Isaac Riley <Isaac.Riley@iqser.com>
Date: Tue Jul 26 15:14:59 2022 +0200
update pyinfra
commit c3bc11037cca9baf016043ab997c566f5b4a2586
Author: Isaac Riley <Isaac.Riley@iqser.com>
Date: Tue Jul 26 15:09:14 2022 +0200
repair tests
commit 6f4e4f2863ee16ae056c1d432f663858c5f10221
Author: Isaac Riley <Isaac.Riley@iqser.com>
Date: Tue Jul 26 14:52:38 2022 +0200
updated server logic to work with new pyinfra; update scripts for pyinfra as submodule
commit 2a18dba81de5ee84d0bdf0e77f478693e8d8aef4
Author: Isaac Riley <Isaac.Riley@iqser.com>
Date: Tue Jul 26 14:10:41 2022 +0200
formatting
commit d87ce9328de9aa2341228af9b24473d5e583504e
Author: Isaac Riley <Isaac.Riley@iqser.com>
Date: Tue Jul 26 14:10:11 2022 +0200
make server logic compatible with new pyinfra
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
from dataclasses import dataclass
|
|
from functools import partial
|
|
from typing import Iterator
|
|
|
|
import fitz
|
|
import numpy as np
|
|
|
|
|
|
@dataclass
|
|
class ImageMetadataPair:
|
|
image: np.ndarray
|
|
metadata: dict
|
|
|
|
|
|
def pdf_to_image_metadata_pairs(pdf: bytes, index=None, dpi=200) -> Iterator[ImageMetadataPair]:
|
|
"""Streams PDF as pairs of image (matrix) and metadata.
|
|
Note: If Index is not given or evaluates to None, the whole PDF will be processed.
|
|
"""
|
|
convert_fn = partial(page_to_image_metadata_pair, dpi=dpi)
|
|
yield from map(convert_fn, stream_pages(pdf, index))
|
|
|
|
|
|
def page_to_image_metadata_pair(page: fitz.Page, dpi):
|
|
metadata = get_page_info(page)
|
|
pixmap = page.get_pixmap(dpi=dpi)
|
|
array = np.frombuffer(pixmap.samples, dtype=np.uint8).reshape(pixmap.h, pixmap.w, pixmap.n)
|
|
|
|
return ImageMetadataPair(array, metadata)
|
|
|
|
|
|
def stream_pages(pdf: bytes, index=None) -> Iterator[fitz.Page]:
|
|
with fitz.open(stream=pdf) as pdf_handle:
|
|
if not index:
|
|
yield from pdf_handle
|
|
else:
|
|
for i in index:
|
|
yield pdf_handle[i]
|
|
|
|
|
|
def get_page_info(page):
|
|
return {
|
|
"index": page.number,
|
|
"rotation": page.rotation,
|
|
"width": page.rect.width, # rotated page width in inches
|
|
"height": page.rect.height, # rotated page height in inches
|
|
}
|