master
Your Name 6 years ago
parent 6c578da591
commit 710bfdcd2b

@ -0,0 +1,33 @@
import requests
import json
r = requests.get("http://127.0.0.1:5000/api/getcontent")
data = r.json()
def getcategory(category):
counter = 0
output=[]
for post in data:
if data[post]["category"] == category:
output.append(data[post]["title"])
counter+=1
if counter == 0:
print("Nothing found")
return output
def get(category, number):
counter = 1
output = []
for post in data:
if data[post]["category"] == category:
if counter == number:
output.append(data[post]["title"])
output.append(data[post]["content"])
counter+=1
return output
#getcategory("thesis")
#get("thesis", 2) #thesis, exercise or term

@ -0,0 +1,95 @@
import argparse
import sys
import os
import six
from random import randint
from PIL import Image, ImageOps
ESC = b'\x1B'
ETX = b'\x03'
SO = b'\x0E'
GRAPHIC = b'\x1B'+b'\x2A'+b'\x01' #1B 2A
LINE_FEED = b'\n'
CARIDGE_RET = b'\x0D'
DATA = bytearray()
COLUMNS = 2000
H = COLUMNS // 256
L = COLUMNS % 256
def _to_column_format(im, line_height):
"""
Extract slices of an image as equal-sized blobs of column-format data.
:param im: Image to extract from
:param line_height: Printed line height in dots
"""
width_pixels, height_pixels = im.size
top = 0
left = 0
blobs = []
while left < width_pixels:
remaining_pixels = width_pixels - left
box = (left, top, left + line_height, top + height_pixels)
#transform: (size, method, data=None, resample=0, fill=1)
slice = im.transform((line_height, height_pixels), Image.EXTENT, box)
bytes = slice.tobytes()
blobs.append(bytes)
left += line_height
return blobs
def _int_low_high(inp_number, out_bytes):
""" Generate multiple bytes for a number: In lower and higher parts, or more parts as needed.
to generate the H and L value
:param inp_number: Input number
:param out_bytes: The number of bytes to output (1 - 4).
"""
max_input = (256 << (out_bytes * 8) - 1);
if not 1 <= out_bytes <= 4:
raise ValueError("Can only output 1-4 byes")
if not 0 <= inp_number <= max_input:
raise ValueError("Number too large. Can only output up to {0} in {1} byes".format(max_input, out_bytes))
outp = b'';
for _ in range(0, out_bytes):
outp += six.int2byte(inp_number % 256)
inp_number = inp_number // 256
return outp
def print(filename):
im = Image.open(filename)
basewidth = 350
# Initial rotate. mirror, and extract blobs for each 8 or 24-pixel row
# Convert to black & white via greyscale (so that bits can be inverted)
im = im.transpose(Image.ROTATE_270).transpose(Image.FLIP_LEFT_RIGHT)
height_pixels, width_pixels = im.size
if width_pixels > basewidth:
wpercent = (basewidth/float(im.size[0]))
hsize = int((float(im.size[1])*float(wpercent)))
im = im.resize((basewidth,hsize), Image.NEAREST)
height_pixels, width_pixels = im.size
im = im.resize((height_pixels,int(width_pixels*1.5)), Image.ANTIALIAS)
im = im.convert("L") # Invert: Only works on 'L' images
im = ImageOps.invert(im) # Bits are sent with 0 = white, 1 = black in ESC/POS
im = im.convert("1") # Pure black and white
#im.show()
line_height = 1
blobs = _to_column_format (im, line_height * 8);
height_pixels, width_pixels = im.size
with open('/dev/tty', 'wb') as fp:
fp.write(ESC+b"@")
fp.write(ESC+b"\x7B"+b"\x41")
fp.write(ESC + b"3" + six.int2byte(22)); # Adjust line-feed size
fp.write(CARIDGE_RET)
for blob in blobs:
fp.write(GRAPHIC + _int_low_high( width_pixels, 2 ) + blob)
fp.write(LINE_FEED)
#fp.write(GRAPHIC + bytes([L,H]) + DATA)
fp.write(ESC + b"2"); # Reset line-feed size

