From 4107b6b3a6080115796640b2911bfb0a102bf7e9 Mon Sep 17 00:00:00 2001 From: Wes Date: Thu, 26 Aug 2021 22:34:38 -0400 Subject: [PATCH] Found more stuff --- spool2PDF/STM/TabelModels.py | 50 ++++++ spool2PDF/STM/spool2PDF.py | 312 +++++++++++++++++++++++++++++++++++ spool2PDF/example_output.pdf | Bin 0 -> 6932 bytes 3 files changed, 362 insertions(+) create mode 100644 spool2PDF/STM/TabelModels.py create mode 100644 spool2PDF/STM/spool2PDF.py create mode 100644 spool2PDF/example_output.pdf diff --git a/spool2PDF/STM/TabelModels.py b/spool2PDF/STM/TabelModels.py new file mode 100644 index 0000000..b97d886 --- /dev/null +++ b/spool2PDF/STM/TabelModels.py @@ -0,0 +1,50 @@ +''' +Created on Sep 4, 2013 + +@author: wray +''' +from com.ibm.as400.access import SpooledFile +from javax.swing.table import AbstractTableModel + +class SpooledFileTableModel(AbstractTableModel): + headers = ['Job Name', 'File', 'User', 'User Data', 'Status', 'Pages', 'Time Stamp'] + cache = [] + + #@Override + def getColumnName(self, i): + return self.headers[i] + + #@Override + def getRowCount(self): + if (self.cache == None): + return 0 + return len(self.cache) + + #@Override + def getColumnCount(self): + return len(self.headers) + + #@Override + def getValueAt(self, rowIndex, columnIndex): + row = self.cache[rowIndex] + return str(row[columnIndex]) + + def loadTable(self, spooledFiles): + if not(spooledFiles == None): + self.cache = [] + for splf in spooledFiles: + record = [] + record.append(splf.getStringAttribute(SpooledFile.ATTR_JOBNAME)) + record.append(splf.getStringAttribute(SpooledFile.ATTR_SPOOLFILE)) + record.append(splf.getStringAttribute(SpooledFile.ATTR_SPLF_CREATOR)) + record.append(splf.getStringAttribute(SpooledFile.ATTR_USERDATA)) + record.append(splf.getStringAttribute(SpooledFile.ATTR_SPLFSTATUS)) + record.append(str(splf.getIntegerAttribute(SpooledFile.ATTR_PAGES))) + #print splf.getCreateDate() + t = splf.getCreateTime() + s = t[:2] + ':' + t[2:-2] + record.append(s) + self.cache.append(record) + + self.fireTableChanged(None) + self.fireTableStructureChanged() \ No newline at end of file diff --git a/spool2PDF/STM/spool2PDF.py b/spool2PDF/STM/spool2PDF.py new file mode 100644 index 0000000..2c9c7c0 --- /dev/null +++ b/spool2PDF/STM/spool2PDF.py @@ -0,0 +1,312 @@ +''' +Created on Sep 4, 2013 + +@author: Wes +''' +from STM.TabelModels import SpooledFileTableModel +from com.ibm.as400.access import AS400, SpooledFileList, SpooledFile, \ + PrintParameterList, PrintObject, OutputQueue +from com.itextpdf.text import Document, PageSize, Paragraph, FontFactory, Chunk, \ + Image +from com.itextpdf.text.pdf import PdfWriter +from java.awt import BorderLayout, GridLayout, Dimension +from java.io import BufferedReader, InputStreamReader, FileOutputStream, \ + ByteArrayInputStream, File +from java.lang import Math, String, Runtime +from javax.imageio import ImageIO +from javax.swing import JFrame, UIManager, JTable, JScrollPane, JPanel, JLabel, \ + JTextField, JComboBox, JButton, JMenuBar, JMenuItem, JMenu, JOptionPane +import java.lang.Exception as JavaException +import os + +outQueues = ['PXP1', 'PXP1P', 'PXP2', 'PXP2P', 'PXP3', 'PXP3P', 'PXP4', 'PXP4P', 'P0', 'P1', 'P2', 'PS', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9', 'CALEB', 'WES', 'VDORMAN'] + +system = None +qtm = None +userMaskInput = None +outQSelector = None +spooledFiles = [] +table = None + + +def getSpooledFileList(system, userMask, outQMask): + spooledFiles = [] + splfList = SpooledFileList(system) + + #Set filters, all users, on all queues + splfList.setUserFilter(userMask) + splfList.setQueueFilter(outQMask) + + #Open list, openAsynchronously() returns immediately + splfList.openAsynchronously() + + #Wait for list to complete + splfList.waitForListToComplete() + + enum = splfList.getObjects() + + #Add spooled file object to a list + while(enum.hasMoreElements()): + splf = enum.nextElement() #splf is a com.ibm.as400.access.SpooledFile object + if not(splf == None): + spooledFiles.append(splf) + #Clean up after we are done with the list + splfList.close() + + return spooledFiles + +def copySpooledFile(event): + splf = spooledFiles[table.getSelectedRow()] + tableInput = [splf] + + title = 'Make a Copy of a Spooled File' + + panel = JPanel(BorderLayout()) + + tempTable = JTable() + tempTable.setModel(SpooledFileTableModel()) + tempPane = JScrollPane(tempTable) + tempTable.setFillsViewportHeight(True) + qtm = tempTable.getModel() + qtm.loadTable(tableInput) + + bottomPanel = JPanel() + bottomPanel.add(JLabel('to output queue: ')) + outQs = JComboBox(outQueues) + inputPanel.add(outQs) + bottomPanel.add(outQs) + + panel.add(JLabel('Copy the following spooled file(s)'), BorderLayout.NORTH) + panel.add(tempPane, BorderLayout.CENTER) + panel.add(bottomPanel, BorderLayout.SOUTH) + + panel.setMaximumSize(Dimension(800, 200)) + + options = ['OK', 'Cancel'] + + option = JOptionPane.showOptionDialog(frame, panel, title, JOptionPane.NO_OPTION, JOptionPane.PLAIN_MESSAGE, None, options, options[0]) + + if(option == 0): + queueFilter = '/QSYS.LIB/%LIBL%.LIB/' + queueFilter += outQueues[outQs.getSelectedIndex()] + queueFilter += '.OUTQ' + splf.copy(OutputQueue(system, queueFilter)) + +def reloadTable(event): + global spooledFiles + queueFilter = '/QSYS.LIB/%LIBL%.LIB/' + queueFilter += outQueues[outQSelector.getSelectedIndex()] + queueFilter += '.OUTQ' + spooledFiles = getSpooledFileList(system, userMaskInput.getText(), queueFilter) + qtm.loadTable(spooledFiles) + +def findLongestLine(inStream): + x = 0 + d = BufferedReader(InputStreamReader(inStream)) + data = d.readLine() + while not(data == None): + x = Math.max(x, len(data)) + data = d.readLine() + inStream.selectPage(1) + return x + +def exportAsPDF(event): + errors = [] + for i in table.getSelectedRows(): + try: + splf = spooledFiles[i] + doc = Document(PageSize.LETTER, 0.0, 0.0, 0.0, 0.0) + PdfWriter.getInstance(doc, FileOutputStream(checkFileName(splf.getStringAttribute(SpooledFile.ATTR_USERDATA) + '.pdf'))) + doc.open() + width = doc.getPageSize().getWidth() + height = doc.getPageSize().getHeight() + + printParms = PrintParameterList() + #printParms.setParameter(PrintObject.ATTR_WORKSTATION_CUST_OBJECT, "/QSYS.LIB/QCTXPDF2.WSCST") + printParms.setParameter(PrintObject.ATTR_WORKSTATION_CUST_OBJECT, "/QSYS.LIB/QWPGIF.WSCST") + printParms.setParameter(PrintObject.ATTR_MFGTYPE, "*WSCST") + inStream = splf.getPageInputStream(printParms) + + derp = [] + j = 1 + while not(j > inStream.getNumberOfPages()): + while(inStream.available() > 0): + derp.append(inStream.read()) + + #image = ImageIO.read(ByteArrayInputStream(derp)) + image = Image.getInstance(derp) + + image.setAbsolutePosition(0.0, 0.0) + image.scaleToFit(width, height) + doc.add(image) + + doc.newPage() + inStream.nextPage() + j += 1 + print j + + doc.close() + + #ImageIO.write(image, 'GIF', File('out.gif')) + except JavaException: + pass + +def exportAsPDFWithText(event): + errors = [] + for j in table.getSelectedRows(): + try: + splf = spooledFiles[j] + + printParms = PrintParameterList() + #printParms.setParameter(PrintObject.ATTR_WORKSTATION_CUST_OBJECT, "/QSYS.LIB/QCTXPDF2.WSCST") + printParms.setParameter(PrintObject.ATTR_WORKSTATION_CUST_OBJECT, "/QSYS.LIB/QWPDEFAULT.WSCST") + printParms.setParameter(PrintObject.ATTR_MFGTYPE, "*WSCST") + + inStream = splf.getPageInputStream(printParms) + + lineLen = findLongestLine(inStream) + print lineLen + + d = BufferedReader(InputStreamReader(inStream)) + i = 1 + adjustLeading = False + + if(lineLen > 180): + doc = Document(PageSize.LETTER.rotate(), 4.0, 4.0, 4.0, 0.0) + fontSize = 6.5 + scaling = 1.0 + leading = 0.8 + adjustLeading = True + elif(lineLen > 170): + doc = Document(PageSize.LETTER.rotate(), 4.0, 4.0, 4.0, 0.0) + fontSize = 7.1 + scaling = 1 + leading = 1.0 + adjustLeading = True + elif(lineLen > 150): + doc = Document(PageSize.LETTER.rotate(), 4.0, 4.0, 4.0, 0.0) + fontSize = 8 + scaling = 1.0 + leading = 1.1625 + adjustLeading = True + elif(lineLen > 120): + doc = Document(PageSize.LETTER.rotate(), 4.0, 4.0, 4.0, 0.0) + fontSize = 9.5 + scaling = 1.03 + leading = 1.0 + adjustLeading = True + elif(lineLen > 110): + doc = Document(PageSize.LETTER.rotate(), 4.0, 4.0, 4.0, 0.0) + fontSize = 8.5 + scaling = 1.25 + leading = .8 + adjustLeading = True + elif(lineLen > 92): + doc = Document(PageSize.LETTER, 4.0, 4.0, 4.0, 0.0) + fontSize = 8.0 + scaling = 1.2 + elif(lineLen > 80): + doc = Document(PageSize.LETTER, 4.0, 4.0, 4.0, 0.0) + fontSize = 7.0 + scaling = 1.5 + elif(lineLen > 70): + doc = Document(PageSize.LETTER, 4.0, 4.0, 4.0, 0.0) + fontSize = 7.9 + scaling = 1.5 + else: + doc = Document(PageSize.LETTER, 4.0, 4.0, 4.0, 0.0) + fontSize = 8.45 + scaling = 1.475 + + filename = checkFileName(splf.getStringAttribute(SpooledFile.ATTR_USERDATA) + '.pdf') + PdfWriter.getInstance(doc, FileOutputStream(filename)) + doc.open() + + courierFont = FontFactory.getFont(FontFactory.COURIER, fontSize) + + while not(i > inStream.getNumberOfPages()): + para = Paragraph('', courierFont) + if(adjustLeading): + para.setLeading(0.0, leading) + data = d.readLine() + + while not (data == None): + c = Chunk(data) + c.setHorizontalScaling(scaling) + para.add(c) + para.add(Chunk.NEWLINE) + data = d.readLine() + + doc.add(para) + doc.newPage() + inStream.nextPage() + i += 1 + + d.close() + doc.close() + except JavaException: + errors.append(splf.getStringAttribute(SpooledFile.ATTR_USERDATA)) + if(len(errors) > 0): + JOptionPane.showMessageDialog(frame, 'An error occurred while processing the following spooled files:\n\r' + str(errors) + '\n\rThey probably have bar codes on them and I havn\'t figured that out yet.', "An Error Has Occurred!", JOptionPane.ERROR_MESSAGE) + if(len(table.getSelectedRows()) == 1): + openPDF(filename) + + +def checkFileName(name): + if(os.path.exists(name)): + s = name.split('.')[0] + return checkFileName(s + '_' + '.pdf') + else: + return name + +def openPDF(inFile): + javaexec = getattr(Runtime.getRuntime(), "exec") + javaexec("cmd.exe /c start " + inFile) + + +if __name__ == '__main__': + system = AS400('SUNBURY', 'WRAY', 'wesman88') + + frame = JFrame('Spoolinator') + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) + frame.setSize(800, 600) + frame.setLayout(BorderLayout()) + + #initialize table and scroll pane + table = JTable() + table.setModel(SpooledFileTableModel()) + scrollPane = JScrollPane(table) + table.setFillsViewportHeight(True) + qtm = table.getModel() + + inputPanel = JPanel() + inputPanel.add(JLabel('User')) + userMaskInput = JTextField('*ALL', 10) + inputPanel.add(userMaskInput) + inputPanel.add(JLabel('Out Queue')) + outQSelector = JComboBox(outQueues) + inputPanel.add(outQSelector) + loadButton = JButton('Load', actionPerformed=reloadTable) + inputPanel.add(loadButton) + + menuBar = JMenuBar() + tools = JMenu('Tools') + copy = JMenuItem('Copy Spool File', actionPerformed=copySpooledFile) + tools.add(copy) + menuBar.add(tools) + + topPanel = JPanel(GridLayout(3,1)) + topPanel.add(menuBar) + topPanel.add(inputPanel) + l = JLabel('Hint: Hold down CTRL to select more than one spooled file.') + l.setHorizontalAlignment(JLabel.CENTER) + topPanel.add(l) + + frame.add(topPanel, BorderLayout.NORTH) + frame.add(scrollPane, BorderLayout.CENTER) + #frame.add(JButton('Export', actionPerformed=exportAsPDF), BorderLayout.SOUTH) + frame.add(JButton('Export', actionPerformed=exportAsPDFWithText), BorderLayout.SOUTH) + frame.pack() + frame.setLocationRelativeTo(None) + frame.setVisible(True) \ No newline at end of file diff --git a/spool2PDF/example_output.pdf b/spool2PDF/example_output.pdf new file mode 100644 index 0000000000000000000000000000000000000000..29140e614dee03cc6196a7ed258e847ffa8348a4 GIT binary patch literal 6932 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 hm