[python] printen onder windows

Pagina: 1
Acties:
  • 248 views sinds 30-01-2008
  • Reageer

  • jurriaan
  • Registratie: Januari 2000
  • Laatst online: 24-06 02:04
Ik heb een flashprojecter (.exe), waaruit ik grote textinputs wil printen. Aangezien de printmogelijkheden van flash, zeker wat betreft grotere stukken tekst nogal mager zijn, wil ik het anders oplossen. Ik heb al een socketconnectie met een pythonservertje, dus ik denk, ik gebruik gewoon python. Maar elke print mogelijkheid in python print de hele lijn zonder deze af te breken op de printer. Er wordt wel op newlines afgebroken, maar dat zijn alineascheidingen.

Ik heb ECP_printer gebruikt, een activeX wrapper voor python, en de ondersteuning uit pywin. Maar zelfs in de IDE pywin gebeurt dit bij langere regels. Moet lijkt me toch wel mogelijk zijn dat de printer ook een beetje rekening houdt met het papier :/

Wees verantwoordelijk voor je eigen daden


  • jurriaan
  • Registratie: Januari 2000
  • Laatst online: 24-06 02:04
niemand die met python werkt en een idee heeft?

Wees verantwoordelijk voor je eigen daden


  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 10-07 04:13

PommeFritz

...geen friet

Ik zou je wel willen proberen te helpen maar ik snap echt niet uit je verhaal wat er wel/niet werkt. Geef eens een voorbeeld? Wat wil je, wat gaat er precies fout?

FireFox - neem het web in eigen hand


  • jurriaan
  • Registratie: Januari 2000
  • Laatst online: 24-06 02:04
De gebruiker vult in flash een tekstvak in (een brief). Deze brief moet ook kunnen worden geprint. Omdat flash dat niet goed kan, stuur ik de tekst uit het tekstvak naar een pythonsocketserver, beetje in deze trend:

code:
1
2
3
4
5
<text>Nos amice et nebevol, olestias acce augendas cum conscient to factor tum
civiuda. Et tamen in busdad mne que pecu nonor imper ned libiding gen epular
quas nulia praid im umdnat. Improb pinflammad ut coercend magist 
videantur.\n\nInvitat igitur vera ratio bene aequitated fidem. 
</text>


Dit komt als 1 lange string binnen. Als ik dit nou probeer uit te printen, loopt de tekst op de eerste regel van het uitgeprinte document van het papier af. Niet alles komt dus op papier.

Wat ik geprobeerd heb is het afdrukken met de win32 module:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import win32ui
import win32con

mytext = "<text>Nos .... quiet</text>"
print_it()

def print_it():
    dc = win32ui.CreateDC()
    dc.CreatePrinterDC()
    dc.StartDoc('Titel')
    dc.StartPage()
    dc.TextOut(100,100, mytext) #1 inch in, 1 up
    dc.EndPage()
    dc.EndDoc()
    print 'sent to printer'
    del dc


en met ecp_printer een wrapper voor python voor het visual basic printerobject:

code:
1
2
3
4
5
6
7
8
9
import win32com.client

mytext = "<text>Nos .... quiet</text>"
x = win32com.client.Dispatch('ecp_printer.Printer')
x.ScaleMode = 'vbInches'
x.FontName = 'Arial'
x.FontSize = 11
x.ecpPrint(mytext)
x.EndDoc()


In beide gevallen loopt de tekst gewoon van de eerste regel af, terwijl ik natuurlijk wil dat de hele tekst op papier komt.

[ Voor 6% gewijzigd door jurriaan op 29-09-2003 20:36 ]

Wees verantwoordelijk voor je eigen daden


  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 10-07 04:13

PommeFritz

...geen friet

Ah nu begrijp ik het probleem.
Als je via een DC gaat printen dan print je a.h.w. een virtueel display, en als je dus een gewone TextOut doet dan komt alles op 1 regel inderdaad.
Dit komt omdat de TextOut gewoon 1 lange string achter elkaar print.

De brieven of teksten die je wilt printen, hebben die ook opmaak?

Wat dacht je van het volgende:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
HTMLtekst = """<html><body>
<h1>Test HTML pagina</h1>
<p>Dit is een stuk <code>HTML</code> geprint vanuit <em>Python</em>.
</p></body></html>"""

