.NET Graphics.Scaletransform将打印作业转换为位图。还有其他缩放文本的方法吗?
-
26-09-2019 - |
题
我在用着 Graphics.ScaleTransform
要拉伸文本行,以使它们适合页面的宽度,然后打印该页面。但是,这将打印作业转换为位图 - 对于带有许多页面的打印,这会导致打印作业的大小提高到淫秽的比例,并极大地减慢了打印。
如果我不这样扩展,则打印作业仍然很小,因为它只是向打印机发送文本打印命令。
我的问题是,除了使用以外,还有什么其他方法 Graphics.ScaleTransform
拉伸文本的宽度?
以下示例代码以下是在下面的 Print.Test(True)
和 Print.Test(False)
显示缩放对打印作业的影响):
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Drawing.Imaging
Public Class Print
Dim FixedFont As Font
Dim Area As RectangleF
Dim CharHeight As Double
Dim CharWidth As Double
Dim Scale As Boolean
Const CharsAcross = 80
Const CharsDown = 66
Const TestString = "!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
Private Sub PagePrinter(ByVal sender As Object, ByVal e As PrintPageEventArgs)
Dim G As Graphics = e.Graphics
If Scale Then
Dim ws = Area.Width / G.MeasureString(Space(CharsAcross).Replace(" ", "X"), FixedFont).Width
G.ScaleTransform(ws, 1)
End If
For CurrentLine = 1 To CharsDown
G.DrawString(Mid(TestString & TestString & TestString, CurrentLine, CharsAcross), FixedFont, Brushes.Black, 0, Convert.ToSingle(CharHeight * (CurrentLine - 1)))
Next
e.HasMorePages = False
End Sub
Public Shared Sub Test(ByVal Scale As Boolean)
Dim OutputDocument As New PrintDocument
With OutputDocument
Dim DP As New Print
.PrintController = New StandardPrintController
.DefaultPageSettings.Landscape = False
DP.Area = .DefaultPageSettings.PrintableArea
DP.CharHeight = DP.Area.Height / CharsDown
DP.CharWidth = DP.Area.Width / CharsAcross
DP.Scale = Scale
DP.FixedFont = New Font("Courier New", DP.CharHeight / 100, FontStyle.Regular, GraphicsUnit.Inch)
.DocumentName = "Test print (with" & IIf(Scale, "", "out") & " scaling)"
AddHandler .PrintPage, AddressOf DP.PagePrinter
.Print()
End With
End Sub
End Class
更新: 我改用与GDI呼叫的Interop。这是相关代码; GDI课程充满了我从Wiki复制的定义 http://pinvoke.net/ 对于相关的功能和常数。
' convert from Graphics units (100 dpi) to device units
Dim GDIMappedCharHeight As Double = CharHeight * G.DpiY / 100
Dim GDIMappedCharWidth As Double = CharWidth * G.DpiX / 100
Dim FixedFontGDI As IntPtr = GDI.CreateFont(GDIMappedCharHeight, GDIMappedCharWidth, 0, 0, 0, 0, 0, 0, GDI.DEFAULT_CHARSET, GDI.OUT_DEFAULT_PRECIS, GDI.CLIP_DEFAULT_PRECIS, GDI.DEFAULT_QUALITY, GDI.FIXED_PITCH, "Courier New")
Dim CharRect As New GDI.STRUCT_RECT
Dim hdc As IntPtr = G.GetHdc()
GDI.SelectObject(hdc, FixedFontGDI)
' I used SetBkMode transparent as my text needed to overlay a background
GDI.SetBkMode(hdc, GDI.TRANSPARENT)
' draw it character by character to get precise grid
For CurrentLine = 1 To CharsDown
For CurrentColumn = 1 To CharsAcross
With CharRect
.left = GDIMappedCharWidth * (CurrentColumn - 1)
.right = GDIMappedCharWidth * CurrentColumn
.top = GDIMappedCharHeight * (CurrentLine - 1)
.bottom = GDIMappedCharHeight * CurrentLine
End With
' 2341 == DT_NOPREFIX|DT_NOCLIP|DT_VCENTER|DT_CENTER|DT_SINGLELINE
GDI.DrawText(hdc, Mid(TestString & TestString & TestString, CurrentLine+CurrentColumn, 1), 1, CharRect, 2341)
Next
Next
GDI.DeleteObject(FixedFontGDI)
G.ReleaseHdc(hdc)
解决方案
是的,图形类支持缩放文本。但是,需要首先将文本渲染到位图,重新列出位图并将其调整给打印机驱动程序的大小大小的位图来做到这一点。所有这些位图制造了一个大型的阀芯文件。
您将需要自己证明文字合理。框架中没有对此的支持。做到这一点的一种方法是劫持丰富的编辑控制,并让它照顾理由和印刷。版本5,msftedit.dll,支持完全理由。找到所需代码的最好方法是找到具有RTB的文本编辑器的众多项目之一,类似于Windows上的WordPad。
其他提示
我在这里猜测,但是您应该将字体的大小增加一定比例的比例。
不隶属于 StackOverflow