Tisk RichTextBoxu   zodpovězená otázka

VB.NET, WinForms, Tisk

Ahoj, mám následující kód na vytištění richTextBoxu který jsem kdesi vygooglil (a přiznám že ne všem řádkům úplně rozumím-stydím se:) Kód je v komponentě printDocument v události PrintPage.

        Dim numChars As Integer
        Dim numLines As Integer
        Dim stringForPage As String
        Dim strFormat As New StringFormat()
        Dim PrintFont As Font = Me.RichTextBoxPredpisy.Font
        Dim StringToPrint As String = Me.RichTextBoxPredpisy.Text



        Dim rectDraw As New RectangleF(e.MarginBounds.Left, e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height)
        Dim sizeMeasure As New SizeF(e.MarginBounds.Width, e.MarginBounds.Height - PrintFont.GetHeight(e.Graphics))

        strFormat.Trimming = StringTrimming.Word

        e.Graphics.MeasureString(StringToPrint, PrintFont, sizeMeasure, strFormat, numChars, numLines)

        stringForPage = StringToPrint.Substring(0, numChars)


        e.Graphics.DrawString(stringForPage, PrintFont, Brushes.Black, rectDraw, strFormat)



        'vkládání textu do souboru
        'pokud se text nevejde na jednu stránku, začne se ukládat na další
        If numChars < StringToPrint.Length Then
            StringToPrint = StringToPrint.Substring(numChars)
            e.HasMorePages = True
        Else
            e.HasMorePages = False
        End If

Kód funguje, ale narazil jsem na 2 základní problémy.

1) při tisku jsou ignorovány všechny tabulátory vložené jako vbTab (i když v richTextBoxu jsou zobrazeny korektně). Pokud si tisk krokuju, místo tabulátorů jsou v textu čtverečky (že by neznámý znak?). Výsledek samozřejmě je, že řádku nejsou úhledně zarovnané, ale rozházené.

2) při tisku jsou ignorováy věci jako tučně, italic, podtržení atd. Je to asi způsobeno tím, že se nastaví font podle prvního? znaku a tak se vytiskne celý dokument.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

vysvětlit Vám to sice můžu,ale raději sem Vám napsal kód,který je mnohem čistčí.Navíc se v něm jistě zorientujete.

Imports System.Drawing
Imports System.Drawing.Printing
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Dim dok As New PrintDocument
            AddHandler dok.PrintPage, AddressOf tisk
            dok.Print()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
    Private Sub tisk(ByVal sender As System.Object, ByVal ev As PrintPageEventArgs)
        Dim fnt As New Font(RichTextBox1.Font.Name, RichTextBox1.Font.Size, RichTextBox1.Font.Style)

        ev.Graphics.DrawString(RichTextBox1.Text, fnt, Brushes.Black, 0, 0)

    End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji, tento kód je přehlednější a pochopitelnější. Navíc bere v potaz ony tabulátory:)

Bohužel jejich zobrazení není uplně korektní (viz. obrázek)

http://www.uloziste.net/thumb/2226/spatn...

Nahoře (modré pozadí) je text tak, jak je zobrazen v richTextBoxu. Pod ním je text tak jak jde na tiskový výstup.

Částky na řádcích Skutečné pojistné a Rozdíl z minulého období jsou nesprávně odsazené (je tam jeden tabulátor navíc). V richTextBoxu skutečně 2 tabulátory na těchto řádcích jsou a to proto aby sloupce byli zarovnané.

Naproti tomu na řádku Předpokládané pojistné je tabulátor pouze jeden. Nevím ale, proč je v richTextBoxu vše pěkně zarovnané a na tisk jde něco jiného.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Až přijdu ze školy ještě se na to podívám.Snad to vyřešíme:)