@ -3,10 +3,13 @@ import sys
import os import os
import six import six
from random import randint from random import randint
import random
from PIL import Image, ImageOps from PIL import Image, ImageOps
import curses import curses
import sys, termios, tty, os, time import sys, termios, tty, os, time
import apirequest
import imageprinter
import requests
class Printer(): class Printer():
ESC = b'\x1B' ESC = b'\x1B'
@ -22,6 +25,9 @@ class Printer():
def printchar(self,char): def printchar(self,char):
with open(self.target, 'wb') as printer: with open(self.target, 'wb') as printer:
if self.debug:
printer.write(bytes(str(char), 'utf-8'))
else:
printer.write(self.ESC+b"\x7B"+b"\x41") printer.write(self.ESC+b"\x7B"+b"\x41")
char=self.strokes*" "+char char=self.strokes*" "+char
printer.write(bytes(str(char), 'utf-8')) printer.write(bytes(str(char), 'utf-8'))
@ -33,6 +39,9 @@ class Printer():
def printstring(self,string): def printstring(self,string):
with open(self.target, 'wb') as printer: with open(self.target, 'wb') as printer:
if self.debug:
printer.write(bytes(str(string), 'utf-8'))
else:
printer.write(self.ESC+b"\x7B"+b"\x41") printer.write(self.ESC+b"\x7B"+b"\x41")
printer.write(bytes(str(string), 'utf-8')) printer.write(bytes(str(string), 'utf-8'))
printer.write(self.ESC+b"\x25"+b"\x46"+b"\x0F"+b"\x00"+b"\x04"+b"\x08"+b"\x00") printer.write(self.ESC+b"\x25"+b"\x46"+b"\x0F"+b"\x00"+b"\x04"+b"\x08"+b"\x00")
@ -49,27 +58,34 @@ class Printer():
class Terminal(): class Terminal():
lineinput = "" lineinput = ""
commandMode = False commandMode = True
writeloop = True writeloop = True
def __init__(self,printer): def __init__(self,printer, persons):
self.printer = printer self.printer = printer
self.persons = persons
def waittostart(self):
self.writeloop = True
while self.writeloop:
char = self.getch()
self.writeloop = False
self.lineinput = ""
continue
def waitforinput(self): def waitforinput(self):
term.writeloop = True self.writeloop = True
while self.writeloop: while self.writeloop:
char = self.getch() char = self.getch()
self.lineinput+=char
print(self.lineinput)
if (ord(char) == 27): if (ord(char) == 27):
print("exit publication :-(") print("exit publication :-(")
exit(0) exit(0)
if (ord(char) == 13): if (ord(char) == 13):
self.printer.newline() self.printer.newline()
self.checkforcommand(self.lineinput) self.command(self.lineinput)
self.lineinput = "" self.lineinput = ""
else: else:
print(char) self.lineinput+=char
self.printer.printchar(char) self.printer.printchar(char)
def getch(self): def getch(self):
@ -83,21 +99,99 @@ class Terminal():
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch return ch
def checkforcommand(self, command): def command(self, command):
print("received command:"+command) #print("received command: "+str(command))
if command == "help": if "help" == str(command):
self.printer.printstring("type commands to print the publication")
self.printer.printstring("help:")
self.printer.printstring(" get help on the commands")
#self.writeloop = False
elif str(command).split(" ")[0] == "exercise" or str(command).split(" ")[0] == "thesis":
part = str(command).split(" ")[0]
try:
arguments = str(command.strip()).split(" ")
arguments.pop(0)
for i,arg in enumerate(arguments):
if arg.isdigit():
number = int(arg)
if number > len(apirequest.getcategory(part)):
self.printer.printstring("Number must be inbetween 1 and "+ str(len(apirequest.getcategory(part))))
else:
result = apirequest.get(part, number)
for line in result:
self.printer.printstring(line)
self.printer.newline()
else:
raise Exeption("not a number")
except:
self.printer.printstring("ERROR: no argument given. Usage: "+part+" <number>")
elif str(command).split(" ")[0] == "whois":
if str(command).split(" ")[1] in self.persons:
self.printer.printstring(self.persons[str(command).split(" ")[1]])
else:
self.printer.printstring("Sorry not found, try " + random.choice(list(self.persons)))
elif "exit" == str(command):
self.printer.printstring("Imprint")
result = apirequest.get("imprint", 1)
for line in result:
self.printer.printstring(line)
self.printer.newline()
main()
else:
self.printer.printstring("~ command not found. try help for a list of available commands")
self.printer.newline()
#if the command is valid we want to execute the command and continue the story #if the command is valid we want to execute the command and continue the story
#self.writeloop = False #self.writeloop = False
persons = {
"Kittler":"Friedrich A. Kittler (June 12, 1943 October 18, 2011) was a literary scholar and a media theorist. His works relate to media, technology, and the military. ",
"Alex":"Alexander Roidl created Poetic Software as part of his Master's thesis"
}
printer = Printer() printer = Printer()
term = Terminal(printer) term = Terminal(printer, persons)
printer.printstring("W E L C O M E !")
printer.printstring("---------------") def printimagefromurl(url):
printer.printstring("POETIC SOFTWARE") page = requests.get(url)
printer.printstring("---------------") f_ext = os.path.splitext(url)[-1]
printer.printstring("type help for help") f_name = 'img{}'.format(f_ext)
term.waitforinput() with open(f_name, 'wb') as f:
printer.printstring("write a command") f.write(page.content)
term.waitforinput()
imageprinter.print(f_name)
def main():
term.waittostart()
printer.printstring("W E L C O M E !")
printimagefromurl('https://apod.nasa.gov/apod/image/1701/potw1636aN159_HST_2048.jpg')
printer.printstring("---------------")
printer.printstring("POETIC SOFTWARE")
printer.printstring("---------------")
printer.printstring("type help for help")
printer.newline()
result = apirequest.get("introduction", 1)
for line in result:
printer.printstring(line)
printer.newline()
printer.printstring("theses on POETIC SOFTWARE")
result = apirequest.getcategory("thesis")
for i, line in enumerate(result):
printer.printstring(str(i+1)+" "+line)
printer.newline()
printer.printstring("exercises in POETIC SOFTWARE")
result = apirequest.getcategory("exercise")
for i, line in enumerate(result):
printer.printstring(str(i+1)+" "+line)
printer.newline()
printer.printstring("SELECT which one to see, for exercise type: exercise <number> and for thesis type: thesis <number>")
printer.newline()
term.waitforinput()
main()

