浏览代码

Kleine Anpassungen

- VS-Code Settings
- pdf_merge für Gesamt-Berichte
- pdf_watermark für Rechnungen
- utf-8-Problem bei c11-Reports
Global Cube 2 年之前
父节点
当前提交
3032b2e90f

+ 17 - 3
.vscode/settings.json

@@ -18,11 +18,25 @@
                 "encrypt": true
             },
             "previewLimit": 50,
-            "server": "192.168.2.60\\GLOBALCUBE",
+            "server": "localhost",
             "port": 1433,
             "driver": "MSSQL",
-            "name": "sievers-group",
-            "connectString": "sievers-group\\GLOBALCUBE",
+            "name": "localhost\\GLOBALCUBE",
+            "database": "LOCOSOFT",
+            "username": "sa",
+            "password": "Mffu3011#"
+        },
+        {
+            "mssqlOptions": {
+                "appName": "SQLTools",
+                "useUTC": true,
+                "encrypt": true
+            },
+            "previewLimit": 50,
+            "server": "sievers-group",
+            "port": 1433,
+            "driver": "MSSQL",
+            "name": "sievers-group\\GLOBALCUBE",
             "database": "GC",
             "username": "sa",
             "password": "Mffu3011#"

+ 28 - 16
tools/cognos11/c11_admin.py

@@ -1,9 +1,9 @@
 import base64
 import os
-import time
+# import time
 import requests
 from requests_toolbelt.multipart import decoder
-import pandas as pd
+# import pandas as pd
 import jinja2
 import json
 import re
@@ -12,9 +12,9 @@ from bs4 import BeautifulSoup
 
 class ca_webscraper:
     webservice = "http://localhost:9300/bi/"
-    templates_dir = "C:/Projekte/Python/cognos11/templates"
-    export_dir = "C:/Projekte/Python/export"
-    log_dir = "C:/Projekte/Python/logs"
+    templates_dir = "C:/GlobalCube/Tasks/gctools/templates"
+    export_dir = "C:/GlobalCube/ReportOutput"
+    log_dir = "C:/GlobalCube/Tasks/gctools/logs"
     credentials = '{"parameters":[{"name":"CAMNamespace","value":"CognosEx"},{"name":"h_CAM_action","value":"logonAs"},{"name":"CAMUsername","value":"Global1"},{"name":"CAMPassword","value":"Cognos#11"}]}'
     headers = {}
     caf = ""
@@ -55,7 +55,15 @@ class ca_webscraper:
     def report_list(self):
         # "v1/objects/_dot_public_folders/items"
         filter = "type|analysis|interactiveReport|powerPlayReport|powerPlay8Report|powerPlay8ReportView|query|report|reportTemplate"
-        res = self.session.get(self.webservice + "v1/search/cm?fields=defaultName|id|ancestors&results=1000&query=.&hide_internal=all&filter=" + filter, headers=self.headers)
+        res = self.session.get(
+            self.webservice + "v1/search/cm?fields=defaultName|id|ancestors&results=1000&query=.&hide_internal=all&filter=" + filter,
+            headers=self.headers
+        )
+        # print(res.content)
+        filename = self.log_dir + '/reports_error.log'
+        os.makedirs(os.path.dirname(filename), exist_ok=True)
+        with open(filename, "wb") as f:
+            f.write(res.content)
         self.reports = res.json()['results']
         for r in self.reports:
             r['path'] = "/".join([a['defaultName'].replace('/', '_') for a in r['ancestors']])
@@ -82,15 +90,15 @@ class ca_webscraper:
 
     def export(self, report, format='XML'):
         headers = {
-            'Content-Type': 'text/xml; charset=UTF-8', 
+            'Content-Type': 'text/xml; charset=UTF-8',
             'X-XSRF-TOKEN': self.headers['X-XSRF-TOKEN'],
             'X-RsCMStoreID': report['id'],
             'X-UseRsConsumerMode': 'true',
             'SOAPAction': 'http://www.ibm.com/xmlns/prod/cognos/reportService/202004/'
         }
         soap = self.template.render({"caf": self.caf, "cam": self.cam,
-                                "report": report, "format": 'XHTML',
-                                "prompt": 'true', "tracking": "", "params": {}})
+                                     "report": report, "format": 'XHTML',
+                                     "prompt": 'true', "tracking": "", "params": {}})
 
         r = self.session.post(self.webservice + 'v1/reports', data=soap, headers=headers)
         parts = decoder.MultipartDecoder.from_response(r).parts