Upraveno: Tak sem včera stále něco bastlil a nějak sem na nic kloudného nepřišel.Je mi líto ,ale asi Vám více neporadím :(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Z mojich osobných skúseností môžem povedať, že metóda DrawString nevykresľuje celkom dobre tieto biele znaky. Celkom dobre v nej funguje vbcrlf , ale to je tak maximum na čo sa dá spoľahnúť a to myslím pri akomkoľvek fonte a dokonca po formátovaní výsledných stringov. Medzery samozrejme fungujú, ale ak skúsite zobraziť 10 riadkov rôzneho textu pod sebou s rovnakým počtom medzier na začiatku, s výsledkom zarovnania nebudete spokojní.

V princípe si musíte uvedomiť že formát textu v RichTextBoxe už z výsledným formátom strany nemá nič spoločné, snaď len samotný text, ktorý si metoda DrawString vyžaduje, takisto ako je aj font a výška písma a neviem čo ešte v jej rôznych formách preťaženia.

Metóda DrawString, má zrejme pre účely presného zobrazenia geometrické parametre, najmä asi preto, že sa jedná o vektorovú grafiku a nie nejaký textový režim.

Čiže ak máte dobré skúsenosti s vektorovou grafikou, na tlačiacu sa stránku kreslíte presne rovnakým spôsobom a rovnakými metódami z menného priestoru system.drawing.

A teda nemôže byť problém riadok začínajúci tabulátorom zobraziť odsadený o x pixelov vpravo.

V závislosti od zložitosti dokumentu to môže byť dosť babračka, keď berieme do úvahy rôzne editorské problémy so zarovnaním textu a podobne.

Keďže ste presne nešpecifikovali požiadavky na riešenie, je tu ešte možnosť uložiť súbor z richtextboxu metódou SaveFile s príponou *.rtf a potom výsledný súbor otvoríte kľudne vo Worde či WordPade a vytlačíte bez akýchkoľvek problémov ktoré popisujete. Toto riešenie má hodnotu ešte z iného pohľadu, dáta sú prenositeľné a editovateľné, pokiaľ nezmeníte formát súboru aj naďalej zobraziteľné spätne vo Vašej aplikácii, alebo môžete konvertovať na doc.

Zaujímavé už bude len to, či sa dá tento proces programovo vyvolať, aby ste zamedzili zbytočnej interakcii užívateľa, ak je to nutné.

Zdar.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        dim rtf as string = ""
  
        rtf = "{\rtf1\ansi\ansicpg1250\deff0\deflang1029{\fonttbl{\f0\froman\fprq2\fcharset238{\*\fname Times New Roman;}Times New Roman CE;}{\f1\fswiss\fprq2\fcharset238 Calibri;}}"
        rtf &= "{\colortbl ;\red0\green0\blue0;}"
        rtf &= "\viewkind4\uc1\pard\sa200\sl276\slmult1\lang1051\b\i\f0\fs36 Uk\'e1\'9eka ako by to mohlo vyzera\'9d ...\par"
        rtf &= "\b0\i0\f1\fs22 Nejak\'e1 tabu\'beka\par"
        rtf &= "\trowd\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10\brdrcf1 \trbrdrl\brdrs\brdrw10\brdrcf1 \trbrdrb\brdrs\brdrw10\brdrcf1 \trbrdrr\brdrs\brdrw10\brdrcf1 \clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3099\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx6306\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx9514\pard\intbl\cell\cell\cell\row"
        rtf &= "\intbl\cell\cell\cell\row"
        rtf &= "\intbl\cell\cell\cell\row"
        rtf &= "\pard\sa200\sl276\slmult1\par"
        rtf &= "}"

        REM RichTextFormat skripty podľa mňa nikto nepíše ručne

        Clipboard.SetText(rtf, TextDataFormat.Rtf)
        Me.RichTextBox1.Paste()

        

        Me.RichTextBox1.SaveFile("d:\rtf.rtf")
        Process.Start("write.exe", " /p d:\rtf.rtf")

        MsgBox("H O T O V O")

    End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Takže zatím jsem to vyřešil tak, že jsem nahradil tabulátory mezerama (což nevím jestli je úplně správné) a pak jsem richTextBoxu nastavil neproporcionální písmo. Sice to nevypadá tak pěkně, ale lépe se s tím pracuje.

Teď ještě kdyby někdo věděl jak nastavit, aby tiskárna respektovala barvu a typ písma (tučné, kurzíva atd.)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemá RichTextBox nějakou metodu Print?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bohužel jsem nic takového jsem tam nenašel. Na microsoftí podpoře je sice návod na knihovnu, která tisk do richTextBoxu implementuje http://support.microsoft.com/kb/811401 ale výsledek je naprosto stejný jako při mých pokusech. (oni to v podstatě mají dělané stejně, jen tam je ještě navíc náhled před tiskem a nastavení tisku).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže problém vyřešen (jestli se to tak dá říct). V zájmu zachování svého duševního zdraví a fyzického zdraví mojí klávesnice jsem richTextBox nahradil WebBrowserem který má metodu print. Sice není úplně přehledné generovat HTML slepováním stringů ale tisk je korektní.

Jen to má poslední vadu na kráse.

Vpravo nahoře je nápis Stránka č. 1 z 1 vlevo dole je about: blank (pokud bych tisknul nějákou www stránku bude tam její adresa) a vpravo dole je datum. Potřeboval bych tyto automaticky vkládané údaje vypnout, ale ať se koukám do Properties sebevíc, nic čím by se to dalo vypnout tam nevidím.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Takže i to jsem vyřešil, odpovědí je vyvolat formulář ShowPageSetupDialog a tam si uživatel může nastavit záhlaví a zápatí. S tím je spojen ještě jeden drobný problém, ten ale nemá s původním tématem nic společného, proto tento topic uzavírám. Pokračování je tady: http://www.vbnet.cz/ForumThread.aspx?id=...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Našel jsem tento článek:

http://msdn.microsoft.com/en-us/library/...

možná by mohl fungovat.

ZK

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback