[.NET/Winforms] Bitmaps printen met PrintDocument *

Pagina: 1
Acties:

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
Ik moet zeggen dat ik .NET een supertaal vind, behalve als het op printen neer komt, volgens mij had dit beter gekunt. Wat ik nu doe is de pagina's opslaan in een array van Bitmaps, en deze bij het PageEvent uitprinten. Uiteraard met een vergelijking van die teller en Ubound van die array kan je vaststellen of er meer pagina's zijn (HasMorePages) en zo gaat ie nog een keer naar het PrintPage event. Daar word natuurlijk ook de teller verhoogt. Die bitmap array neemt misschien veel ruimte in, maar dat is nu niet van belang en het maakt het opbouwen van de pagina's voor mij een stuk makkelijker.

Gezocht op google en wel veel handige voorbeelden gevonden, maar allemaal voor maar 1 page, of voor met een textfile. Op Got 1 topic, maar had ik niet heel veel aan.

Goed, het probleem: Doe ik nou een stuk tekst op een bmp,
code:
1
2
      e = Graphics.FromImage(bmp)
      e.DrawString("blablabla", New Font("Arial", 12, FontStyle.Bold), Brushes.Black, 40, 40)

en ik print daarna de bmp, of een preview, dan is de tekst onscherp, niet mooi. Doe ik nu bij het PrintPage event een e.Graphics.DrawString("bla", etc, dan is de tekst scherp. Nu is mijn vraag dus, hoe komt dit? Ik declareer mijn bitmap als volgt:
code:
1
2
Dim bmp as Bitmap
bmp = New Bitmap(810, 1060, Imaging.PixelFormat.Format32bppArgb)


Dit is niet die array uiteraard :) Let even niet op die 810 bij 1060 pixels, ik was even wat aan het uitproberen. Mag ook 400 bij 400 zijn ofzo, hij rekt het niet uit en krimpt het niet in, plus dat de margins hoger liggen dan dit formaat. Maar goed, ik heb meerdere pixelformaten geprobeerd, maar het blijft wazig. Misschien niet met bitmaps werken? Kan wel mn algorithme van het toetsen maken in het PrintPage alghorithme zetten, maar dit is zeker niet mijn voorkeur. Vind het maar raar. Misschien zie ik iets over het hoofd.

edit:
komt nog bij, dat wanneer ik de pagina instellingen aanpas (bijv. van Letter naar A4) dat de PageMargins niet veranderen? kgeloof iets van 850 bij 1150

[ Voor 6% gewijzigd door dixon op 08-08-2004 18:45 ]

Wat een onzin..


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
Hmm, wat wil je eigenlijk uitprinten?

Trouwens, .NET is geen taal, maar een platform. ;)

https://fgheysels.github.io/


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
Text en plaatjes :)
Je hebt gelijk, .NET is geen taal. VB .NET dan hehe :) maarja C# .NET is tzelfde hehe.

edit: maar je hebt geen id wat ik ervoor moet gebruiken? Of moet ik misschien die bmp anders uitprinten?

[ Voor 34% gewijzigd door dixon op 08-08-2004 21:49 ]

Wat een onzin..


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
Kan je dan niet beter met een of andere reporting tool werken?

https://fgheysels.github.io/


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
Ik zou het niet weten :) Had ik nog niet eerder van gehoord, maar kzal het zoeken. Ik haal iig de gegevens uit een database.

Anders maak ik wel het alg. in de PrintPage procedure.

[ Voor 1% gewijzigd door dixon op 08-08-2004 21:56 . Reden: een db :) ]

Wat een onzin..


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Die onscherpte zal wel komen door de lage resolutie. Je schrijft de text zo te zien naar je plaatje toe. Dat plaatje zal een resolutie hebben van 75 of 90 dpi. Terwijl je dit gaat schrijven naar je printer met bijv. 300 dpi.

Ik zou zeggen: teken je afbeeldingen gewoon op het graphics object dat je van je printer krijgt en ook de tekst. Dan zou het probleem opgelost moeten zijn.

En idd, zelf je "rapportjes" maken in C# is geen fijn werk. Daar hebben ze reporting tools voor uitgevonden. Kijk maar eens naar het maken van raportjes in MS Access. Bij Visual Studio .Net zit bijvoorbeeld Crystal Reports (licensie technisch kan dat een probleem zijn). Of microsoft reporting services bij MS SQL Server. En er zullen ongetwijfeld nog veel meer produkten zijn. Zonder report builder kan je bijv. ook kijken naar XML-FO.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
Hmm, nouja tis nogal belangrijk dat het vanuit het programma gebeurt. Maar goed, Ik zet het wel in het PrintPage event (zucht, vind het maar raar met member variabelen en alles).

Even kijken of een bitmap met een hogere DPI mogelijk is..?

btw thnx whoami en Infinitive