@@ -118,10 +126,10 @@ class ca_webscraper:
         filename = self.log_dir + f"/config/{report['name']}.json"
         os.makedirs(os.path.dirname(filename), exist_ok=True)
         json.dump(meta, open(filename, 'w'), indent=2)
-        
+
         if format == 'PDF':
             return self.export_pdf(report, meta)
-        
+
         payload = json.dumps({'reportspec_stubbed': parts[2].text, 'storeid': report['id']})
         token = re.findall(r'<bus:authenticityToken xsi:type="xs:base64Binary">(.*)</bus:authenticityToken>', parts[0].text)[0]
         headers = {
@@ -148,19 +156,23 @@ class ca_webscraper:
 
     def export_pdf(self, report, meta):
         headers = {
-            'Content-Type': 'text/xml; charset=UTF-8', 
+            'Content-Type': 'text/xml; charset=UTF-8',
             'X-XSRF-TOKEN': self.headers['X-XSRF-TOKEN'],
             'X-RsCMStoreID': report['id'],
             'X-UseRsConsumerMode': 'true',
             'SOAPAction': 'http://www.ibm.com/xmlns/prod/cognos/reportService/202004/'
         }
-        
+
         if len(report['params']) == 0:
             params = {}
             filename = report['filename']
             self.request_file(report, headers, params, filename)
             return True
         if len(report['params']) == 1:
+            params = {}
+            filename = report['filename'].format('0')
+            self.request_file(report, headers, params, filename)
+
             key1 = report['params'][0]
             for k1, v1 in meta['optional'][key1].items():
                 filename = report['filename'].format(v1)
@@ -174,12 +186,12 @@ class ca_webscraper:
                     filename = report['filename'].format(v1, v2)
                     params = {key1: {k1: v1}, key2: {k2: v2}}
                     self.request_file(report, headers, params, filename)
-            return True            
+            return True
 
     def request_file(self, report, headers, params, filename):
         soap = self.template.render({"caf": self.caf, "cam": self.cam,
                                      "report": report, "format": 'PDF',
-                                     "prompt": 'false', "tracking": "", "params": params})
+                                     "prompt": 'false', "tracking": "", "params": params}).encode("utf-8")
         try:
             r = self.session.post(self.webservice + 'v1/reports', data=soap, headers=headers)
         except UnicodeEncodeError:
@@ -222,4 +234,4 @@ if __name__ == '__main__':
     caws = ca_webscraper()
     caws.login()
     caws.report_list()
-    caws.export_folder('Team Content/Export/Test')
+    caws.export_folder('Team Content/ReportOutput')

+ 8 - 3
tools/database/cet.py

@@ -29,6 +29,7 @@ def convert_data(element):
     txt = txt.replace('None', '')
     txt = txt.replace('False', '0').replace('True', '1')
     txt = txt.replace('\t', '').replace('\r', '').replace('\n', '')
+    txt = txt.replace('\x81', '').replace('\x90', '')
     return txt
 
 
@@ -41,12 +42,16 @@ def queryout(dsn, query, csv_file, codepage, errorlog):
         conn = pyodbc.connect(dsn)
         cursor = conn.cursor()
         cursor.execute(query)
-        with open(csv_file, 'w', encoding=codepage) as fwh:
-            while row := cursor.fetchone():
-                fwh.write('\t'.join(map(convert_data, row)) + '\n')
     except pyodbc.InterfaceError as e:
         print(e.args[1])
 
