From 118fef848329c84881da226a85db851f039a1ea3 Mon Sep 17 00:00:00 2001 From: dothinking Date: Wed, 17 Jan 2024 22:02:55 +0800 Subject: [PATCH 1/8] fixed intersection and union of fitz.Rect issue due to upgrading of pymupdf>1.23.8 --- pdf2docx/common/Collection.py | 14 ++-- pdf2docx/common/Element.py | 115 +++++++++++++++++-------------- pdf2docx/layout/Layout.py | 2 +- pdf2docx/table/TableStructure.py | 8 +-- pdf2docx/text/Char.py | 21 +++--- 5 files changed, 86 insertions(+), 74 deletions(-) diff --git a/pdf2docx/common/Collection.py b/pdf2docx/common/Collection.py index efc8999..3cf5dd6 100644 --- a/pdf2docx/common/Collection.py +++ b/pdf2docx/common/Collection.py @@ -348,10 +348,12 @@ def split_with_intersection(self, bbox:fitz.Rect, threshold:float=1e-3): for instance in self._instances: # A contains B => A & B = B intersection = instance.bbox & bbox - factor = round(intersection.get_area()/instance.bbox.get_area(), 2) - - if factor >= threshold: - intersections.append(instance) - else: + if intersection.is_empty: no_intersections.append(instance) - return self.__class__(intersections), self.__class__(no_intersections) \ No newline at end of file + else: + factor = round(intersection.get_area()/instance.bbox.get_area(), 2) + if factor >= threshold: + intersections.append(instance) + else: + no_intersections.append(instance) + return self.__class__(intersections), self.__class__(no_intersections) diff --git a/pdf2docx/common/Element.py b/pdf2docx/common/Element.py index e888b1e..e0a5cb4 100644 --- a/pdf2docx/common/Element.py +++ b/pdf2docx/common/Element.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - '''Object with a bounding box, e.g. Block, Line, Span. Based on ``PyMuPDF``, the coordinates (e.g. bbox of ``page.get_text('rawdict')``) are generally @@ -49,11 +47,12 @@ def pure_rotation_matrix(cls): def __init__(self, raw:dict=None, parent=None): - ''' Initialize Element and convert to the real (rotation considered) page coordinate system.''' + ''' Initialize Element and convert to the real (rotation considered) page CS.''' self.bbox = fitz.Rect() # type: fitz.Rect self._parent = parent # type: Element - # NOTE: Any coordinates provided in raw is in original page CS (without considering page rotation). + # NOTE: Any coordinates provided in raw is in original page CS + # (without considering page rotation). if 'bbox' in (raw or {}): rect = fitz.Rect(raw['bbox']) * Element.ROTATION_MATRIX self.update_bbox(rect) @@ -61,8 +60,15 @@ def __init__(self, raw:dict=None, parent=None): def __bool__(self): '''Real object when bbox is defined.''' + # NOTE inconsistent results of fitz.Rect for different version of pymupdf, e.g., + # a = fitz.Rect(3,3,2,2) + # bool(a) a.get_area() a.is_empty + # pymupdf 1.23.5 True 1.0 True + # pymupdf 1.23.8 True 0.0 True + # bool(fitz.Rect())==False + # NOTE: do not use `return not self.bbox.is_empty` here return bool(self.bbox) - + def __repr__(self): return f'{self.__class__.__name__}({tuple(self.bbox)})' @@ -98,18 +104,19 @@ def get_expand_bbox(self, dt:float): Returns: fitz.Rect: Expanded bbox. - + .. note:: This method creates a new bbox, rather than changing the bbox of itself. - """ + """ return self.bbox + (-dt, -dt, dt, dt) def update_bbox(self, rect): '''Update current bbox to specified ``rect``. - + Args: - rect (fitz.Rect or list): bbox-like ``(x0, y0, x1, y1)`` in real page CS (with rotation considered). + rect (fitz.Rect or list): bbox-like ``(x0, y0, x1, y1)``, + in real page CS (with rotation considered). ''' self.bbox = fitz.Rect([round(x,1) for x in rect]) return self @@ -123,45 +130,44 @@ def union_bbox(self, e): Returns: Element: self - """ + """ return self.update_bbox(self.bbox | e.bbox) # -------------------------------------------- # location relationship to other Element instance - # -------------------------------------------- + # -------------------------------------------- def contains(self, e:'Element', threshold:float=1.0): """Whether given element is contained in this instance, with margin considered. Args: e (Element): Target element - threshold (float, optional): Intersection rate. Defaults to 1.0. The larger, the stricter. + threshold (float, optional): Intersection rate. + Defaults to 1.0. The larger, the stricter. Returns: bool: [description] """ - # NOTE the case bool(e)=True but e.bbox.get_area()=0 S = e.bbox.get_area() - if not S: return False - + if not S: return False + # it's not practical to set a general threshold to consider the margin, so two steps: # - set a coarse but acceptable area threshold, # - check the length in main direction strictly - # A contains B => A & B = B intersection = self.bbox & e.bbox - factor = round(intersection.get_area()/e.bbox.get_area(), 2) + factor = round(intersection.get_area()/S, 2) if factor= self.bbox.height: return self.bbox.width+constants.MINOR_DIST >= e.bbox.width - else: - return self.bbox.height+constants.MINOR_DIST >= e.bbox.height - + return self.bbox.height+constants.MINOR_DIST >= e.bbox.height + def get_main_bbox(self, e, threshold:float=0.95): - """If the intersection with ``e`` exceeds the threshold, return the union of these two elements; else return None. + """If the intersection with ``e`` exceeds the threshold, return the union of + these two elements; else return None. Args: e (Element): Target element. @@ -172,43 +178,45 @@ def get_main_bbox(self, e, threshold:float=0.95): """ bbox_1 = self.bbox bbox_2 = e.bbox if hasattr(e, 'bbox') else fitz.Rect(e) - + # areas b = bbox_1 & bbox_2 - if not b: return None # no intersection - - a1, a2, a = bbox_1.get_area(), bbox_2.get_area(), b.get_area() + if b.is_empty: return None # no intersection # Note: if bbox_1 and bbox_2 intersects with only an edge, b is not empty but b.get_area()=0 # so give a small value when they're intersected but the area is zero + a1, a2, a = bbox_1.get_area(), bbox_2.get_area(), b.get_area() factor = a/min(a1,a2) if a else 1e-6 return bbox_1 | bbox_2 if factor >= threshold else None def vertically_align_with(self, e, factor:float=0.0, text_direction:bool=True): - '''Check whether two Element instances have enough intersection in vertical direction, i.e. perpendicular to reading direction. - + '''Check whether two Element instances have enough intersection in vertical direction, + i.e. perpendicular to reading direction. + Args: e (Element): Object to check with - factor (float, optional): Threshold of overlap ratio, the larger it is, the higher probability the two bbox-es are aligned. - text_direction (bool, optional): Consider text direction or not. True by default, from left to right if False. + factor (float, optional): Threshold of overlap ratio, the larger it is, the higher + probability the two bbox-es are aligned. + text_direction (bool, optional): Consider text direction or not. + True by default,from left to right if False. Returns: bool: [description] - + Examples:: +--------------+ | | - +--------------+ + +--------------+ L1 +-------------------+ | | +-------------------+ L2 - + An enough intersection is defined based on the minimum width of two boxes:: - + L1+L2-L>factor*min(L1,L2) ''' if not e or not bool(self): return False @@ -225,12 +233,15 @@ def vertically_align_with(self, e, factor:float=0.0, text_direction:bool=True): def horizontally_align_with(self, e, factor:float=0.0, text_direction:bool=True): - '''Check whether two Element instances have enough intersection in horizontal direction, i.e. along the reading direction. - + '''Check whether two Element instances have enough intersection in horizontal direction, + i.e. along the reading direction. + Args: e (Element): Element to check with - factor (float, optional): threshold of overlap ratio, the larger it is, the higher probability the two bbox-es are aligned. - text_direction (bool, optional): consider text direction or not. True by default, from left to right if False. + factor (float, optional): threshold of overlap ratio, the larger it is, the higher + probability the two bbox-es are aligned. + text_direction (bool, optional): consider text direction or not. + True by default, from left to right if False. Examples:: @@ -238,16 +249,16 @@ def horizontally_align_with(self, e, factor:float=0.0, text_direction:bool=True) | | L1 +--------------------+ +--------------+ | | L2 +--------------------+ - + An enough intersection is defined based on the minimum width of two boxes:: - + L1+L2-L>factor*min(L1,L2) ''' if not e or not bool(self): return False # text direction idx = 0 if text_direction and self.is_vertical_text else 1 - + L1 = self.bbox[idx+2]-self.bbox[idx] L2 = e.bbox[idx+2]-e.bbox[idx] L = max(self.bbox[idx+2], e.bbox[idx+2]) - min(self.bbox[idx], e.bbox[idx]) @@ -257,21 +268,19 @@ def horizontally_align_with(self, e, factor:float=0.0, text_direction:bool=True) def in_same_row(self, e): - """Check whether in same row/line with specified Element instance. With text direction considered. - + """Check whether in same row/line with specified Element instance. + With text direction considered. + Taking horizontal text as an example: - + * yes: the bottom edge of each box is lower than the centerline of the other one; * otherwise, not in same row. Args: e (Element): Target object. - Returns: - bool: [description] - .. note:: - The difference to method ``horizontally_align_with``: they may not in same line, though + The difference to method ``horizontally_align_with``: they may not in same line, though aligned horizontally. """ if not e or self.is_horizontal_text != e.is_horizontal_text: @@ -291,9 +300,15 @@ def in_same_row(self, e): # ------------------------------------------------ def store(self): '''Store properties in raw dict.''' - return { 'bbox': tuple([x for x in self.bbox]) } + return { 'bbox': tuple(x for x in self.bbox) } + - def plot(self, page, stroke:tuple=(0,0,0), width:float=0.5, fill:tuple=None, dashes:str=None): '''Plot bbox in PDF page for debug purpose.''' - page.draw_rect(self.bbox, color=stroke, fill=fill, width=width, dashes=dashes, overlay=False, fill_opacity=0.5) \ No newline at end of file + page.draw_rect(self.bbox, + color=stroke, + fill=fill, + width=width, + dashes=dashes, + overlay=False, + fill_opacity=0.5) diff --git a/pdf2docx/layout/Layout.py b/pdf2docx/layout/Layout.py index a960501..97d4a93 100644 --- a/pdf2docx/layout/Layout.py +++ b/pdf2docx/layout/Layout.py @@ -125,7 +125,7 @@ def _assign_block(self, block): self.blocks.append(block) # deep into line span if any intersection - elif self.bbox & block.bbox and isinstance(block, Line): + elif isinstance(block, Line) and self.bbox.intersects(block.bbox): self.blocks.append(block.intersects(self.bbox)) diff --git a/pdf2docx/table/TableStructure.py b/pdf2docx/table/TableStructure.py index 994fc99..035c659 100644 --- a/pdf2docx/table/TableStructure.py +++ b/pdf2docx/table/TableStructure.py @@ -483,9 +483,9 @@ def _check_outer_strokes(table_bbox:Element, borders:dict, direction:str, max_bo target = bbox[idx] # add missing border rects - sample_border = Stroke() - bbox[idx] = target - bbox[(idx+2)%4] = target + sample_border = Stroke() + idx1 = (idx+2)%4 + bbox[idx1] = target + 0.1 * (1 if idx1>idx else -1) # add whole border if not exist if abs(target-current)> max_border_width: @@ -514,7 +514,6 @@ def _check_outer_strokes(table_bbox:Element, borders:dict, direction:str, max_bo borders[current].extend(segments) - @staticmethod def _check_merged_cells(ref:float, borders:list, direction:str='row'): '''Check merged cells in a row/column. @@ -548,7 +547,6 @@ def _check_merged_cells(ref:float, borders:list, direction:str='row'): ref0, ref1 = border.y0, border.y1 else: ref0, ref1 = border.x0, border.x1 - # 1) intersection found if ref0 < ref < ref1: res.append(1) diff --git a/pdf2docx/text/Char.py b/pdf2docx/text/Char.py index 0e3e324..4b66fa8 100644 --- a/pdf2docx/text/Char.py +++ b/pdf2docx/text/Char.py @@ -40,22 +40,19 @@ def contained_in_rect(self, rect:Shape, horizontal:bool=True): Returns: bool: Whether a Char locates in target rect. - + .. note:: It's considered as contained in the target rect if the intersection is larger than half of the char bbox. - """ + """ # char in rect? - if self.bbox in rect.bbox: - return True - - # intersection? - else: - intsec = self.bbox & rect.bbox # width=0 if invalid intersection - if horizontal: - return intsec.width > 0.5*self.bbox.width - else: - return intsec.height > 0.5*self.bbox.height + if self.bbox in rect.bbox: return True + + # intersection? + s = self.bbox & rect.bbox + if s.is_empty: return False + if horizontal: return s.width > 0.5*self.bbox.width + return s.height > 0.5*self.bbox.height def store(self): From 08e617a1026a696c0ded7b08f46cfcc61da69411 Mon Sep 17 00:00:00 2001 From: dothinking Date: Wed, 17 Jan 2024 22:41:48 +0800 Subject: [PATCH 2/8] go back #194 --- pdf2docx/common/share.py | 33 ++++++++++++------ pdf2docx/font/Fonts.py | 39 +++++++++++----------- pdf2docx/text/TextSpan.py | 70 ++++++++++++++++++--------------------- 3 files changed, 76 insertions(+), 66 deletions(-) diff --git a/pdf2docx/common/share.py b/pdf2docx/common/share.py index 5487495..e67b6e6 100644 --- a/pdf2docx/common/share.py +++ b/pdf2docx/common/share.py @@ -1,4 +1,5 @@ -# -*- coding: utf-8 -*- +'''Common methods.''' + from enum import Enum import random from collections.abc import Iterable @@ -26,7 +27,7 @@ class RectType(Enum): class TextDirection(Enum): - '''Text direction. + '''Text direction. * LEFT_RIGHT: from left to right within a line, and lines go from top to bottom * BOTTOM_TOP: from bottom to top within a line, and lines go from left to right * MIX : a mixture if LEFT_RIGHT and BOTTOM_TOP @@ -48,7 +49,7 @@ class TextAlignment(Enum): * UNKNOWN: can't decide, e.g. single line only ''' NONE = -1 - UNKNOWN = 0 + UNKNOWN = 0 LEFT = 1 CENTER = 2 RIGHT = 3 @@ -115,12 +116,25 @@ def flatten(items, klass): else: yield item + def lower_round(number:float, ndigits:int=0): '''Round number to lower bound with specified digits, e.g. lower_round(1.26, 1)=1.2''' n = 10.0**ndigits return int(n*number) / n +def decode(s:str): + '''Try to decode a unicode string.''' + b = bytes(ord(c) for c in s) + for encoding in ['utf-8', 'gbk', 'gb2312', 'iso-8859-1']: + try: + res = b.decode(encoding) + break + except: + continue + return res + + # ------------------------- # color methods # ------------------------- @@ -131,14 +145,14 @@ def rgb_component_from_name(name:str=''): pos = getColorList().index(name.upper()) else: pos = random.randint(0, len(getColorList())-1) - + c = getColorInfoList()[pos] return (c[1] / 255.0, c[2] / 255.0, c[3] / 255.0) def rgb_component(srgb:int): '''srgb value to R,G,B components, e.g. 16711680 -> (255, 0, 0). - + Equal to PyMuPDF built-in method:: [int(255*x) for x in fitz.sRGB_to_pdf(x)] @@ -191,7 +205,7 @@ def rgb_value(components:list): # ------------------------- def new_page(doc, width:float, height:float, title:str): '''Insert a new page with given title. - + Args: doc (fitz.Document): pdf document object. width (float): Page width. @@ -204,17 +218,17 @@ def new_page(doc, width:float, height:float, title:str): # plot title at the top-left corner gray = rgb_component_from_name('gray') page.insert_text((5, 16), title, color=gray, fontsize=15) - + return page def debug_plot(title:str, show=True): '''Plot the returned objects of inner function. - + Args: title (str): Page title. show (bool, optional): Don't plot if show==False. Default to True. - + .. note:: Prerequisite of the inner function: - the first argument is a :py:class:`~pdf2docx.page.BasePage` instance. @@ -241,4 +255,3 @@ def inner(*args, **kwargs): return objects return inner return wrapper - diff --git a/pdf2docx/font/Fonts.py b/pdf2docx/font/Fonts.py index feb26c9..e369c81 100644 --- a/pdf2docx/font/Fonts.py +++ b/pdf2docx/font/Fonts.py @@ -1,30 +1,31 @@ '''Extract fonts properties from PDF. -Font properties like font name, size are covered in :py:class:`~pdf2docx.text.TextSpan`, +Font properties like font name, size are covered in :py:class:`~pdf2docx.text.TextSpan`, but more generic properties are required further: -* Font family name. The font name extracted and set in ``TextSpan`` might not valid when +* Font family name. The font name extracted and set in ``TextSpan`` might not valid when directly used in MS Word, e.g. "ArialMT" should be "Arial". So, we need to get font family name, which should be accepted by MS Word, based on the font file itself. -* Font line height ratio. As line height = font_size * line_height_ratio, it's used to +* Font line height ratio. As line height = font_size * line_height_ratio, it's used to calculate relative line spacing. In general, 1.12 is an approximate value to this ratio, - but it's in fact a font-related value, especially for CJK font. + but it's in fact a font-related value, especially for CJK font. * So, extract font metrics, e.g. ascender and descender, with third party library ``fontTools`` - in first priority. This can obtain an accurate line height ratio, but sometimes the + in first priority. This can obtain an accurate line height ratio, but sometimes the embedded font data might crash. - + * Then, we have to use the default properties, i.e. ascender and descender, extracted by - ``PyMuPDF`` directly, but this value isn't so accurate. + ``PyMuPDF`` directly, but this value isn't so accurate. ''' import os from io import BytesIO -from collections import namedtuple +from collections import namedtuple from fontTools.ttLib import TTFont from ..common.Collection import BaseCollection from ..common.constants import (CJK_CODEPAGE_BITS, CJK_UNICODE_RANGE_BITS, CJK_UNICODE_RANGES) +from ..common.share import decode Font = namedtuple('Font', [ 'descriptor', # font descriptor @@ -42,7 +43,7 @@ def get(self, font_name:str): # 1st priority: check right the name for font in self: if target==font.descriptor: return font - + # 2nd priority: target name is contained in font name for font in self: if target in font.descriptor: return font @@ -50,7 +51,7 @@ def get(self, font_name:str): # 3rd priority: target name contains font name for font in self: if font.descriptor in target: return font - + return None @@ -59,7 +60,7 @@ def extract(cls, fitz_doc): '''Extract fonts from PDF and get properties. * Only embedded fonts (v.s. the base 14 fonts) can be extracted. * The extracted fonts may be invalid due to reason from PDF file itself. - ''' + ''' # get unique font references xrefs = set() for page in fitz_doc: @@ -69,9 +70,9 @@ def extract(cls, fitz_doc): fonts = [] for xref in xrefs: basename, ext, _, buffer = fitz_doc.extract_font(xref) - basename = bytes(ord(c) for c in basename).decode() + basename = decode(basename) name = cls._normalized_font_name(basename) - + try: # supported fonts: open/true type only # - n/a: base 14 fonts @@ -91,7 +92,7 @@ def extract(cls, fitz_doc): line_height=line_height)) return cls(fonts) - + @staticmethod def _normalized_font_name(name): @@ -104,7 +105,7 @@ def _to_descriptor(name:str): '''Remove potential space, dash in font name, and turn to upper case.''' return name.replace(' ', '').replace('-', '').upper() - + @staticmethod def get_font_family_name(tt_font:TTFont): '''Get the font family name from the font's names table. @@ -139,7 +140,7 @@ def get_line_height_factor(tt_font:TTFont): Fon non-CJK fonts:: f = (hhea.Ascent - hhea.Descent + hhea.LineGap) / units_per_em - + For non-CJK fonts (Windows):: f = (OS/2.winAscent + OS/2.winDescent + [External Leading]) / units_per_em @@ -176,9 +177,9 @@ def get_line_height_factor(tt_font:TTFont): os2_win_total_height = os2_win_ascent + os2_win_descent win_external_leading = max(0.0, hhea_linegap-(os2_win_total_height-hhea_total_height)) win_btb_distance = os2_win_total_height + win_external_leading - + btb_distance = win_btb_distance - + else: btb_distance = hhea_btb_distance @@ -187,7 +188,7 @@ def get_line_height_factor(tt_font:TTFont): distance = 1.3*hhea_total_height if cjk else 1.0*btb_distance return distance / units_per_em - + @staticmethod def is_cjk_font(tt_font:TTFont): diff --git a/pdf2docx/text/TextSpan.py b/pdf2docx/text/TextSpan.py index e6f718b..a00ae4d 100644 --- a/pdf2docx/text/TextSpan.py +++ b/pdf2docx/text/TextSpan.py @@ -1,8 +1,6 @@ -# -*- coding: utf-8 -*- - '''Text Span object based on PDF raw dict extracted with ``PyMuPDF``. -Data structure for Span refer to +Data structure for Span refer to this `link `_:: { @@ -34,9 +32,9 @@ from docx.oxml.ns import qn from .Char import Char from ..common.Element import Element -from ..common.share import RectType +from ..common.share import (RectType, rgb_value, rgb_component, decode) from ..common import constants -from ..common import share, docx +from ..common import docx from ..shape.Shape import Shape @@ -55,8 +53,7 @@ def __init__(self, raw:dict=None): # font metrics # line_height is the standard single line height used in relative line spacing, # while exact line spacing is used when line_height==-1 by default. - font_name = raw.get('font', '') - self.font = bytes(ord(c) for c in font_name).decode() # in case unicode in font name + self.font = decode(raw.get('font', '')) # in case unicode in font name self.size = raw.get('size', 12.0) self.ascender = raw.get('ascender', 1.0) self.descender = raw.get('descender', 0.0) @@ -70,12 +67,12 @@ def __init__(self, raw:dict=None): # positive to expand space, otherwise condense # just an attribute placeholder: not used yet self.char_spacing = raw.get('char_spacing', 0.0) - + # init text span element super().__init__(raw) # in rare case, the font is unamed, so change font and update bbox accordingly - if 'UNNAMED' in self.font.upper(): + if self.chars and 'UNNAMED' in self.font.upper(): self._change_font_and_update_bbox(constants.DEFAULT_FONT_NAME) @@ -102,14 +99,14 @@ def is_valid_line_height(self): return self.line_height!=-1 def _change_font_and_update_bbox(self, font_name:str): '''Set new font, and update font size, span/char bbox accordingly. - It's generally used for span with unnamed fonts. - See this `issue `_. + It's generally used for span with unnamed fonts. + See this `issue `_. In corner case, where the PDF file containing unnamed and not embedded fonts, the span bbox - extracted from ``PyMuPDF`` is not correct. ``PyMuPDF`` provides feature to replace these - unnamed fonts with specified fonts, then extract correct bbox from the updated PDF. Since we - care less about the original PDF itself but its layout, the idea here is to set a default font - for text spans with unnamed fonts, and estimate the updated bbox with method from + extracted from ``PyMuPDF`` is not correct. ``PyMuPDF`` provides feature to replace these + unnamed fonts with specified fonts, then extract correct bbox from the updated PDF. Since we + care less about the original PDF itself but its layout, the idea here is to set a default + font for text spans with unnamed fonts, and estimate the updated bbox with method from ``fitz.TextWriter``. Args: @@ -153,7 +150,7 @@ def add(self, char:Char): self.chars.append(char) self.union_bbox(char) - + def lstrip(self): '''Remove blanks at the left side, but keep one blank.''' original_text = self.text @@ -164,7 +161,7 @@ def lstrip(self): self.chars = self.chars[num_blanks-1:] self.update_bbox(rect=self.cal_bbox()) return True - + def rstrip(self): '''Remove blanks at the right side, but keep one blank.''' @@ -205,7 +202,7 @@ def split(self, rect:Shape, horizontal:bool=True): Returns: list: Split text spans. - """ + """ # any intersection in this span? # NOTE: didn't consider the case that an underline is out of a span intsec = rect.bbox & self.bbox @@ -213,7 +210,6 @@ def split(self, rect:Shape, horizontal:bool=True): # no, then add this span as it is # Note the case bool(intsec)=True but intsec.get_area()=0 if intsec.is_empty: return [self] - # yes, then split spans: # - add new style to the intersection part @@ -241,7 +237,6 @@ def split(self, rect:Shape, horizontal:bool=True): pos_end = max(pos+length, 0) # max() is used in case: pos=-1, length=0 # split span with the intersection: span-intersection-span - # # left part if exists if pos > 0: if horizontal: @@ -287,9 +282,9 @@ def _parse_text_format(self, rect:Shape, horizontal:bool=True): # Skip table border/shading if rect.equal_to_type(RectType.BORDER) or rect.equal_to_type(RectType.SHADING): return False - + # set hyperlink - elif rect.equal_to_type(RectType.HYPERLINK): + if rect.equal_to_type(RectType.HYPERLINK): self.style.append({ 'type': rect.type, 'color': rect.color, @@ -311,9 +306,9 @@ def _parse_text_format(self, rect:Shape, horizontal:bool=True): # highlight: both the rect height and overlap must be large enough if h_rect >= 0.5*h_span: # In general, highlight color isn't white - if rect.color != share.rgb_value((1,1,1)) and self.get_main_bbox(rect, constants.FACTOR_MAJOR): + if rect.color != rgb_value((1,1,1)) and self.get_main_bbox(rect, constants.FACTOR_MAJOR): rect.type = RectType.HIGHLIGHT - + # near to bottom of span? yes, underline elif d <= 0.25*h_span: rect.type = RectType.UNDERLINE @@ -336,7 +331,7 @@ def _parse_text_format(self, rect:Shape, horizontal:bool=True): def intersects(self, rect): '''Create new TextSpan object with chars contained in given bbox. - + Args: rect (fitz.Rect): Target bbox. ''' @@ -362,12 +357,13 @@ def intersects(self, rect): def make_docx(self, paragraph): - '''Add text span to a docx paragraph, and set text style, e.g. font, color, underline, hyperlink, etc. + '''Add text span to a docx paragraph, and set text style, e.g. + font, color, underline, hyperlink, etc. .. note:: - Hyperlink and its style is parsed separately from pdf. For instance, regarding a general hyperlink with an - underline, the text and uri is parsed as hyperlink itself, while the underline is treated as a normal text - style. + Hyperlink and its style is parsed separately from pdf. For instance, regarding a general + hyperlink with an underline, the text and uri is parsed as hyperlink itself, while the + underline is treated as a normal text style. ''' # Create hyperlink in particular, otherwise add a run directly for style in self.style: @@ -376,12 +372,12 @@ def make_docx(self, paragraph): break else: docx_run = paragraph.add_run(self.text) - + # set text style, e.g. font, underline and highlight self._set_text_format(docx_run) # set charters spacing - if self.char_spacing: + if self.char_spacing: docx.set_char_spacing(docx_run, self.char_spacing) @@ -405,7 +401,7 @@ def _set_text_format(self, docx_run): font_name = self.font docx_run.font.name = font_name docx_run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name) # set font for chinese characters - docx_run.font.color.rgb = RGBColor(*share.rgb_component(self.color)) + docx_run.font.color.rgb = RGBColor(*rgb_component(self.color)) # font size # NOTE: only x.0 and x.5 is accepted in docx, so set character scaling accordingly @@ -417,11 +413,11 @@ def _set_text_format(self, docx_run): scale = self.size / (font_size or self.size or 1) if abs(scale-1.0)>=0.01: docx.set_char_scaling(docx_run, scale) - - # font style parsed from PDF rectangles: + + # font style parsed from PDF rectangles: # e.g. highlight, underline, strike-through-line for style in self.style: - + t = style['type'] # Built-in method is provided to set highlight in python-docx, but supports only limited colors; # so, set character shading instead if out of highlight color scope @@ -435,7 +431,7 @@ def _set_text_format(self, docx_run): docx_run.font.underline = True else: docx.set_char_underline(docx_run, style['color']) - + # same color with text for strike line elif t==RectType.STRIKE.value: - docx_run.font.strike = True \ No newline at end of file + docx_run.font.strike = True From fd52953a713509c6107e58f610200768aaf920d9 Mon Sep 17 00:00:00 2001 From: dothinking Date: Thu, 18 Jan 2024 18:33:26 +0800 Subject: [PATCH 3/8] optimize class structure --- pdf2docx/layout/Column.py | 35 ++--------------- pdf2docx/layout/Layout.py | 82 ++++++++++++++++++++------------------- pdf2docx/page/RawPage.py | 78 ++++++++++++++++++------------------- pdf2docx/table/Cell.py | 76 +++++++++++++++++------------------- 4 files changed, 120 insertions(+), 151 deletions(-) diff --git a/pdf2docx/layout/Column.py b/pdf2docx/layout/Column.py index 425c002..3e8e4b4 100644 --- a/pdf2docx/layout/Column.py +++ b/pdf2docx/layout/Column.py @@ -1,8 +1,6 @@ -# -*- coding: utf-8 -*- - '''Column of Section. -In most cases, one section per page. But in case multi-columns page, sections are used +In most cases, one section per page. But in case multi-columns page, sections are used to distinguish these different layouts. .. note:: @@ -22,21 +20,13 @@ ''' from ..common.Collection import Collection -from ..common.Element import Element from ..layout.Layout import Layout from ..shape.Shape import Shape from ..text.Line import Line -class Column(Element, Layout): - - def __init__(self, blocks=None, shapes=None): - '''Initialize empty column.''' - # Call the first parent class constructor only if omitting constructor. - # Unified constructor should be used (with *args, **kwargs) if using super().__init__(). - Element.__init__(self) - Layout.__init__(self, blocks, shapes) - +class Column(Layout): + '''Column of Section.''' @property def working_bbox(self): return self.bbox @@ -50,27 +40,10 @@ def add_elements(self, elements:Collection): self.assign_shapes(shapes) - def store(self): - '''Store parsed section layout in dict format.''' - res = Element.store(self) - res.update(Layout.store(self)) - return res - - - def restore(self, raw:dict): - '''Restore Column from raw dict.''' - self.update_bbox(raw.get('bbox', (0,)*4)) - super().restore(raw) - return self - - def make_docx(self, doc): - '''Create Section Column in docx. + '''Create Section Column in docx. Args: doc (Document): ``python-docx`` document object ''' self.blocks.make_docx(doc) - - - diff --git a/pdf2docx/layout/Layout.py b/pdf2docx/layout/Layout.py index 97d4a93..abdfe46 100644 --- a/pdf2docx/layout/Layout.py +++ b/pdf2docx/layout/Layout.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- - '''Document layout depends on Blocks and Shapes. **Layout** here refers to the content and position of text, image and table. The target is to convert source blocks and shapes to a *flow layout* that can be re-created as docx elements like paragraph and -table. In addition to ``Section`` and ``Column``, ``TableBlock`` is used to maintain the page layout . +table. In addition to ``Section`` and ``Column``, ``TableBlock`` is used to maintain the page layout . So, detecting and parsing table block is the principle steps. The prerequisite work is done before this step: @@ -12,12 +10,12 @@ 1. Clean up source blocks and shapes in Page level, e.g. convert source blocks to ``Line`` level, because the block structure determined by ``PyMuPDF`` might be not reasonable. #. Parse structure in document level, e.g. page header/footer. -#. Parse Section and Column layout in Page level. +#. Parse Section and Column layout in Page level. The page layout parsing idea: 1. Parse table layout in Column level. - (a) Detect explicit tables first based on shapes. + (a) Detect explicit tables first based on shapes. (#) Then, detect stream tables based on original text blocks and parsed explicit tables. (#) Move table contained blocks (lines or explicit table) to associated cell-layout. #. Parse paragraph in Column level. @@ -27,61 +25,65 @@ #. Repeat above steps for cell-layout in parsed table level. ''' +from abc import (ABC, abstractmethod) from ..text.Line import Line from ..common import constants +from ..common.Element import Element from ..shape.Shapes import Shapes -class Layout: +class Layout(Element, ABC): '''Blocks and shapes structure and formats.''' - def __init__(self, blocks=None, shapes=None): - ''' Initialize layout. - - Args: - blocks (Blocks): Blocks representing text/table contents. - shapes (Shapes): Shapes representing table border, shading and text style like underline, highlight. - parent (Page, Column, Cell): The object that this layout belonging to. - ''' + def __init__(self, bbox=None): + ''' Initialize layout. Note that layout bbox must be set explicitly, + rather than calculated automatically from contained blocks and shapes.''' from .Blocks import Blocks # avoid import conflicts from ..table.TablesConstructor import TablesConstructor - self.blocks = Blocks(instances=blocks, parent=self) - self.shapes = Shapes(instances=shapes, parent=self) - self._table_parser = TablesConstructor(parent=self) # table parser + raw = {'bbox': bbox} if bbox else {} + super().__init__(raw) + # Blocks representing text/table contents. + self.blocks = Blocks(parent=self) - def working_bbox(self, *args, **kwargs): - '''Working bbox of current Layout.''' - raise NotImplementedError + # Shapes representing table border, shading and text style like underline, highlight. + self.shapes = Shapes(parent=self) + + # table builder + self._table_parser = TablesConstructor(parent=self) # table parser - def contains(self, *args, **kwargs): - '''Whether given element is contained in this layout.''' - raise NotImplementedError + @property + @abstractmethod + def working_bbox(self): + '''Working bbox of current Layout.''' def store(self): '''Store parsed layout in dict format.''' - return { + res = super().store() # Element + res.update({ 'blocks': self.blocks.store(), 'shapes': self.shapes.store() - } + }) + return res def restore(self, data:dict): '''Restore Layout from parsed results.''' + self.update_bbox(data.get('bbox', (0,)*4)) self.blocks.restore(data.get('blocks', [])) self.shapes.restore(data.get('shapes', [])) return self def assign_blocks(self, blocks:list): - '''Add blocks (line or table block) to this layout. - + '''Add blocks (line or table block) to this layout. + Args: blocks (list): a list of text line or table block to add. - + .. note:: If a text line is partly contained, it must deep into span -> char. ''' @@ -89,8 +91,8 @@ def assign_blocks(self, blocks:list): def assign_shapes(self, shapes:list): - '''Add shapes to this cell. - + '''Add shapes to this cell. + Args: shapes (list): a list of Shape instance to add. ''' @@ -123,36 +125,36 @@ def _assign_block(self, block): # add block directly if fully contained in cell if self.contains(block, threshold=constants.FACTOR_MAJOR): self.blocks.append(block) - + # deep into line span if any intersection elif isinstance(block, Line) and self.bbox.intersects(block.bbox): self.blocks.append(block.intersects(self.bbox)) def _parse_table(self, **settings): - '''Parse table layout: - - * detect explicit tables first based on shapes, + '''Parse table layout: + + * detect explicit tables first based on shapes, * then stream tables based on original text blocks and parsed explicit tables; * move table contained blocks (text block or explicit table) to associated cell layout. - ''' + ''' # parse table structure/format recognized from explicit shapes if settings['parse_lattice_table']: self._table_parser.lattice_tables( settings['connected_border_tolerance'], settings['min_border_clearance'], settings['max_border_width']) - + # parse table structure based on implicit layout of text blocks if settings['parse_stream_table']: self._table_parser.stream_tables( settings['min_border_clearance'], settings['max_border_width'], settings['line_separate_threshold']) - + def _parse_paragraph(self, **settings): - '''Create text block based on lines, and parse text format, e.g. text highlight, + '''Create text block based on lines, and parse text format, e.g. text highlight, paragraph indentation ''' # group lines to text block self.blocks.parse_block( @@ -164,7 +166,7 @@ def _parse_paragraph(self, **settings): self.blocks.parse_text_format( self.shapes.text_style_shapes, settings['delete_end_line_hyphen']) - + # paragraph / line spacing self.blocks.parse_spacing( settings['line_separate_threshold'], @@ -172,4 +174,4 @@ def _parse_paragraph(self, **settings): settings['line_break_free_space_ratio'], settings['lines_left_aligned_threshold'], settings['lines_right_aligned_threshold'], - settings['lines_center_aligned_threshold']) \ No newline at end of file + settings['lines_center_aligned_threshold']) diff --git a/pdf2docx/page/RawPage.py b/pdf2docx/page/RawPage.py index 4e912fa..4f24f48 100644 --- a/pdf2docx/page/RawPage.py +++ b/pdf2docx/page/RawPage.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - '''A wrapper of pdf page engine (e.g. PyMuPDF, pdfminer) to do the following work: * extract source contents @@ -8,12 +6,13 @@ * parse page structure roughly, i.e. section and column ''' +from abc import (ABC, abstractmethod) from .BasePage import BasePage -from ..layout.Layout import Layout from ..layout.Section import Section from ..layout.Column import Column from ..shape.Shape import Hyperlink from ..shape.Shapes import Shapes +from ..layout.Blocks import Blocks from ..font.Fonts import Fonts from ..text.TextSpan import TextSpan from ..common.share import debug_plot @@ -21,36 +20,38 @@ from ..common.Collection import Collection -class RawPage(BasePage, Layout): +class RawPage(BasePage, ABC): '''A wrapper of page engine.''' def __init__(self, page_engine=None): ''' Initialize page layout. - + Args: page_engine (Object): Source pdf page. ''' BasePage.__init__(self) - Layout.__init__(self) self.page_engine = page_engine - + self.blocks = Blocks(parent=self) + self.shapes = Shapes(parent=self) + + @abstractmethod def extract_raw_dict(self, **settings): '''Extract source data with page engine. Return a dict with the following structure: ``` { "width" : w, - "height": h, + "height": h, "blocks": [{...}, {...}, ...], "shapes" : [{...}, {...}, ...] } ``` ''' - raise NotImplementedError - + + @property def text(self): - '''All extracted text in this page, with images considered as ````. + '''All extracted text in this page, with images considered as ````. Should be run after ``restore()`` data.''' return '\n'.join([block.text for block in self.blocks]) @@ -64,14 +65,15 @@ def raw_text(self): def restore(self, **settings): '''Initialize layout extracted with ``PyMuPDF``.''' raw_dict = self.extract_raw_dict(**settings) - super().restore(raw_dict) + self.blocks.restore(raw_dict.get('blocks', [])) + self.shapes.restore(raw_dict.get('shapes', [])) return self.blocks - + @debug_plot('Cleaned Shapes') def clean_up(self, **settings): - '''Clean up raw blocks and shapes, e.g. - + '''Clean up raw blocks and shapes, e.g. + * remove negative or duplicated instances, * detect semantic type of shapes ''' @@ -79,18 +81,16 @@ def clean_up(self, **settings): self.blocks.clean_up( settings['float_image_ignorable_gap'], settings['line_overlap_threshold']) - - # clean up shapes + # clean up shapes self.shapes.clean_up( settings['max_border_width'], settings['shape_min_dimension']) - return self.shapes - def process_font(self, fonts:Fonts): + def process_font(self, fonts:Fonts): '''Update font properties, e.g. font name, font line height ratio, of ``TextSpan``. - + Args: fonts (Fonts): Fonts parsed by ``fonttools``. ''' @@ -114,10 +114,10 @@ def calculate_margin(self, **settings): """Calculate page margin. .. note:: - Ensure this method is run right after cleaning up the layout, so the page margin is + Ensure this method is run right after cleaning up the layout, so the page margin is calculated based on valid layout, and stay constant. """ - # Exclude hyperlink from shapes because hyperlink might exist out of page unreasonably, + # Exclude hyperlink from shapes because hyperlink might exist out of page unreasonably, # while it should always within page since attached to text. shapes = Shapes([shape for shape in self.shapes if not isinstance(shape, Hyperlink)]) @@ -139,9 +139,9 @@ def calculate_margin(self, **settings): # use normal margin if calculated margin is large enough return ( - min(constants.ITP, round(left, 1)), - min(constants.ITP, round(right, 1)), - min(constants.ITP, round(top, 1)), + min(constants.ITP, round(left, 1)), + min(constants.ITP, round(right, 1)), + min(constants.ITP, round(top, 1)), min(constants.ITP, round(bottom, 1))) @@ -154,15 +154,15 @@ def parse_section(self, **settings): ''' # bbox X0, Y0, X1, _ = self.working_bbox - + # collect all blocks (line level) and shapes elements = Collection() elements.extend(self.blocks) elements.extend(self.shapes) if not elements: return - # to create section with collected lines - lines = Collection() + # to create section with collected lines + lines = Collection() sections = [] def close_section(num_col, elements, y_ref): # append to last section if both single column @@ -173,7 +173,7 @@ def close_section(num_col, elements, y_ref): # otherwise, create new section else: section = self._create_section(num_col, elements, (X0, X1), y_ref) - if section: + if section: sections.append(section) @@ -189,7 +189,7 @@ def close_section(num_col, elements, y_ref): # consider 2-cols only if current_num_col>2: current_num_col = 1 - + # the width of two columns shouldn't have significant difference elif current_num_col==2: u0, v0, u1, v1 = cols[0].bbox @@ -198,25 +198,25 @@ def close_section(num_col, elements, y_ref): c1, c2 = x0-X0, X1-x0 # column width w1, w2 = u1-u0, m1-m0 # line width f = 2.0 - if not 1/f<=c1/c2<=f or w1/c1<0.33 or w2/c2<0.33: + if not 1/f<=c1/c2<=f or w1/c1<0.33 or w2/c2<0.33: current_num_col = 1 # process exceptions if pre_num_col==2 and current_num_col==1: - # though current row has one single column, it might have another virtual + # though current row has one single column, it might have another virtual # and empty column. If so, it should be counted as 2-cols cols = lines.group_by_columns() pos = cols[0].bbox[2] if row.bbox[2]<=pos or row.bbox[0]>pos: current_num_col = 2 - + # pre_num_col!=current_num_col => to close section with collected lines, # before that, further check the height of collected lines else: x0, y0, x1, y1 = lines.bbox if y1-y0' for block in self.blocks]) @@ -43,36 +39,33 @@ def working_bbox(self): def store(self): - if bool(self): - res = super().store() # Element - res.update({ - 'bg_color': self.bg_color, - 'border_color': self.border_color, - 'border_width': self.border_width, - 'merged_cells': self.merged_cells - }) - res.update(Layout.store(self)) - return res - else: - return None + if not bool(self): return None + res = super().store() + res.update({ + 'bg_color': self.bg_color, + 'border_color': self.border_color, + 'border_width': self.border_width, + 'merged_cells': self.merged_cells + }) + return res def plot(self, page): - '''Plot cell and its sub-layout.''' + '''Plot cell and its sub-layout.''' super().plot(page) self.blocks.plot(page) def make_docx(self, table, indexes): '''Set cell style and assign contents. - + Args: table (Table): ``python-docx`` table instance. indexes (tuple): Row and column indexes, ``(i, j)``. - ''' + ''' # set cell style, e.g. border, shading, cell width self._set_style(table, indexes) - + # ignore merged cells if not bool(self): return @@ -83,7 +76,7 @@ def make_docx(self, table, indexes): if n_row*n_col!=1: _cell = table.cell(i+n_row-1, j+n_col-1) docx_cell.merge(_cell) - + # --------------------- # cell width (cell height is set by row height) # --------------------- @@ -92,18 +85,19 @@ def make_docx(self, table, indexes): docx_cell.width = Pt(x1-x0) # insert contents - # NOTE: there exists an empty paragraph already in each cell, which should be deleted first to - # avoid unexpected layout. `docx_cell._element.clear_content()` works here. - # But, docx requires at least one paragraph in each cell, otherwise resulting in a repair error. + # NOTE: there exists an empty paragraph already in each cell, which should be deleted + # first to avoid unexpected layout. `docx_cell._element.clear_content()` works here. + # But, docx requires at least one paragraph in each cell, otherwise resulting in a + # repair error. if self.blocks: docx_cell._element.clear_content() self.blocks.make_docx(docx_cell) def _set_style(self, table, indexes): - '''Set ``python-docx`` cell style, e.g. border, shading, width, row height, + '''Set ``python-docx`` cell style, e.g. border, shading, width, row height, based on cell block parsed from PDF. - + Args: table (Table): ``python-docx`` table object. indexes (tuple): ``(i, j)`` index of current cell in table. @@ -115,7 +109,7 @@ def _set_style(self, table, indexes): # --------------------- # border style # --------------------- - # NOTE: border width is specified in eighths of a point, with a minimum value of + # NOTE: border width is specified in eighths of a point, with a minimum value of # two (1/4 of a point) and a maximum value of 96 (twelve points) keys = ('top', 'end', 'bottom', 'start') kwargs = {} @@ -128,24 +122,24 @@ def _set_style(self, table, indexes): 'sz': 8*w, 'val': 'single', 'color': hex_c.upper() } - # merged cells are assumed to have same borders with the main cell + # merged cells are assumed to have same borders with the main cell for m in range(i, i+n_row): for n in range(j, j+n_col): - docx.set_cell_border(table.cell(m, n), **kwargs) + docx.set_cell_border(table.cell(m, n), **kwargs) # --------------------- # cell bg-color # --------------------- - if self.bg_color!=None: + if self.bg_color is not None: docx.set_cell_shading(docx_cell, self.bg_color) - + # --------------------- # clear cell margin # --------------------- - # NOTE: the start position of a table is based on text in cell, rather than left border of table. - # They're almost aligned if left-margin of cell is zero. + # NOTE: the start position of a table is based on text in cell, rather than + # left border of table. They're almost aligned if left-margin of cell is zero. docx.set_cell_margins(docx_cell, start=0, end=0) # set vertical direction if contained text blocks are in vertical direction if self.blocks.is_vertical_text: - docx.set_vertical_cell_direction(docx_cell) \ No newline at end of file + docx.set_vertical_cell_direction(docx_cell) From 888f72fb347348bfeb930c1b1704a589abf4ffca Mon Sep 17 00:00:00 2001 From: dothinking Date: Thu, 18 Jan 2024 20:43:09 +0800 Subject: [PATCH 4/8] downgrade PyMuPDF due to PyMuPDF/issues/3058 --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f3aaf50..7547c9d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ -PyMuPDF>=1.19.0 +PyMuPDF==1.23.8 python-docx>=0.8.10 fonttools>=4.24.0 numpy>=1.17.2 opencv-python>=4.5 +# opencv-python-headless>=4.5 fire>=0.3.0 \ No newline at end of file From cadacf5e5b9adf52107ce5448010a38ed6c979d9 Mon Sep 17 00:00:00 2001 From: dothinking Date: Thu, 18 Jan 2024 20:57:25 +0800 Subject: [PATCH 5/8] no need github page publish process for doc --- .github/workflows/doc.yml | 40 --------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 .github/workflows/doc.yml diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml deleted file mode 100644 index 0e73bd5..0000000 --- a/.github/workflows/doc.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: pdf2docx-doc - -on: - push: - branches: - - master - -jobs: - publish_doc: - runs-on: ubuntu-latest - steps: - - name: Check out code - uses: actions/checkout@v2 - - - name: Set up Python 3.x - uses: actions/setup-python@v1 - with: - python-version: '3.x' - - - name: Display Python version - run: python -c "import sys; print(sys.version)" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install sphinx sphinx_rtd_theme autodoc sphinxcontrib.apidoc setuptools - pip install -r requirements.txt - python setup.py develop - - # build package for tags, e.g. 3.2.1 extracted from 'refs/tags/v3.2.1' - - name: Create html doc - run: | - echo ${GITHUB_REF#refs/tags/v} > version.txt - make doc - - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./build/html \ No newline at end of file From 293fb7cde0b881f2e249839bc0f0c3ccab246989 Mon Sep 17 00:00:00 2001 From: dothinking Date: Fri, 19 Jan 2024 22:56:48 +0800 Subject: [PATCH 6/8] accommodate different behavior of Pixmap.colorspace; update test cases --- pdf2docx/image/ImagesExtractor.py | 35 ++++++++++++------ test/samples/demo-image-colorspace.pdf | Bin 0 -> 663142 bytes ...image-cmyk.pdf => demo-image-floating.pdf} | Bin test/samples/demo-image-transparent.pdf | Bin 128653 -> 0 bytes test/test.py | 31 ++++++++-------- 5 files changed, 39 insertions(+), 27 deletions(-) create mode 100644 test/samples/demo-image-colorspace.pdf rename test/samples/{demo-image-cmyk.pdf => demo-image-floating.pdf} (100%) delete mode 100644 test/samples/demo-image-transparent.pdf diff --git a/pdf2docx/image/ImagesExtractor.py b/pdf2docx/image/ImagesExtractor.py index 3b802a7..c4e8ed7 100644 --- a/pdf2docx/image/ImagesExtractor.py +++ b/pdf2docx/image/ImagesExtractor.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - '''Extract images from PDF. Both raster images and vector graphics are considered: @@ -32,7 +30,7 @@ def clip_page_to_pixmap(self, bbox:fitz.Rect=None, zoom:float=3.0): Args: bbox (fitz.Rect, optional): Target area to clip. Defaults to None, i.e. entire page. - Note that ``bbox`` depends on un-rotated page CS, while cliping page is based on + Note that ``bbox`` depends on un-rotated page CS, while clipping page is based on the final page. zoom (float, optional): Improve resolution by this rate. Defaults to 3.0. @@ -100,7 +98,6 @@ def extract_images(self, clip_image_res_ratio:float=3.0): # step 1: collect images: [(bbox, item), ..., ] ic = Collection() for item in self._page.get_images(full=True): - # image item: (xref, smask, width, height, bpc, colorspace, ...) item = list(item) item[-1] = 0 @@ -132,19 +129,33 @@ def extract_images(self, clip_image_res_ratio:float=3.0): else: bbox, item = group[0] - # recover image - pix = self._recover_pixmap(doc, item) - # regarding images consist of alpha values only, i.e. colorspace is None, - # the turquoise color shown in the PDF is not part of the image, but part of PDF background. + # Regarding images consist of alpha values only, the turquoise color shown in + # the PDF is not part of the image, but part of PDF background. # So, just to clip page pixmap according to the right bbox # https://github.com/pymupdf/PyMuPDF/issues/677 - alpha_only = not pix.colorspace - if alpha_only: + + # It's not safe to identify images with alpha values only, + # - colorspace is None, for pymupdf <= 1.23.8 + # - colorspace is always Colorspace(CS_RGB), for pymupdf==1.23.9-15 -> issue + # - colorspace is Colorspace(CS_), for pymupdf >= 1.23.16 + + # So, use extracted image info directly. + # image item: (xref, smask, width, height, bpc, colorspace, ...), e.g., + # (19, 0, 331, 369, 1, '', '', 'Im1', 'FlateDecode', 0) + # (20, 24, 1265, 1303, 8, 'DeviceRGB', '', 'Im2', 'FlateDecode', 0) + # (21, 0, 331, 369, 1, '', '', 'Im3', 'CCITTFaxDecode', 0) + # (22, 25, 1265, 1303, 8, 'DeviceGray', '', 'Im4', 'DCTDecode', 0) + # (23, 0, 1731, 1331, 8, 'DeviceGray', '', 'Im5', 'DCTDecode', 0) + if item[5]=='': raw_dict = self.clip_page_to_dict(bbox, clip_image_res_ratio) - # rotate image with opencv if page is rotated + # normal images else: + # recover image, e.g., handle image with mask, or CMYK color space + pix = self._recover_pixmap(doc, item) + + # rotate image with opencv if page is rotated raw_dict = self._to_raw_dict(pix, bbox) if rotation: raw_dict['image'] = self._rotate_image(pix, -rotation) @@ -338,7 +349,7 @@ def _recover_pixmap(doc:fitz.Document, item:list): # we may need to adjust something for CMYK pixmaps here -> # recreate pixmap in RGB color space if necessary # NOTE: pix.colorspace may be None for images with alpha channel values only - if pix.colorspace and not pix.colorspace.name in (fitz.csGRAY.name, fitz.csRGB.name): + if 'CMYK' in item[5].upper(): pix = fitz.Pixmap(fitz.csRGB, pix) return pix diff --git a/test/samples/demo-image-colorspace.pdf b/test/samples/demo-image-colorspace.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6d021bbce29e749536306529bd1a713a6f9af84b GIT binary patch literal 663142 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

gG_G}Ix>huj$Y*ZL+)7FOm!bQ<#Cl6cD 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