2017-05-24 19 views
0

pythonでreportlabを始め、私の小さな医療用アプリケーションの最終ステップ。reportlab vertical codebar code39

私はそれのために設計されたフレーム(サイドの細いフレーム)で縦のバーコードを設定するための実用的な解決策を見つけることができません。他のすべてはokです(ドキュメントは5つのフレーム、テーブル、その他のバーコードで構成されています)。 フレームが役に立たないかもしれませんが、どうすればいいですか?

アイデア?おかげさまで

これは私のひどいコードです。申し訳ありませんが、私はそれを勉強しています。

#!/usr/bin/python 
# coding: utf-8 

from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Frame, PageTemplate, BaseDocTemplate, FrameBreak, Table, TableStyle, KeepInFrame 
from reportlab.graphics.barcode import code39 
from reportlab.pdfgen import canvas 
from reportlab.platypus.flowables import Flowable 
from reportlab.lib.pagesizes import A4 
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle 
from reportlab.rl_config import defaultPageSize 
from reportlab.lib.units import cm 
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT 
from reportlab.lib.colors import black, purple, white, yellow, blue, darkblue 

class verticalText(Flowable): 
    ''' Rotate a text in a tabe cell ''' 
    def __init__(self, text): 
     Flowable.__init__(self) 
     self.text = text 

    def draw(self): 
     canvas = self.canv 
     canvas.rotate(90) 
     #fs = canvas._fontsize 
     #canvas.translate(1, -fs/1.2) 
     canvas.drawString(0, -1, self.text) 

    #def wrap(self, aW, aH): 
     #canv = self.canv 
     #fn, fs = canv._fontname, canv._fontsize 
     #return canv._leading, 1 + canv.stringWidth(self.text, fn ,fs) 

