скрыть верхний и нижний колонтитулы в текстовых файлах при прямой печати с использованием win32 и python - PullRequest
3 голосов
/ 02 августа 2011

Я застрял здесь при печати напрямую в текстовые файлы с использованием этого кода

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

он всегда печатает заголовок «datafile.txt» и нижний колонтитул «Page1». Я хочу скрыть или удалить это при печати на бумаге непрерывной формы. Я не хочу устанавливать стороннее программное обеспечение. Пожалуйста, помогите мне. Спасибо.

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Я уверен, что вы просто ищите модуль, который справится с этой проблемой гораздо лучше, чем этот хак (например, используйте Reportlab и ShellExecute the PDF)Кроме того, приложением по умолчанию для печати текстовых файлов в Windows является Блокнот.Если вы хотите настроить заголовок / нижний колонтитул постоянно, просто измените его в File-> Page Setup.

Если вы хотите изменить настройки Notepad в своей программе, вы можете использовать модуль winreg (_winreg в Python 2).Однако существует проблема с синхронизацией, поскольку ShellExecute не ждет, пока задание будет поставлено в очередь.Перед восстановлением старой настройки вы можете немного поспать или просто подождать, пока пользователь input продолжит работу.Вот быстрая функция, которая демонстрирует процесс:

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])

Вы можете временно удалить настройки верхнего / нижнего колонтитула с помощью следующего вызова:

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

Вы можете изменить столько параметров реестракак хочешь:

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)
0 голосов
/ 02 августа 2011

Используя этот метод , кажется, дает больше контроля программисту и, конечно, не вставляет заголовки и нижние колонтитулы без явных выражений.

...