3

一部の情報を (ユーザーの確認なしで) 直接出力する必要があり、Python とwin32printモジュールを使用しています。

私はすでにティム・ゴールデンの win32print ページ全体を読んでおり (小さなwin32print docも読んでいます)、彼が自分で書いたのと同じ例を使用していますが、何も印刷していません。

インタラクティブ シェルに移動して一度に 1 ステップずつ実行すると、プリンター キューにあるドキュメントを取得し (ブロックの後) StartDocPrinter、ドキュメント サイズを取得し (StartPagePrinter, WritePrinter, EndPagePrinterブロックの後)、ドキュメントがキューから消えます (ブロックの後)。EndDocPrinter) 印刷なし。

私はShellExecuteティム・ゴールデンが示した方法を知っています。ここでは機能しますが、一時ファイルを作成する必要があり、このファイル名を出力する必要があります.2つのことは望ましくありません。

何か案は?前もって感謝します。

これは私がテストしているコードです (Tim Golden のコードをコピーして貼り付けます):

import os, sys  
import win32print
import time
printer_name = win32print.GetDefaultPrinter()
if sys.version_info >= (3,):
    raw_data = bytes ("This is a test", "utf-8")
else:
    raw_data = "This is a test"

hPrinter = win32print.OpenPrinter (printer_name)
try:
    hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW"))
    try:
        win32print.StartPagePrinter (hPrinter)
        win32print.WritePrinter (hPrinter, raw_data)
        win32print.EndPagePrinter (hPrinter)
    finally:
        win32print.EndDocPrinter (hPrinter)
finally:
    win32print.ClosePrinter (hPrinter)

[編集]

別のプリンター(CutePDF Writer)でテストするためにコンピューターにpdfプリンターをインストールし、test of raw data.pdfファイルを生成できましたが、内部を見ると何もありません。意味: を除くすべてのコマンドWritePrinterは、本来の機能を実行しているように見えます。しかし、コメントで述べたWritePrinterように、プリンターに書き込まれるはずだった正しいバイト数を返します。これを解決する方法は他にわかりませんが、プリンターに問題がないことを確認しました.

4

3 に答える 3

3

私はまだこれを行うための最良の方法を探していますが、私が抱えている問題に対して自分自身を満足させる答えを見つけました. Tim Golden のサイト (問題のリンク先) では、次の例を見つけることができます。

import win32ui
import win32print
import win32con

INCH = 1440

hDC = win32ui.CreateDC ()
hDC.CreatePrinterDC (win32print.GetDefaultPrinter ())
hDC.StartDoc ("Test doc")
hDC.StartPage ()
hDC.SetMapMode (win32con.MM_TWIPS)
hDC.DrawText ("TEST", (0, INCH * -1, INCH * 8, INCH * -2), win32con.DT_CENTER)
hDC.EndPage ()
hDC.EndDoc ()

多くのドキュメントを読んだ後、少し調整しました。win32uiライブラリとTextOut(デバイス コンテキスト メソッド オブジェクト)を使用します。

import win32ui
# X from the left margin, Y from top margin
# both in pixels
X=50; Y=50
multi_line_string = input_string.split()
hDC = win32ui.CreateDC ()
hDC.CreatePrinterDC (your_printer_name)
hDC.StartDoc (the_name_will_appear_on_printer_spool)
hDC.StartPage ()
for line in multi_line_string:
     hDC.TextOut(X,Y,line)
     Y += 100
hDC.EndPage ()
hDC.EndDoc ()

自分の質問に答える前にメタスタックオーバーフローで検索しましたが、ここでそれが推奨される動作であることがわかったので、そうしています。もう少し待って、別の答えが得られるかどうかを確認します。

于 2013-01-30T23:15:45.857 に答える