.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. Вот соответствующий код; Класс 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)
Решение
Да, графический класс поддерживает масштабирование текста. Но это необходимо сделать это, сделав текст на растровое изображение сначала, вскакивая растровое изображение и пропустите, что изменяло растровое изображение на драйвер принтера. Все эти растровые изображения делают для большого файла Spooler.
Вам нужно будет оправдать текст сами. Там нет поддержки для этого в рамках. Один из способов сделать это, чтобы угонировать богатый редактировать контроль и позвольте позаботиться о обосновании и печати. Версия 5, MSFTEDIT.DLL, поддерживает полное оправдание. Лучший способ найти необходимый код, это найти один из множества проектов, которые реализуют текстовый редактор с RTB, аналогично WordPad в Windows.
Другие советы
Я предполагаю, но вы должны увеличить размер шрифта в процентах от пропорции, которую вы хотите масштабироваться.