From 186d269448e517bc61ace1d38f5de1463e178e53 Mon Sep 17 00:00:00 2001 From: Stanislaw Kuich Date: Sun, 14 Jul 2024 23:10:43 +0200 Subject: [PATCH 1/5] added keyword object --- supernotelib/cmds/supernote_tool.py | 3 +++ supernotelib/fileformat.py | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/supernotelib/cmds/supernote_tool.py b/supernotelib/cmds/supernote_tool.py index fb9501b..05a8c4c 100755 --- a/supernotelib/cmds/supernote_tool.py +++ b/supernotelib/cmds/supernote_tool.py @@ -52,6 +52,9 @@ def subcommand_analyze(args): def subcommand_convert(args): notebook = sn.load_notebook(args.input, policy=args.policy) total = notebook.get_total_pages() + keywords = notebook.get_keywords() + for i in keywords: + print(i['keyword']) palette = None if args.color: try: diff --git a/supernotelib/fileformat.py b/supernotelib/fileformat.py index 1da2bb5..4c4f59c 100644 --- a/supernotelib/fileformat.py +++ b/supernotelib/fileformat.py @@ -193,6 +193,7 @@ class Keyword: def __init__(self, keyword_info): self.metadata = keyword_info self.content = None + self.keyword = str(self.metadata['KEYWORD']) self.page_number = int(self.metadata['KEYWORDPAGE']) - 1 self.position = int(self.metadata['KEYWORDRECT'].split(',')[1]) # get top value from "left,top,width,height" @@ -207,6 +208,12 @@ def get_page_number(self): def get_position(self): return self.position + + def get_keyword(self): + return self.keyword + + def __str__(self): + return 'Keyword: %s, Page: %s' % (self.keyword,self.page_number) class Title: def __init__(self, title_info): From 5e8902854d94ad52d80746ddd15c2d47cb704494 Mon Sep 17 00:00:00 2001 From: Stanislaw Kuich Date: Mon, 29 Jul 2024 00:56:29 +0200 Subject: [PATCH 2/5] added extracted keywords to the outline list --- supernotelib/__init__.py | 2 +- supernotelib/cmds/supernote_tool.py | 13 ++++--------- supernotelib/converter.py | 18 +++++++++++++++--- 3 files changed, 20 insertions(+), 13 deletions(-) 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 d3d7e4f..136f5ed 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 = not args.no_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): @@ -108,13 +109,6 @@ def save(data, file_name): def subcommand_convert(args): notebook = sn.load_notebook(args.input, policy=args.policy) -<<<<<<< HEAD - total = notebook.get_total_pages() - keywords = notebook.get_keywords() - for i in keywords: - print(i['keyword']) -======= ->>>>>>> master palette = None if args.color: try: @@ -190,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('--no-keyword', action='store_true', default=False, help='disable 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..2b3d1ce 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,7 +350,7 @@ 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) for n, img in enumerate(imglist): page = self.note.get_page(n) @@ -357,12 +359,21 @@ def _create_pdf(self, buf, imglist, renderer_class, enable_link): c.setPageSize(pagesize) renderer = renderer_class(img, pagesize) renderer.draw(c) + if enable_keyword: + keywords = self.note.get_keywords() + for keyword in keywords: + if keyword.get_page_number() != n: + continue + else: + pageid = page.get_pageid() + c.addOutlineEntry(str(keyword),pageid,0,0) if enable_link: pageid = page.get_pageid() if pageid is not None: c.bookmarkPage(pageid) self._add_links(c, n, renderer.get_scale()) c.showPage() + c.showOutline() c.save() def _add_links(self, cvs, page_number, scale): @@ -449,3 +460,4 @@ def convert(self, page_number): if text_list is None: return None return ' '.join(text_list) + \ No newline at end of file From 7b9cf1955ce29abcadab26e86a61f30b3cf2af84 Mon Sep 17 00:00:00 2001 From: Stanislaw Kuich Date: Thu, 1 Aug 2024 10:54:50 +0200 Subject: [PATCH 3/5] modified converter --- supernotelib/converter.py | 17 ++++++++++++----- supernotelib/fileformat.py | 6 +----- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/supernotelib/converter.py b/supernotelib/converter.py index 2b3d1ce..ccb483c 100644 --- a/supernotelib/converter.py +++ b/supernotelib/converter.py @@ -352,21 +352,28 @@ def _create_image_list(self, converter, page_number): 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): + print('Page: '+str(n)) 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: - keywords = self.note.get_keywords() + found = [] for keyword in keywords: - if keyword.get_page_number() != n: + if keyword.get_page_number() == n: + found.append(keyword) + for i in found: + try: + print('Added Keyword: '+i.get_keyword()+' Keyword Page: '+str(i.get_page_number())) + c.bookmarkPage(pageid) + c.addOutlineEntry(i.get_keyword(),pageid,0,0) + except: continue - else: - pageid = page.get_pageid() - c.addOutlineEntry(str(keyword),pageid,0,0) if enable_link: pageid = page.get_pageid() if pageid is not None: diff --git a/supernotelib/fileformat.py b/supernotelib/fileformat.py index a86d580..56f3002 100644 --- a/supernotelib/fileformat.py +++ b/supernotelib/fileformat.py @@ -196,7 +196,6 @@ class Keyword: def __init__(self, keyword_info): self.metadata = keyword_info self.content = None - self.keyword = str(self.metadata['KEYWORD']) self.page_number = int(self.metadata['KEYWORDPAGE']) - 1 self.position = int(self.metadata['KEYWORDRECT'].split(',')[1]) # get top value from "left,top,width,height" @@ -213,10 +212,7 @@ def get_position(self): return self.position def get_keyword(self): - return self.keyword - - def __str__(self): - return 'Keyword: %s, Page: %s' % (self.keyword,self.page_number) + return None if self.metadata['KEYWORD'] is None else str(self.metadata['KEYWORD']) class Title: def __init__(self, title_info): From cf5e61029686a34c67d994dbac5dc140586f57f5 Mon Sep 17 00:00:00 2001 From: Stanislaw Kuich Date: Fri, 2 Aug 2024 00:31:36 +0200 Subject: [PATCH 4/5] added annotations instead outlin due to overwritten outline key --- supernotelib/converter.py | 10 ++++++++-- supernotelib/fileformat.py | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/supernotelib/converter.py b/supernotelib/converter.py index ccb483c..8d4d8c0 100644 --- a/supernotelib/converter.py +++ b/supernotelib/converter.py @@ -371,7 +371,10 @@ def _create_pdf(self, buf, imglist, renderer_class, enable_link, enable_keyword) try: print('Added Keyword: '+i.get_keyword()+' Keyword Page: '+str(i.get_page_number())) c.bookmarkPage(pageid) - c.addOutlineEntry(i.get_keyword(),pageid,0,0) + scaled_rect = self._calc_link_rect(i.get_rect(), renderer.get_scale()) + #c.linkAbsolute(i.get_keyword(), pageid, scaled_rect) + #c.addOutlineEntry(i.get_keyword(),pageid,0,0) + c.textAnnotation(i.get_keyword(),scaled_rect) except: continue if enable_link: @@ -380,7 +383,10 @@ def _create_pdf(self, buf, imglist, renderer_class, enable_link, enable_keyword) c.bookmarkPage(pageid) self._add_links(c, n, renderer.get_scale()) c.showPage() - c.showOutline() + #c.showOutline() + c.setTitle('Notes') + c.setSubject('Notes') + c.setAuthor('Author') c.save() def _add_links(self, cvs, page_number, scale): diff --git a/supernotelib/fileformat.py b/supernotelib/fileformat.py index 56f3002..b78c353 100644 --- a/supernotelib/fileformat.py +++ b/supernotelib/fileformat.py @@ -213,6 +213,10 @@ def get_position(self): 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): From 7928cfa034783b8775ea4f68c269c44f18505b9f Mon Sep 17 00:00:00 2001 From: Stanislaw Kuich Date: Sun, 29 Sep 2024 12:45:41 +0200 Subject: [PATCH 5/5] 1. Debug output has been suppressed2. Keyword Annotation feature has been disabled by default\n3. It has been removed unnecessary parts of code" --- supernotelib/cmds/supernote_tool.py | 4 ++-- supernotelib/converter.py | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/supernotelib/cmds/supernote_tool.py b/supernotelib/cmds/supernote_tool.py index 136f5ed..feb912c 100755 --- a/supernotelib/cmds/supernote_tool.py +++ b/supernotelib/cmds/supernote_tool.py @@ -77,7 +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 = not args.no_keyword + use_keyword = args.add_keyword converter = PdfConverter(notebook, palette=palette) def save(data, file_name): if data is not None: @@ -184,7 +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('--no-keyword', action='store_true', default=False, help='disable keywords 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 8d4d8c0..a28a297 100644 --- a/supernotelib/converter.py +++ b/supernotelib/converter.py @@ -354,7 +354,6 @@ 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): - print('Page: '+str(n)) page = self.note.get_page(n) pageid = page.get_pageid() horizontal = page.get_orientation() == fileformat.Page.ORIENTATION_HORIZONTAL @@ -369,11 +368,8 @@ def _create_pdf(self, buf, imglist, renderer_class, enable_link, enable_keyword) found.append(keyword) for i in found: try: - print('Added Keyword: '+i.get_keyword()+' Keyword Page: '+str(i.get_page_number())) c.bookmarkPage(pageid) scaled_rect = self._calc_link_rect(i.get_rect(), renderer.get_scale()) - #c.linkAbsolute(i.get_keyword(), pageid, scaled_rect) - #c.addOutlineEntry(i.get_keyword(),pageid,0,0) c.textAnnotation(i.get_keyword(),scaled_rect) except: continue @@ -383,10 +379,6 @@ def _create_pdf(self, buf, imglist, renderer_class, enable_link, enable_keyword) c.bookmarkPage(pageid) self._add_links(c, n, renderer.get_scale()) c.showPage() - #c.showOutline() - c.setTitle('Notes') - c.setSubject('Notes') - c.setAuthor('Author') c.save() def _add_links(self, cvs, page_number, scale):