diff --git a/Dockerfile b/Dockerfile index ae94504..b906d02 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,11 @@ -FROM debian:stretch +FROM python:3.8.1-buster MAINTAINER nobody@nowhere.ws -RUN set -x \ - && apt-get update && apt-get install -y --no-install-recommends \ - gir1.2-poppler-0.18 \ - python-cairo \ - python-gi \ - python-gi-cairo \ - python-gobject \ - python-pip \ - python-setuptools \ - python-wheel - RUN mkdir /srv/eventmap WORKDIR /srv/eventmap COPY requirements.txt /srv/eventmap/requirements.txt -RUN pip install -r requirements.txt +RUN pip3 install -r requirements.txt COPY ./ /srv/eventmap diff --git a/read_layers.py b/read_layers.py index c28b3c9..018ef10 100644 --- a/read_layers.py +++ b/read_layers.py @@ -8,8 +8,10 @@ # import cairo +import fitz import json import math +import io import os import shutil import stat @@ -59,47 +61,35 @@ def draw(self, context): def _load_file(self, path): raise NotImplementedError - def __cmp__(self, other): - return cmp(self.name, other.name) + def __lt__(self, other): + return self.name < other.name - -class PdfLayer(Layer): - def _load_file(self, path): - import gi - gi.require_version('Poppler', '0.18') - from gi.repository import Poppler - document = Poppler.Document.new_from_file('file://{0}'.format(path), None) - self._page = document.get_page(0) +class ImageLayer(Layer): @property def _orig_width(self): - return self._page.get_size()[0] + return self._image.get_width() @property def _orig_height(self): - return self._page.get_size()[1] + return self._image.get_height() def draw(self, context): - super(PdfLayer, self).draw(context) - self._page.render(context) + super().draw(context) + context.set_source_surface(self._image) + context.paint() -class PngLayer(Layer): +class PdfLayer(ImageLayer): def _load_file(self, path): - self._image = cairo.ImageSurface.create_from_png(path) + document = fitz.open(path) + image = io.BytesIO(document.loadPage(0).getPixmap().getPNGData()) + self._image = cairo.ImageSurface.create_from_png(image) - @property - def _orig_width(self): - return self._image.get_width() - @property - def _orig_height(self): - return self._image.get_height() - - def draw(self, context): - super(PngLayer, self).draw(context) - context.set_source_surface(self._image) - context.paint() +class PngLayer(ImageLayer): + def _load_file(self, path): + self._image = cairo.ImageSurface.create_from_png(path) class LayerLoader(object): diff --git a/requirements.txt b/requirements.txt index 9a22a70..8fb2e99 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,8 @@ jaraco.functools==1.20 more-itertools==4.3.0 portend==2.3 pytz==2018.7 +pycairo==1.19.1 +PyMuPDF==1.16.11 PyYAML==3.13 six==1.12.0 tempora==1.14 diff --git a/run_server.py b/run_server.py index 6a62073..f1b4584 100755 --- a/run_server.py +++ b/run_server.py @@ -6,7 +6,7 @@ # import os -from cStringIO import StringIO +from io import StringIO import hashlib import threading import json @@ -25,13 +25,13 @@ def __init__(self, synchronized_json): super(SynchronizedJSONAutoLoader, self).__init__() def run(self): - print "Autoloader Starting up" + print("Autoloader Starting up") time.sleep(2) while cherrypy.engine.state == cherrypy.engine.states.STARTED: time.sleep(1) with self._synchronized_json.lock: self._synchronized_json.load() - print "Autoloader Exiting" + print("Autoloader Exiting") class SynchronizedJSON(object): def __init__(self, filename): @@ -73,7 +73,7 @@ def _update_sync_id(self): del doc['sync-id'] hashed_data = json.dumps(doc) h = hashlib.sha256() - h.update(hashed_data) + h.update(hashed_data.encode('utf-8')) doc['sync-id'] = h.hexdigest() self._new['data'] = json.dumps(doc, indent=4) self._new['sync-id'] = h.hexdigest() @@ -89,7 +89,7 @@ def set_data(self, data): self._update_sync_id() with open(self._filename + '.new', 'wb') as f: - f.write(self._new['data']) + f.write(self._new['data'].encode("utf-8")) f.flush() os.fsync(f.fileno()) os.rename(self._filename + '.new', self._filename) @@ -140,7 +140,7 @@ def __init__(self, path): self.markers = EventMapMarkerApi(path) def test_log(msg, level): - print "%s, %s" % (msg, level) + print("%s, %s" % (msg, level)) if __name__ == '__main__': publish = len(sys.argv) >= 2 and sys.argv[1] == '-P' @@ -151,7 +151,8 @@ def test_log(msg, level): 'server.socket_port': 8023, 'server.thread_pool_max': 500, 'server.thread_pool': 100, - 'log.screen': True + 'log.screen': True, + 'tools.encode.text_only': False }) cherrypy.tree.mount(None, '/', {