+    with open(csv_file, 'w', encoding=codepage) as fwh:
+        while row := cursor.fetchone():
+            try:
+                fwh.write(('\t'.join(map(convert_data, row)) + '\n'))
+            except pyodbc.DataError as e:
+                print(e.args[1])
+
 
 if __name__ == '__main__':
     plac.call(run)

+ 10 - 3
tools/database/cet.spec

@@ -1,14 +1,16 @@
 # -*- mode: python ; coding: utf-8 -*-
 
+
 block_cipher = None
 
 
 a = Analysis(['cet.py'],
-             pathex=['C:\\Projekte\\Python\\dbtools'],
+             pathex=[],
              binaries=[],
              datas=[],
              hiddenimports=[],
              hookspath=[],
+             hooksconfig={},
              runtime_hooks=[],
              excludes=[],
              win_no_prefer_redirects=False,
@@ -17,11 +19,12 @@ a = Analysis(['cet.py'],
              noarchive=False)
 pyz = PYZ(a.pure, a.zipped_data,
              cipher=block_cipher)
+
 exe = EXE(pyz,
           a.scripts,
           a.binaries,
           a.zipfiles,
-          a.datas,
+          a.datas,  
           [],
           name='cet',
           debug=False,
@@ -30,4 +33,8 @@ exe = EXE(pyz,
           upx=True,
           upx_exclude=[],
           runtime_tmpdir=None,
-          console=True )
+          console=True,
+          disable_windowed_traceback=False,
+          target_arch=None,
+          codesign_identity=None,
+          entitlements_file=None )

二进制
tools/database/dist/cet.exe


文件差异内容过多而无法显示
+ 28 - 0
tools/pdf/data/Briefbogen_GC_Jahnstr_GmbH.pdf


二进制
tools/pdf/data/Rechnung Miete_Ulmen.pdf


文件差异内容过多而无法显示
+ 943 - 0
tools/pdf/data/example-gc.pdf


+ 20 - 0
tools/pdf/pdf_merge.py

@@ -0,0 +1,20 @@
+from PyPDF2 import PdfMerger
+from pathlib import Path
+
+
+def main(base_dir: str, report_name):
+    target = f"{base_dir}/{report_name}_gesamt.pdf"
+    Path(target).unlink()
+    pdfs = [f for f in Path(base_dir).glob(report_name + '_*.pdf')]
+
+    merger = PdfMerger()
+
+    for pdf in pdfs:
+        merger.append(pdf)
+
+    merger.write(target)
+    merger.close()
+
+
+if __name__ == '__main__':
+    main('C:\\GlobalCube\\ReportOutput', 'Z.07 Einzelbetrachtung_lfd_Monat')

+ 35 - 0
tools/pdf/pdf_watermark.py

@@ -0,0 +1,35 @@
+import PyPDF2
+import os
+
+
+base_dir = os.path.dirname(__file__)
+input_file = base_dir + "/data/Rechnung Miete_Ulmen.pdf"
+output_file = base_dir + "/data/example-gc.pdf"
+watermark_file = base_dir + "/data/Briefbogen_GC_Jahnstr_GmbH.pdf"
+
+with open(input_file, "rb") as filehandle_input:
+    # read content of the original file
+    pdf = PyPDF2.PdfFileReader(filehandle_input)
+
+    with open(watermark_file, "rb") as filehandle_watermark:
+        # read content of the watermark
+        watermark = PyPDF2.PdfFileReader(filehandle_watermark)
+
+        # get first page of the original PDF
+        first_page = pdf.getPage(0)
+
+        # get first page of the watermark PDF
+        first_page_watermark = watermark.getPage(0)
+
+        # merge the two pages
+        first_page.mergePage(first_page_watermark)
+
+        # create a pdf writer object for the output file
+        pdf_writer = PyPDF2.PdfFileWriter()
+
+        # add page
+        pdf_writer.addPage(first_page)
+
+        with open(output_file, "wb") as filehandle_output:
+            # write the watermarked file to the new file
+            pdf_writer.write(filehandle_output)

部分文件因为文件数量过多而无法显示