3

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.

kuslahne
  • 720
  • 4
  • 10
  • 21
  • why are you using windows api if python offers cross-platform modules for this? – BrainStorm Aug 02 '11 at 02:08
  • which modules handling this method? can you suggest me the url? – kuslahne Aug 02 '11 at 02:20
  • first you'll have to explain exactly what are you trying to accomplish. – BrainStorm Aug 02 '11 at 02:34
  • Thanks for reply @ BrainStorm. I have filename.txt with "Hello World" string. Then I need to print this file using python. But the ouput from printer comes with header with filename.txt and Page1 on footer. How to remove this output? – kuslahne Aug 02 '11 at 04:05

2 Answers2

4

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)
Eryk Sun
  • 33,190
  • 5
  • 92
  • 111
0

Using this method seems to give more control to the programmer and certainly doesn't insert headers and foots without explicit statements.

BrainStorm
  • 2,036
  • 1
  • 16
  • 23
  • @BrainStorm I mean like this one [http://computertipaday.blogspot.com/2009/03/remove-default-header-and-footer-from.html](http://computertipaday.blogspot.com/2009/03/remove-default-header-and-footer-from.html) but in python way. – kuslahne Aug 02 '11 at 04:41