HTML表格中的垂直(旋转)文本

您所在的位置:网站首页 旋转单元格中的文本功能可以将单元格中的文本旋转 HTML表格中的垂直(旋转)文本

HTML表格中的垂直(旋转)文本

2024-04-12 19:54| 来源: 网络整理| 查看: 265

在尝试了两个多小时后,我可以放心地说,到目前为止提到的所有方法都不适用于跨浏览器,甚至不适用于IE,甚至跨浏览器版本……

例如(排名靠前的答案):

filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083); /* IE6,IE7 */ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083)"; /* IE8 */

在过滤器中旋转两次,一次用于filter,一次用于-ms- IE9,因此...

所有其他提到的方法也不起作用,至少如果你没有设置表格标题单元格的固定高度/宽度(带背景颜色),它应该自动调整到最高元素的大小。

因此,为了详细说明Nathan Long提出的服务器端图像生成,这实际上是唯一通用的方法,下面是我的通用处理程序(*.ashx )的VB.NET代码:

Imports System.Web Imports System.Web.Services Public Class GenerateImage Implements System.Web.IHttpHandler Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 'context.Response.ContentType = "text/plain" 'context.Response.Write("Hello World!") context.Response.ContentType = "image/png" Dim strText As String = context.Request.QueryString("text") Dim strRotate As String = context.Request.QueryString("rotate") Dim strBGcolor As String = context.Request.QueryString("bgcolor") Dim bRotate As Boolean = True If String.IsNullOrEmpty(strText) Then strText = "No Text" End If Try If Not String.IsNullOrEmpty(strRotate) Then bRotate = System.Convert.ToBoolean(strRotate) End If Catch ex As Exception End Try 'Dim img As System.Drawing.Image = GenerateImage(strText, "Arial", bRotate) 'Dim img As System.Drawing.Image = CreateBitmapImage(strText, bRotate) ' Generic error in GDI+ 'img.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png) 'Dim bm As System.Drawing.Bitmap = New System.Drawing.Bitmap(img) 'bm.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png) Using msTempOutputStream As New System.IO.MemoryStream 'Dim img As System.Drawing.Image = GenerateImage(strText, "Arial", bRotate) Using img As System.Drawing.Image = CreateBitmapImage(strText, bRotate, strBGcolor) img.Save(msTempOutputStream, System.Drawing.Imaging.ImageFormat.Png) msTempOutputStream.Flush() context.Response.Buffer = True context.Response.ContentType = "image/png" context.Response.BinaryWrite(msTempOutputStream.ToArray()) End Using ' img End Using ' msTempOutputStream End Sub ' ProcessRequest Private Function CreateBitmapImage(strImageText As String) As System.Drawing.Image Return CreateBitmapImage(strImageText, True) End Function ' CreateBitmapImage Private Function CreateBitmapImage(strImageText As String, bRotate As Boolean) As System.Drawing.Image Return CreateBitmapImage(strImageText, bRotate, Nothing) End Function Private Function InvertMeAColour(ColourToInvert As System.Drawing.Color) As System.Drawing.Color Const RGBMAX As Integer = 255 Return System.Drawing.Color.FromArgb(RGBMAX - ColourToInvert.R, RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B) End Function Private Function CreateBitmapImage(strImageText As String, bRotate As Boolean, strBackgroundColor As String) As System.Drawing.Image Dim bmpEndImage As System.Drawing.Bitmap = Nothing If String.IsNullOrEmpty(strBackgroundColor) Then strBackgroundColor = "#E0E0E0" End If Dim intWidth As Integer = 0 Dim intHeight As Integer = 0 Dim bgColor As System.Drawing.Color = System.Drawing.Color.LemonChiffon ' LightGray bgColor = System.Drawing.ColorTranslator.FromHtml(strBackgroundColor) Dim TextColor As System.Drawing.Color = System.Drawing.Color.Black TextColor = InvertMeAColour(bgColor) 'TextColor = Color.FromArgb(102, 102, 102) ' Create the Font object for the image text drawing. Using fntThisFont As New System.Drawing.Font("Arial", 11, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel) ' Create a graphics object to measure the text's width and height. Using bmpInitialImage As New System.Drawing.Bitmap(1, 1) Using gStringMeasureGraphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmpInitialImage) ' This is where the bitmap size is determined. intWidth = CInt(gStringMeasureGraphics.MeasureString(strImageText, fntThisFont).Width) intHeight = CInt(gStringMeasureGraphics.MeasureString(strImageText, fntThisFont).Height) ' Create the bmpImage again with the correct size for the text and font. bmpEndImage = New System.Drawing.Bitmap(bmpInitialImage, New System.Drawing.Size(intWidth, intHeight)) ' Add the colors to the new bitmap. Using gNewGraphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmpEndImage) ' Set Background color 'gNewGraphics.Clear(Color.White) gNewGraphics.Clear(bgColor) gNewGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias gNewGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias '''' 'gNewGraphics.TranslateTransform(bmpEndImage.Width, bmpEndImage.Height) 'gNewGraphics.RotateTransform(180) 'gNewGraphics.RotateTransform(0) 'gNewGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault gNewGraphics.DrawString(strImageText, fntThisFont, New System.Drawing.SolidBrush(TextColor), 0, 0) gNewGraphics.Flush() If bRotate Then 'bmpEndImage = rotateImage(bmpEndImage, 90) 'bmpEndImage = RotateImage(bmpEndImage, New PointF(0, 0), 90) 'bmpEndImage.RotateFlip(RotateFlipType.Rotate90FlipNone) bmpEndImage.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone) End If ' bRotate End Using ' gNewGraphics End Using ' gStringMeasureGraphics End Using ' bmpInitialImage End Using ' fntThisFont Return bmpEndImage End Function ' CreateBitmapImage ' http://msdn.microsoft.com/en-us/library/3zxbwxch.aspx ' http://msdn.microsoft.com/en-us/library/7e1w5dhw.aspx ' http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=286 ' http://road-blogs.blogspot.com/2011/01/rotate-text-in-ssrs.html Public Shared Function GenerateImage_CrappyOldReportingServiceVariant(ByVal strText As String, ByVal strFont As String, bRotate As Boolean) As System.Drawing.Image Dim bgColor As System.Drawing.Color = System.Drawing.Color.LemonChiffon ' LightGray bgColor = System.Drawing.ColorTranslator.FromHtml("#E0E0E0") Dim TextColor As System.Drawing.Color = System.Drawing.Color.Black 'TextColor = System.Drawing.Color.FromArgb(255, 0, 0, 255) If String.IsNullOrEmpty(strFont) Then strFont = "Arial" Else If strFont.Trim().Equals(String.Empty) Then strFont = "Arial" End If End If 'Dim fsFontStyle As System.Drawing.FontStyle = System.Drawing.FontStyle.Regular Dim fsFontStyle As System.Drawing.FontStyle = System.Drawing.FontStyle.Bold Dim fontFamily As New System.Drawing.FontFamily(strFont) Dim iFontSize As Integer = 8 '//Change this as needed ' vice-versa, because 270° turn 'Dim height As Double = 2.25 Dim height As Double = 4 Dim width As Double = 1 ' width = 10 ' height = 10 Dim bmpImage As New System.Drawing.Bitmap(1, 1) Dim iHeight As Integer = CInt(height * 0.393700787 * bmpImage.VerticalResolution) 'y DPI Dim iWidth As Integer = CInt(width * 0.393700787 * bmpImage.HorizontalResolution) 'x DPI bmpImage = New System.Drawing.Bitmap(bmpImage, New System.Drawing.Size(iWidth, iHeight)) '// Create the Font object for the image text drawing. 'Dim MyFont As New System.Drawing.Font("Arial", iFontSize, fsFontStyle, System.Drawing.GraphicsUnit.Point) '// Create a graphics object to measure the text's width and height. Dim MyGraphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmpImage) MyGraphics.Clear(bgColor) Dim stringFormat As New System.Drawing.StringFormat() stringFormat.FormatFlags = System.Drawing.StringFormatFlags.DirectionVertical 'stringFormat.FormatFlags = System.Drawing.StringFormatFlags.DirectionVertical Or System.Drawing.StringFormatFlags.DirectionRightToLeft Dim solidBrush As New System.Drawing.SolidBrush(TextColor) Dim pointF As New System.Drawing.PointF(CSng(iWidth / 2 - iFontSize / 2 - 2), 5) Dim font As New System.Drawing.Font(fontFamily, iFontSize, fsFontStyle, System.Drawing.GraphicsUnit.Point) MyGraphics.TranslateTransform(bmpImage.Width, bmpImage.Height) MyGraphics.RotateTransform(180) MyGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault MyGraphics.DrawString(strText, font, solidBrush, pointF, stringFormat) MyGraphics.ResetTransform() MyGraphics.Flush() 'If Not bRotate Then 'bmpImage.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone) 'End If Return bmpImage End Function ' GenerateImage ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property ' IsReusable End Class

请注意,如果您认为这部分

Using msTempOutputStream As New System.IO.MemoryStream 'Dim img As System.Drawing.Image = GenerateImage(strText, "Arial", bRotate) Using img As System.Drawing.Image = CreateBitmapImage(strText, bRotate, strBGcolor) img.Save(msTempOutputStream, System.Drawing.Imaging.ImageFormat.Png) msTempOutputStream.Flush() context.Response.Buffer = True context.Response.ContentType = "image/png" context.Response.BinaryWrite(msTempOutputStream.ToArray()) End Using ' img End Using ' msTempOutputStream

可以替换为

img.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png)

因为它可以在开发服务器上工作,所以如果您将其部署到Windows2003IIS6服务器上,那么您就大错特错地认为相同的代码不会抛出通用的GDI+异常……

然后像这样使用它:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3