@ -56,43 +56,34 @@ def _int_low_high(inp_number, out_bytes):
return outp return outp
parser = argparse.ArgumentParser(description='Process some imagefile') def print(filename):
parser.add_argument('--img',dest="img", im = Image.open(filename)
help='pass image to print')
args = parser.parse_args()
filename = args.img
im = Image.open(filename)
basewidth = 350 basewidth = 350
# Initial rotate. mirror, and extract blobs for each 8 or 24-pixel row # Initial rotate. mirror, and extract blobs for each 8 or 24-pixel row
# Convert to black & white via greyscale (so that bits can be inverted) # Convert to black & white via greyscale (so that bits can be inverted)
im = im.transpose(Image.ROTATE_270).transpose(Image.FLIP_LEFT_RIGHT) im = im.transpose(Image.ROTATE_270).transpose(Image.FLIP_LEFT_RIGHT)
height_pixels, width_pixels = im.size height_pixels, width_pixels = im.size
if width_pixels > basewidth: if width_pixels > basewidth:
wpercent = (basewidth/float(im.size[0])) wpercent = (basewidth/float(im.size[0]))
hsize = int((float(im.size[1])*float(wpercent))) hsize = int((float(im.size[1])*float(wpercent)))
im = im.resize((basewidth,hsize), Image.NEAREST) im = im.resize((basewidth,hsize), Image.NEAREST)
height_pixels, width_pixels = im.size height_pixels, width_pixels = im.size
im = im.resize((height_pixels,int(width_pixels*1.5)), Image.ANTIALIAS) im = im.resize((height_pixels,int(width_pixels*1.5)), Image.ANTIALIAS)
im = im.convert("L") # Invert: Only works on 'L' images im = im.convert("L") # Invert: Only works on 'L' images
im = ImageOps.invert(im) # Bits are sent with 0 = white, 1 = black in ESC/POS im = ImageOps.invert(im) # Bits are sent with 0 = white, 1 = black in ESC/POS
im = im.convert("1") # Pure black and white im = im.convert("1") # Pure black and white
line_height = 1 line_height = 1
blobs = _to_column_format (im, line_height * 8); blobs = _to_column_format (im, line_height * 8);
height_pixels, width_pixels = im.size
#generate random Data with open('/dev/tty', 'wb') as fp:
for i in range(COLUMNS):
DATA.append(randint(0,255))
height_pixels, width_pixels = im.size
with open('/dev/usb/lp0', 'wb') as fp:
fp.write(ESC+b"@") fp.write(ESC+b"@")
fp.write(ESC+b"\x7B"+b"\x41") fp.write(ESC+b"\x7B"+b"\x41")
fp.write(ESC + b"3" + six.int2byte(22)); # Adjust line-feed size fp.write(ESC + b"3" + six.int2byte(22)); # Adjust line-feed size

Loading…
Cancel
Save