RTFtekst = r"""{\rtf1\ansi\ansicpg1252\deff0\deflang1033
\uc1\pard\b\f0\fs48 Test RTF pagina\par
\b0\fs20\par
dit is een stuk RTF tekst.\par
\par
}"""


WordPadLocation = r"C:\Program Files\Windows NT\Accessories\wordpad.exe"

import tempfile
import os

def printHTML(theHTML):
    tempFileName = tempfile.mktemp(suffix=".html")
    out=open(tempFileName, "w")
    out.write(theHTML)
    out.close()
    os.system("print "+tempFileName)
    # os.remove(tempFileName)   NIET weggooien

def printRTF(theRTF):
    tempFileName = tempfile.mktemp(suffix=".rtf")
    out=open(tempFileName, "w")
    out.write(theRTF)
    out.close()
    print os.system("\"%s\" /p %s" % (WordPadLocation, tempFileName))
    # hierboven zou 'print' ook moeten werken.
    # os.remove(tempFileName)  # NIET weggooien
    
printHTML(HTMLtekst)
printRTF(RTFtekst)

Dit werkt alleen op Windows. Je kunt dus HTML, RTF, whatever printen,
zolang Windows maar een programma heeft die het voor je doet. :Y)
HTML->web browser
RTF->wordpad of word
TXT->notepad, wordpad, word

Suc6!

PS: de RTF tekst is gewoon met Wordpad gemaakt en als text ingeplakt ;)

FireFox - neem het web in eigen hand


  • jurriaan
  • Registratie: Januari 2000
  • Laatst online: 24-06 02:04
Dank je voor je input! De brieven hebben inderdaad een opmaak. Er is alleen 1 probleem. Het werkt niet ;( In de printerqueue komt een boodschap te staan dat hij probeert het document toe te voegen, maar verder gebeurt er niets.

Ik denk dat dit komt omdat ik gebruik maak van een netwerkprinter, iets wat ook bij de gebruiker zou kunnen gebeuren. Ook kan ik niet het path naar wordpad opgeven, omdat ik niet zeker weet waar dit bij de gebruiker staat. Ik denk dat ik dan ook maar niet python direct gebruik. Ik ben nu aan het experimenteren met

rundll32.exe %WINDIR%\\SYSTEM32\\MSHTML.DLL,PrintHTML "temp.txt" wat 'lijkt' te werken

[ Voor 6% gewijzigd door jurriaan op 01-10-2003 13:50 ]

Wees verantwoordelijk voor je eigen daden


  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 10-07 04:13

PommeFritz

...geen friet

Als je met de hand in een dos box typt: print temp.txt of print temp.html werkt het dan wel?? Als dat werkt zou die os.system call in Python ook gewoon moeten werken...

En over wordpad... misschien hoef je niet wordpad.exe aan te roepen om RTF te kunnen printen, wellicht zit er standaard in windows ook een print actie bij .rtf file extensie. Dan kun je ook voor RTF files gewoon "print bla.rtf" doen en zoekt windows zelf wel waar Word of Wordpad staan, om het te printen.
Ik denk dat ik dan ook maar niet python direct gebruik. Ik ben nu aan het experimenteren met

rundll32.exe %WINDIR%\\SYSTEM32\\MSHTML.DLL,PrintHTML "temp.txt" wat 'lijkt' te werken
Wat bedoel je precies? roep je rundll32.exe aan vanuit python, of sla je python over en doe je dit vanuit Flash?

FireFox - neem het web in eigen hand


  • jurriaan
  • Registratie: Januari 2000
  • Laatst online: 24-06 02:04
ik roep rundll32.exe aan vanuit python. Vanuit flash kan dat vanwege de beveiliging niet meer. Je kunt geen parameters meesturen en geen exe aanspreken buiten een speciale folder. Vandaar ook de noodzaak van een socketserver, wat in principe alleen maar weer problemen kan opleveren met geblokeerde poorten :s

[ Voor 5% gewijzigd door jurriaan op 02-10-2003 01:28 ]

Wees verantwoordelijk voor je eigen daden

Pagina: 1