class pdf(): 
    def __init__(self, _filename, _lignes_redigees): 

     #VERROUS 
     self.verBIZONE = False 

     #PREPARATION DES DONNES TRANSMISES 
     self.lignes_redigees = _lignes_redigees 

     rpps = "10100167890" 
     noordo = "20170524130651" 

     #code barres rpps 
     self.rpps_barcode = code39.Extended39(rpps) 
     #code barre ordo 
     self.noordo_barcode = code39.Extended39(noordo+rpps) 


     vdoc = [['TITRE PRENOM NOM'], 
       ['DATADATADATADATADATADATADATADATA'], 
       ['DATADATADATADATADATADATADATADATA'], 
       ['DATADATADATADATADATADATADATADATADATADATADATADATA'], 
       [self.rpps_barcode], 
       ['DATADATADATADATADATADATADATADATA']] 

     vpat = [["TITRE PRENOM NOM"], ["DATADATADATADATADATADATADATADATA"], ["DATADATADATADATA"]] 

     self.data_datelieu = "Toulouse, le 22 mai 2017" 
     self.__preparation_des_data_lignes_redigees() 

     # PDF Properties 
     self.Title = "Ordonnance" 
     self.Author = "DATADATADATADATA" 
     self.PageInfo = "-" 
     p_h = 29.7 #page height 
     p_w = 21 #page width 
     h_m = 1 #marges hauteur 
     w_m = 1 #marges largeur 
     entetes_h = 5.3 
     datelieu_h = 1 

     #coo frame Side 
     side_x1 = w_m; side_y1 = h_m; side_h = p_h - 2*h_m ; side_w = 1 
     #coo frame doc 
     doc_x1 = side_x1 + side_w ; doc_y1 = p_h - h_m - entetes_h ; doc_w = (p_w - 2*w_m - side_w)/2 ; doc_h = entetes_h 
     #coo frame pat 
     pat_x1 = side_x1 + side_w + doc_w ; pat_y1 = p_h - h_m - entetes_h ; pat_w = doc_w ; pat_h = doc_h 
     #coo frame date lieu 
     dl_x1 = side_w + w_m ; dl_y1 = p_h - h_m - entetes_h - datelieu_h ; dl_w = p_w - 2*w_m - side_w; dl_h = datelieu_h 
     #coo frame pres 
     pr_x1 = side_w + w_m ; pr_y1 = h_m ; pr_w = dl_w; pr_h = p_h - 2*h_m - entetes_h - datelieu_h 
     self.pres_w = pr_w 

     # define frames - for frames in page 
     self.frSide = Frame(x1=side_x1*cm, y1=side_y1*cm, width=side_w*cm, height=side_h*cm, 
          leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0) 
     self.frMedecin = Frame(x1=doc_x1*cm, y1=doc_y1*cm, width=doc_w*cm, height=doc_h*cm, showBoundary=1, 
          leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0) 
     self.frPatient = Frame(x1=pat_x1*cm, y1=pat_y1*cm, width=pat_w*cm, height=pat_h*cm, 
          leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0) 
     self.frDateLieu = Frame(x1=dl_x1*cm, y1=dl_y1*cm, width=dl_w*cm, height=dl_h*cm, 
          leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0) 
     self.frPres = Frame(x1=pr_x1*cm, y1=pr_y1*cm, width=pr_w*cm, height=pr_h*cm, 
          leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0) 

     # define pageTemplates - for page in document 
     self.mainPage = PageTemplate(pagesize=A4, frames=[self.frSide, self.frMedecin, self.frPatient, self.frDateLieu, 
                  self.frPres]) 

     # define BasicDocTemplate - for document 
     self.doc = BaseDocTemplate(_filename, pagesize=A4, pageTemplates=self.mainPage, title=self.Title, 
            author=self.Author, showBoundary=0) 

     # styles 
     self.styles = self.__init_stylesheet() 
     self.standard_styles = getSampleStyleSheet() 
     self.stylePat = self.standard_styles['Normal'] 
     # i don't use it, not more than paragraphs 
     self.styleDoc = ParagraphStyle('hdoc') 
     self.styleDoc.defaults['borderColor'] = '#000000' 
     self.styleDoc.defaults['borderWidth'] = '1' 

     self.styleDL = self.styles['hdatelieu'] 

     #create tables 
     self.doc_table = Table(vdoc, colWidths=doc_w*cm) 
     self.doc_table.setStyle(TableStyle([('ALIGN', (0,0), (-1,-1), 'CENTER'), 
             ('TEXTCOLOR', (0,0), (-1,-1), darkblue), 
             ('FONT', (0,0), (0,0),'Times-Bold', 15), 
             ('FONT', (0,1), (-1,-1), 'Times-Roman', 13)])) 
     self.pat_table = Table(vpat, colWidths=pat_w*cm, vAlign='TOP') 
     self.pat_table.setStyle(TableStyle([('ALIGN', (0,0), (-1,-1), 'CENTER'), 
             ('TEXTCOLOR', (0,0), (-1,-1), black), 
             ('FONT', (0,1), (-1,-1), 'Courier-Bold', 11), 
             ('FONT', (0,0), (0,0), 'Courier-Bold', 13)])) 

     #preparing prescription tables 
     self.__prepare_les_séparateurs_ald() 
     self.__preparation_des_tables_de_ligne() 

     #process 
     self._process()  

    def __init_stylesheet(self): #i don't use it, not more than paragraphs, it was for studying 
     styles= {'default': ParagraphStyle('default', 
              fontName='Times-Roman', 
              fontSize=10, 
              leading=12, 
              leftIndent=0, 
              rightIndent=0, 
              firstLineIndent=0, 
              alignment=TA_LEFT, 
              spaceBefore=0, 
              spaceAfter=0, 
              bulletFontName='Times-Roman', 
              bulletFontSize=10, 
              bulletIndent=0, 
              textColor= black, 
              backColor=None, 
              wordWrap=None, 
              borderWidth= 0, 
              borderPadding= 0, 
              borderColor= None, 
              borderRadius= None, 
              allowWidows= 1, 
              allowOrphans= 0, 
              textTransform=None, # 'uppercase' | 'lowercase' | None 
              endDots=None,   
              splitLongWords=1, 
             )} 

     styles['hdoc'] = ParagraphStyle('hdoc', parent=styles['default'], 
      fontName='Helvetica-Bold', 
      fontSize=12, 
      leading = 17, 
      borderColor=black, 
      borderWidth=1, 
      borderPadding = 0.5*cm, 
      alignment=TA_CENTER, 
      wordWrap = 'LTR', 
      textColor=darkblue) 

     styles['hpat'] = ParagraphStyle('hpat', parent=styles['default'], 
      fontName='Helvetica', 
      fontSize=12, 
      alignment=TA_CENTER, 
      textColor=black) 

     styles['hdatelieu'] = ParagraphStyle('hdatelieu', parent=styles['default'], 
      fontName='Helvetica', 
      fontSize=12, 
      alignment=TA_RIGHT, 
      borderColor=black, 
      borderWidth=1,    
      borderPadding = 0, 
      textColor=black)   

     return styles 


    def __prepare_les_séparateurs_ald(self): 

     p_ald = [["Prescription(s) relative(s) au traitement de l'affection de longue durée reconnue, (liste ou hors liste)"], 
       ["(AFFECTION EXONERANTE)"]] 
     p_nald = [["Prescription(s) SANS RAPPORT avec l'affection de longue durée"], 
        ["(MALADIES INTERRECURRENTES)"]] 

     self.t_ald = Table(p_ald, colWidths=self.pres_w*cm) 
     self.t_ald.setStyle(TableStyle([('ALIGN', (0,0), (-1,-1), 'CENTER'), 
            ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), 
            ('TEXTCOLOR', (0,0), (-1,-1), black), 
            ('FONT', (0,0), (-1,-1),'Helvetica', 11), 
            ('LINEABOVE', (0,0), (0,0), 1, black), 
            ('LINEBELOW', (-1,-1), (-1,-1), 1, black)])) 

     self.t_nald = Table(p_nald, colWidths=self.pres_w*cm) 
     self.t_nald.setStyle(TableStyle([('ALIGN', (0,0), (-1,-1), 'CENTER'), 
            ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), 
            ('TEXTCOLOR', (0,0), (-1,-1), black), 
            ('FONT', (0,0), (-1,-1),'Helvetica', 11), 
            ('LINEABOVE', (0,0), (0,0), 1, black), 
            ('LINEBELOW', (-1,-1), (-1,-1), 1, black)])) 

    def __preparation_des_data_lignes_redigees(self): 
     #prepare data for platypus tables 
     self.data_lignes_redigees = [] 

     #first look for ALD prescription 
     for ligne in self.lignes_redigees: 
      if ligne[-1] == 'A.L.D.': 
       self.verBIZONE = True 


     if self.verBIZONE == False : 
      x = 0 
      for ligne in self.lignes_redigees: 
       x +=1 
       bloc_data=[] 
       i=0 
       for item in ligne: 
        i += 1 
        if i == 1 : j = str(x)+'.' 
        else : j = "" 
        bloc_data.append([j,item]) 
       self.data_lignes_redigees.append(bloc_data) 
       print('blocdata', self.data_lignes_redigees) 

     else: 
      self.data_lignes_redigees_ald = [] 
      self.data_lignes_redigees_nald = [] 

      x = 0 
      for ligne in self.lignes_redigees: 
       if ligne[-1] == 'A.L.D.': 
        x +=1 
        bloc_data=[] 
        i=0 
        for item in ligne: 
         i += 1 
         if i == 1 : j = str(x)+'.' 
         else : j = "" 
         if item != 'A.L.D.': bloc_data.append([j,item]) 
        self.data_lignes_redigees_ald.append(bloc_data) 
        print('blocdata_ald', self.data_lignes_redigees_ald) 

      for ligne in self.lignes_redigees: 
       if ligne[-1] != 'A.L.D.': 
        x +=1 
        bloc_data=[] 
        i=0 
        for item in ligne: 
         i += 1 
         if i == 1 : j = str(x)+'.' 
         else : j = "" 
         bloc_data.append([j,item]) 
        self.data_lignes_redigees_nald.append(bloc_data) 
        print('blocdata_ald', self.data_lignes_redigees_nald) 


    def __preparation_des_tables_de_ligne(self):    
     #prepare les tables 

     self.story_tables_pres = [] 
     self.story_tables_pres_ald = [] 

     if self.verBIZONE == False: 
      for data_ligne in self.data_lignes_redigees: 
       tablep = Table(data_ligne, 
           colWidths=(1*cm, self.pres_w*cm - 1*cm), 
           rowHeights = [1*cm] + [0.5*cm]*(len(data_ligne)-1)) 

       tablep.setStyle(TableStyle([('ALIGN', (0,0), (-1,-1), 'LEFT'), 
              ('ALIGN', (0,0), (0,-1), 'RIGHT'), 
              ('TEXTCOLOR', (0,0), (-1,-1), black), 
              ('FONT', (0,0), (-1,0),'Helvetica-Bold', 12), 
              ('FONT', (0,1), (-1,-1), 'Helvetica', 11)])) 

       self.story_tables_pres.append(tablep) 

     if self.verBIZONE == True: 
      for data_ligne in self.data_lignes_redigees_ald: 
       tablep = Table(data_ligne, 
           colWidths=(1*cm, self.pres_w*cm - 1*cm), 
           rowHeights = [1*cm] + [0.5*cm]*(len(data_ligne)-1)) 

       tablep.setStyle(TableStyle([('ALIGN', (0,0), (-1,-1), 'LEFT'), 
              ('ALIGN', (0,0), (0,-1), 'RIGHT'), 
              ('TEXTCOLOR', (0,0), (-1,-1), black), 
              ('FONT', (0,0), (-1,0),'Helvetica-Bold', 12), 
              ('FONT', (0,1), (-1,-1), 'Helvetica', 11)])) 

       self.story_tables_pres_ald.append(tablep) 

      for data_ligne in self.data_lignes_redigees_nald: 
       tablep = Table(data_ligne, 
           colWidths=(1*cm, self.pres_w*cm - 1*cm), 
           rowHeights = [1*cm] + [0.5*cm]*(len(data_ligne)-1)) 

       tablep.setStyle(TableStyle([('ALIGN', (0,0), (-1,-1), 'LEFT'), 
              ('ALIGN', (0,0), (0,-1), 'RIGHT'), 
              ('TEXTCOLOR', (0,0), (-1,-1), black), 
              ('FONT', (0,0), (-1,0),'Helvetica-Bold', 12), 
              ('FONT', (0,1), (-1,-1), 'Helvetica', 11)])) 

       self.story_tables_pres.append(tablep) 




    def _process(self): 

     #Story 
     self.story = [] 
     #self.story.append(verticalText(self.noordo_barcode)) 
     self.story.append(FrameBreak()) 


     self.kept_doc_st = [] 
     self.kept_doc_st.append(self.doc_table) 
     kept_doc = KeepInFrame(0,0 ,self.kept_doc_st, mode='shrink', hAlign='CENTER', vAlign='MIDDLE', fakeWidth=False) 

     self.story.append(kept_doc) 
     self.story.append(FrameBreak()) 

     self.kept_pat_st = [] 
     self.kept_pat_st.append(self.pat_table) 
     kept_pat = KeepInFrame(0,0 ,self.kept_pat_st, mode='shrink', hAlign='CENTER', vAlign='MIDDLE', fakeWidth=False) 

     self.story.append(kept_pat) 
     self.story.append(FrameBreak()) 

     hd = Table([[self.data_datelieu]], colWidths=self.pres_w*cm, rowHeights=1*cm) 
     hd.setStyle(TableStyle([('ALIGN', (0,0), (-1,-1), 'RIGHT'), 
           ('TEXTCOLOR', (0,0), (-1,-1), black), 
           ('FONT', (0,0), (-1,-1), 'Courier-Bold', 11), 
           ('VALIGN', (0,0), (-1,-1), 'MIDDLE')])) 
     self.story.append(hd) 
     self.story.append(FrameBreak()) 


     #mise en place du bloc de prescription 
     if self.verBIZONE == False: 
      for e in self.story_tables_pres: 
       self.story.append(e) 
     if self.verBIZONE == True: 
      self.story.append(self.t_ald) 
      for e in self.story_tables_pres_ald: 
       self.story.append(e) 
      self.story.append(self.t_nald) 
      for e in self.story_tables_pres: 
       self.story.append(e)    


     #finallement 
     self.doc.build(self.story) 


if __name__ == '__main__': 

    lignes=[['(cétirizine), 10 mg, cp', 'Prendre 1 cp le matin', 'A.L.D.'], 
      ['DEROXAT (paroxétine), 20 mg, cp', 'Si besoin prendre 1 cp le matin', 'si envie', 'A.L.D.']] 


    app = pdf('test.pdf', lignes) 
+0

[so]へようこそ!このサイトでは、自分でコードを書くことができます**。 ** [もっと研究をして](// meta.stackoverflow.com/questions/261592)**あなたが問題を抱えていると、あなたが試みたものを投稿することができます** (** stackoverflow.com/help/mcve)を提供しています。私は良い質問と[完璧な質問]を読むことをお勧めします(http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/)。また、[ツアー]を取って** [this](// meta.stackoverflow.com/questions/347937/)**を必ず読んでください。 – Badacadabra

答えて