Search code examples
pythontext-filespywin32system.printing

hide header and footer on text files when direct print using win32 and python


I am stuck here when printing directly to text files using this code

win32api.ShellExecute (0, "print", "datafile.txt", None, ".", 0)

it always print the header "datafile.txt" and footer "Page1". I want to hide or remove this when printing on continous form paper. I do not want to install another third party software. Please help me. Thanks.


Solution

  • I'm sure you're just a simple search away from finding a module that will handle this problem much better than this hack (e.g. use Reportlab and ShellExecute the PDF). Also, the default application for printing text files on Windows is Notepad. If you wish to configure the header/footer setting permanently, just change it in File->Page Setup.

    If you wish to change Notepad's settings in your program, you can use the winreg module (_winreg in Python 2). However, there's a timing issue since ShellExecute doesn't wait for the job to be queued. Before restoring the old setting, you can either sleep for a little while or just wait for user input to continue. Here's a quick function that demonstrates the process:

    try:
        import winreg
    except:
        import _winreg as winreg
    import win32api
    
    def notepad_print(textfile, newset=None):
        if newset is not None: 
            oldset = {}
            hkcu = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
            notepad = winreg.OpenKey(hkcu, r'Software\Microsoft\Notepad', 0, 
                                     winreg.KEY_ALL_ACCESS)
            for key, item in newset.items():
                oldset[key] = winreg.QueryValueEx(notepad, key)
                winreg.SetValueEx(notepad, key, None, item[1], item[0])
    
        #force printing with notepad, instead of using the 'print' verb
        win32api.ShellExecute(0, 'open', 'notepad.exe', '/p ' + textfile, '.', 0)
    
        input('once the job is queued, hit <enter> to continue')
    
        if newset is not None:
            for key, item in oldset.items():
                winreg.SetValueEx(notepad, key, None, item[1], item[0])
    

    You can temporarily delete the header/footer settings with the following call:

    notepad_print('datafile.txt', {'szHeader' : ('', 1), 'szTrailer': ('', 1)})
    

    You can change as many of its registry settings as you want:

    newset = {
      #name : (value, type)
      'lfFaceName': ('Courier New', 1), 
      'lfWeight': (700, 4),            #400=normal, 700=bold
      'lfUnderline': (0, 4), 
      'lfItalic': (1, 4),              #0=disabled, 1=enabled
      'lfStrikeOut': (0, 4), 
      'iPointSize': (160, 4),          #160 = 16pt
      'iMarginBottom': (1000, 4),      #1 inch
      'iMarginTop': (1000, 4), 
      'iMarginLeft': (750, 4), 
      'iMarginRight': (750, 4), 
      'szHeader': ('&f', 1),            #header '&f'=filename
      'szTrailer': ('Page &p', 1),      #footer '&p'=page number
    }
    
    notepad_print('datafile.txt', newset)