diff --git a/supernotelib/__init__.py b/supernotelib/__init__.py index d70f6b2..47d980a 100644 --- a/supernotelib/__init__.py +++ b/supernotelib/__init__.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = '0.5.0' +__version__ = '0.5.1' from . import color from . import converter diff --git a/supernotelib/cmds/supernote_tool.py b/supernotelib/cmds/supernote_tool.py index efbf115..feb912c 100755 --- a/supernotelib/cmds/supernote_tool.py +++ b/supernotelib/cmds/supernote_tool.py @@ -77,6 +77,7 @@ def save(svg, file_name): def convert_to_pdf(args, notebook, palette): vectorize = args.pdf_type == 'vector' use_link = not args.no_link + use_keyword = args.add_keyword converter = PdfConverter(notebook, palette=palette) def save(data, file_name): if data is not None: @@ -85,10 +86,10 @@ def save(data, file_name): else: print('no data') if args.all: - data = converter.convert(-1, vectorize, enable_link=use_link) # minus value means converting all pages + data = converter.convert(-1, vectorize, enable_link=use_link, enable_keyword=use_keyword) # minus value means converting all pages save(data, args.output) else: - data = converter.convert(args.number, vectorize, enable_link=use_link) + data = converter.convert(args.number, vectorize, enable_link=use_link, enable_keyword=use_keyword) save(data, args.output) def convert_to_txt(args, notebook, palette): @@ -183,6 +184,7 @@ def main(): parser_convert.add_argument('--exclude-background', action='store_true', default=False, help='exclude background and make it transparent (PNG and SVG are supported)') parser_convert.add_argument('--pdf-type', choices=['original', 'vector'], default='original', help='select PDF conversion type') parser_convert.add_argument('--no-link', action='store_true', default=False, help='disable links in PDF') + parser_convert.add_argument('--add-keyword', action='store_true', default=False, help='enable keywords in PDF') parser_convert.add_argument('--policy', choices=['strict', 'loose'], default='strict', help='select parser policy') parser_convert.set_defaults(handler=subcommand_convert) diff --git a/supernotelib/converter.py b/supernotelib/converter.py index 69f20a3..a28a297 100644 --- a/supernotelib/converter.py +++ b/supernotelib/converter.py @@ -307,7 +307,7 @@ def __init__(self, notebook, palette=None): self.palette = palette self.pagesize = A4 - def convert(self, page_number, vectorize=False, enable_link=False): + def convert(self, page_number, vectorize=False, enable_link=False, enable_keyword=False): """Returns PDF data of the given page. Parameters @@ -318,6 +318,8 @@ def convert(self, page_number, vectorize=False, enable_link=False): convert handwriting to vector enable_link : bool enable page links and web links + enable_keyword : bool + enable page link where keyword has been identified Returns ------- @@ -332,7 +334,7 @@ def convert(self, page_number, vectorize=False, enable_link=False): renderer_class = PdfConverter.ImgPageRenderer imglist = self._create_image_list(converter, page_number) pdf_data = BytesIO() - self._create_pdf(pdf_data, imglist, renderer_class, enable_link) + self._create_pdf(pdf_data, imglist, renderer_class, enable_link, enable_keyword) return pdf_data.getvalue() def _create_image_list(self, converter, page_number): @@ -348,15 +350,29 @@ def _create_image_list(self, converter, page_number): imglist.append(img) return imglist - def _create_pdf(self, buf, imglist, renderer_class, enable_link): + def _create_pdf(self, buf, imglist, renderer_class, enable_link, enable_keyword): c = canvas.Canvas(buf, pagesize=self.pagesize) + keywords = self.note.get_keywords() for n, img in enumerate(imglist): page = self.note.get_page(n) + pageid = page.get_pageid() horizontal = page.get_orientation() == fileformat.Page.ORIENTATION_HORIZONTAL pagesize = landscape(self.pagesize) if horizontal else portrait(self.pagesize) c.setPageSize(pagesize) renderer = renderer_class(img, pagesize) renderer.draw(c) + if enable_keyword: + found = [] + for keyword in keywords: + if keyword.get_page_number() == n: + found.append(keyword) + for i in found: + try: + c.bookmarkPage(pageid) + scaled_rect = self._calc_link_rect(i.get_rect(), renderer.get_scale()) + c.textAnnotation(i.get_keyword(),scaled_rect) + except: + continue if enable_link: pageid = page.get_pageid() if pageid is not None: @@ -449,3 +465,4 @@ def convert(self, page_number): if text_list is None: return None return ' '.join(text_list) + \ No newline at end of file diff --git a/supernotelib/fileformat.py b/supernotelib/fileformat.py index 832287e..b78c353 100644 --- a/supernotelib/fileformat.py +++ b/supernotelib/fileformat.py @@ -210,6 +210,13 @@ def get_page_number(self): def get_position(self): return self.position + + def get_keyword(self): + return None if self.metadata['KEYWORD'] is None else str(self.metadata['KEYWORD']) + + def get_rect(self): + (left, top, width, height) = self.metadata['KEYWORDRECT'].split(',') + return (int(left), int(top), int(left) + int(width), int(top) + int(height)) class Title: def __init__(self, title_info):