From 76e43bcb89dc96f18c966fab273f439f7efe2e12 Mon Sep 17 00:00:00 2001 From: "florian on nixos (Florian Brandes)" Date: Wed, 23 Mar 2022 13:26:43 +0100 Subject: [PATCH] add first tests for barcode reader Signed-off-by: florian on nixos (Florian Brandes) --- src/documents/tasks.py | 77 +++++++++++++++++++ src/documents/tests/samples/patch-code-t.pbm | Bin 0 -> 484186 bytes src/documents/tests/samples/patch-code-t.pdf | Bin 0 -> 40893 bytes src/documents/tests/test_tasks.py | 11 +++ 4 files changed, 88 insertions(+) create mode 100644 src/documents/tests/samples/patch-code-t.pbm create mode 100644 src/documents/tests/samples/patch-code-t.pdf diff --git a/src/documents/tasks.py b/src/documents/tasks.py index b43f211de..dc646ddfc 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -16,6 +16,13 @@ from documents.models import Tag from documents.sanity_checker import SanityCheckFailedException from whoosh.writing import AsyncWriter +# barcode decoder +import os +from pyzbar import pyzbar +from pdf2image import convert_from_path +import tempfile +from pikepdf import Pdf + logger = logging.getLogger("paperless.tasks") @@ -62,6 +69,71 @@ def train_classifier(): logger.warning("Classifier error: " + str(e)) + +def barcode_reader(page) -> list: + """ + Read any barcodes contained in page + Returns a list containing all found barcodes + """ + barcodes = [ ] + # Decode the barcode image + detected_barcodes = pyzbar.decode(page) + + if not detected_barcodes: + logger.debug(f"No barcode detected") + else: + # Traverse through all the detected barcodes in image + for barcode in detected_barcodes: + if barcode.data!="": + barcodes = barcodes + [str(barcode.data)] + logger.debug(f"Barcode of type {str(barcode.type)} found: {str(barcode.data)}") + return barcodes + +def scan_file_for_seperating_barcodes(filepath) -> list: + """ + Scan the provided file for page seperating barcodes + Returns a list of pagenumbers, which seperate the file + """ + seperator_page_numbers = [ ] + # use a temporary directory in case the file os too big to handle in memory + with tempfile.TemporaryDirectory() as path: + pages_from_path = convert_from_path(filepath, output_folder=path) + for current_page_number, page in enumerate(pages_from_path): + current_barcodes = barcode_reader(page) + if current_barcodes.isin("PATCHT"): + seperator_page_numbers = seperator_page_numbers + current_page_number + return seperator_page_numbers + +def seperate_pages(filepath, pages_to_split_on: list): + """ + Seperate the provided file on the pages_to_split_on. + The pages which are defined by page_numbers will be removed. + """ + pages_to_split_on = scan_file_for_seperating_barcodes(filepath) + fname = os.path.splitext(os.path.basename(filepath))[0] + pdf = Pdf.open(filepath) + # TODO: Get the directory of the file and save the other files there + # TODO: Return list of new paths of the new files + for count, page_number in enumerate(pages_to_split_on): + # First element, so iterate from zero to the first seperator page + if count == 0: + dst = Pdf.new() + for page in range(0, page_number): + dst.pages.append(page) + output_filename = '{}_page_{}.pdf'.format( + fname, str(count)) + with open(output_filename, 'wb') as out: + dst.save(out) + else: + dst = Pdf.new() + for page in range(pages_to_split_on[count-1], page_number): + dst.pages.append(page) + output_filename = '{}_page_{}.pdf'.format( + fname, page+1) + with open(output_filename, 'wb') as out: + dst.save(out) + + def consume_file( path, override_filename=None, @@ -72,6 +144,11 @@ def consume_file( task_id=None, ): + # check for seperators in current document + seperator_page_numbers = scan_file_for_seperating_barcodes(path) + if seperator_page_numbers != [ ]: + logger.debug(f"Pages with seperators found: {str(seperator_page_numbers)}") + document = Consumer().try_consume_file( path, override_filename=override_filename, diff --git a/src/documents/tests/samples/patch-code-t.pbm b/src/documents/tests/samples/patch-code-t.pbm new file mode 100644 index 0000000000000000000000000000000000000000..7e721407032ca07ea287cbaa8568bc51890665fe GIT binary patch literal 484186 zcmeI5e{dUTe%^P16#@Au5`a{PvJeu6aLVPXG&HH|pfMw^ZP)^@%EfjrjW5%=LMIL! z&!{OCcU)?skruLQ0(Z1X$mx}=b&+%DCX@Wpk*iK;ZjwKsP`0E7lHyA{BTeoy(2qOK zbljAZW_of*WA^*LyP#GS@d{YISYqL4M*wsw%?)0ib(PLS_<+aa5rkk8vvSm`ycfxFWVa)K%o#pT5KF8k=+%_e6&V0c%D zRq_zOQ{(QmL(ewkFOjgekz?!G+QA*jY32R`?!X<_Y5=ggR@Dwp)V}Tn?l`E97E5At zr^QO-xef1wT94tHd; zU+Hhjw%uT%EJxyg5H*}BpF3#Z;x+hHQntYVrHd9I^-p>^xKv67LT!JyIxvmuM_ zboaNFoG<8#s&;i7joI3ou^DV7MfHb0&l`7ybp-_5Dpg(e(@JaBc%7xqWC1iTkOeR((G054|nNa%8igE~BcZd0vj`2;GAI4J~K!z8upL8X!<# z(3kMMJC-ACfY1h8)e$y)YoiTvTG>qIj;iRoqR>C@Z%hu|>(CbCuO5BTL)4?uKPE@} z<~M)4_)Smua0au1R)camuf6m;FTLhvIqEO`hkt+lw+~x#MqYaPr4diddE)E;{11PJ z9_4a(ye}v6^{@Zo%QiW`>1}tG%K3Hg%lVPzj`urimE3u!3Y+<)KxciOS2u$d-0G;k zs=-!no$XtfQQKj!@3M}%jW)<>Wi#Op+;Oc20Gn%7?chXk$3dmJmIUs&R@Dwp1a}-% znrlhmj%!uz;6!l8L8ZBt1n#(2)ecSscN|ojYf0daYgO&wL~zGJrMZ>_?zmRf4o(Dj z98{WXN#KraRqfzJaK}NVxt0X(xK`B;P6T%xRGMo^;Erom?chXk$3dmJmIUs&R@Dwp z1a}-%nrlhmj%!uz;6!l8L8ZBt1n#(2)ecSscN|ojYf0daYgO&wL~zGJrMZ@5sXKv% zJ4#@IHuko-tN7WW72T*t`1#q}eY^Kn738dpNpOd1z}8@FyJ$PIkpygjO*T_C^8;*v zttK3@0{|Oflg(7k`~X{R*eGP>H}0I2@y^O?p%OrjZB$^}Z3%PWPOafvOW1?9V{0(B z-Ig#1Z3k_~JrL0q*xJ8s*F6VBXM#I6OKiKMI&&`!?$|7`?cy0VCqv>3F)a@^%)Uu< zhGhkJs0M89-?odcKr(B9ja}bugxPih8(49U&kx0|6UglgX1XFTe)agn-Bl z1Z;p!CQrh=02^Qv0wOaIumLuiJPGpxY=BJ&h|EC12H0fsB+Lu20X88ZG6MnI=LR+s zy7C)m7wf25HQfKL-j%n8N&t6k6QZ`=mM{nI)S9_&3473XYz@Y?+Y;uW?V#ZMWI=USIxj z$7YFbx4znIb}YDKv&6RB?0T;+f4F0_#I{>s?KL|V+_70=+iiBe*Ox!su~}lhdZ_gW81|ecX^nZIRQ4R0UKeqUBCv|gf)P+gSI0CL}nmh18g#R z66OWi0GkjHnSp=}u*u{}m=|CJY(hX}1_Cy~CX**&UVsg-2?3EA2-pCdOrC^!0XD!U z1Vm;aU;}J2c@pLY*lNQ@AuGRe_ppwdRRh*hHycO5W}AJt?KZpK>&qYR*etQ_)>nJY zjsuKGIim*)AUBcDCMW+TkD3)tkdCh<$k z=nCZ9gRa2V{%yPH3gokfuAtUe$kDUOr>(VmHg(~%N0ZoEa)#MLpXIhbUQYIMce&uj zV?3Ia6;lsyJN&0-jKx#;@IBQmXo-E`5%|%7Rq6$Ue^mO+SoGRrau&?;(d!W3v&-Ry zuCT-2k;9A2iu|CQgUkb7{oawY*fj60dX3oMw$y0I`8;`kT zbEl81S*UnR4y%2(Js@Y;l*4HB4s5*ksl=+;3ESKuHLR~@eSwGM%u{h`dq55et0?RW zLxG-UH0eLx;K0zz8W5qqgLhkc^AfXSaJg9CFdYJzSJES&A(vz%0ATC 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