开发者

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 h开发者_StackOverflowide or remove this when printing on continous form paper. I do not want to install another third party software. Please help me. Thanks.


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)


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