Wat een onzin..


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Bekijk de namespace System.Drawing.Printing is, ik vind deze prima werken, zeker voor hetgene wat jij nu doet.

Werkt echt prima, deze namespace heeft alles wat je nodig hebt.

En wat bedoel je precies met:
dixon schreef op 09 augustus 2004 @ 21:26:
...Ik zet het wel in het PrintPage event (zucht, vind het maar raar met member variabelen en alles).

[ Voor 14% gewijzigd door pjvandesande op 09-08-2004 23:41 . Reden: link van de MSDN page toegevoegd. ]


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
questa thnx ik ga kijken

wat ik bedoelde.. ja kijk ik print verschillende dingen uit en van sommige moeten meerdere kopieen sommige niet is allemaal instelbaar in het programma. Maar in het PrintPage event komt dan je algorithme. Maar het printpage event kan je nog een keer aan laten roepen door e.HasMorePages = True te zetten. Die functie moet bijv. een of andere teller bijhouden, maar die is in de class als member variabele gedeclareert.

Ik kan het me voorstellen als je niet begrijpt wat ik bedoel :)
Iig, ik vind het PrintPage event met een e.HasMorePages een beetje raar.

Wat een onzin..


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

dixon schreef op 10 augustus 2004 @ 02:26:
...het printpage event kan je nog een keer aan laten roepen door e.HasMorePages = True te zetten. Die functie moet bijv. een of andere teller bijhouden, maar die is in de class als member variabele gedeclareert.
Je houd in je class zelf bij idd hoevaak er geprint is en wat er geprint is. Het is even wat denk werk, maar je komt er wel uit!

Mocht je er met de code ook niet helemaal uitkomen, post het dan ook even en wie weet wat we kunnen doen.

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
:) Thnx.

Code prakken lukt wel.

Wat een onzin..


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:55

TeeDee

CQB 241

Nog wat tips mbt de vaagheid van je txt:

.EncoderParameters
.AntiAliasGridFit

Daar kan je ook aardig wat mee regelen.

edit:
Sommige dingen die ik gebruik icm het graphics object:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
Dim j As Integer
Dim encoders() As ImageCodecInfo
encoders = ImageCodecInfo.GetImageEncoders()
For j = 0 To  encoders.Length- 1  Step   + 1
    If encoders(j).MimeType = mimeType Then
        Return encoders(j)
    End If
Next
Return Nothing
End Function

Dim eps As EncoderParameters =  New EncoderParameters(1) 
eps.Param(0) = New EncoderParameter(Encoder.Quality, 90L)
Dim ici As ImageCodecInfo =  GetEncoderInfo("image/jpeg") 
img.Dispose()   

bmp.Save(ImgPath,ici,eps)
bmp.Dispose()   

@Infinitive: meer als voorbeeld. GetEncoderInfo kan ook voor BMP afaik gebruikt worden.

[ Voor 80% gewijzigd door TeeDee op 10-08-2004 17:52 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Wat heeft het veranderen van afbeeldingsformaat met het probleem van de TS te maken? De kwaliteit kan op deze manier alleen maar achteruit gaan... :?

[ Voor 4% gewijzigd door Infinitive op 10-08-2004 15:01 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Voor de scherpte van text gebruik SmoothingMode en TextRenderingHint:

C#:
1
2
g.SmoothingMode =SmoothingMode.HighQuality;
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
Toch even geprobeerd:
e.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
e.TextRenderingHint = Text.TextRenderingHint.ClearTypeGridFit

Alleen dit word blauw onderstreept:
Text.TextRenderingHint
met de melding dat het niet een member van 'String' is.

Dus alleen de smoothingmode aangepast. Volgens mij wordt het wel wat mooier, maar nog steeds niet te vergelijken met printen bij PrintPage event.

Is er geen ander formaat wat ik kan gebruiken waarbij ik de DPI hoger kan zetten? :)

Wat een onzin..


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

dixon schreef op 10 augustus 2004 @ 16:21:
Toch even geprobeerd:
e.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
e.TextRenderingHint = Text.TextRenderingHint.ClearTypeGridFit

Alleen dit word blauw onderstreept:
Text.TextRenderingHint
met de melding dat het niet een member van 'String' is.

Dus alleen de smoothingmode aangepast. Volgens mij wordt het wel wat mooier, maar nog steeds niet te vergelijken met printen bij PrintPage event.

Is er geen ander formaat wat ik kan gebruiken waarbij ik de DPI hoger kan zetten? :)
Ik zou gewoon het PrintPage event gebruiken, maar je kunt de resolutie toch instellen van een BitMap. (Ik kan het even niet opzoeken)

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
als je een bitmap declareert geeft je formaat aan etc. Maar geen DPI volgens mij.
Maar goed, ik heb de code in PrintPage event gezet en aangepast uiteraard.

gaat wel lukken nu, thnx

[ Voor 22% gewijzigd door dixon op 10-08-2004 17:30 ]

Wat een onzin..

Pagina: 1