【问题标题】:How can i measure a string to be printed如何测量要打印的字符串
【发布时间】:2015-09-27 15:33:36
【问题描述】:

我必须测量一个字符串来确定确切的值,这样我就可以创建一个标签,并在报告上设置以下信息以正确打印出来。

我发布了很多关于使用 Graphics.MeasureString 测量搅拌的帖子 但是当我使用这些时,我没有得到打印输出中的精确毫米。

这是我的代码:

public double getStingWith_mm(string InputText, string Fontname, bool TypeBold, bool TypeItalic, double Fontsize)
{

    try
    {
        if (grU == null)
        {
            //grU = CreateGraphics();
            //grU = Graphics.FromImage(new Bitmap(1, 1));
            System.Drawing.Printing.PrintDocument PD = new System.Drawing.Printing.PrintDocument();
            grU = PD.PrinterSettings.CreateMeasurementGraphics();
        }

        FontStyle fStyle = FontStyle.Regular;
        try
        {
            if (TypeBold)
                fStyle = FontStyle.Bold;
            if (TypeItalic)
                fStyle = FontStyle.Italic;
        }
        catch (Exception ex)
        {
            logger4net.Error("some error during creating of the fonts.", ex);
        }

        try
        {
            currentFont = new System.Drawing.Font(
                    new FontFamily(Fontname),
                   (int)Math.Ceiling(Fontsize),  //next higher size!
                   fStyle,
                   GraphicsUnit.Millimeter);

        }
        catch (Exception ex)
        {
            logger4net.Error("some error during creating of the fonts " + Fontname, ex);

            try
            {
                currentFont = new System.Drawing.Font(
                        new FontFamily("Arial"),
                       (int)Math.Ceiling(Fontsize),  //next higher size!
                       fStyle,
                       GraphicsUnit.Millimeter);
            }
            catch (Exception ex2)
            {
                logger4net.Error("some error during creating of the fonts: we fall back to Arial!!", ex);
            }
        }

        // Change the page scale.  
        grU.PageUnit = GraphicsUnit.Millimeter;
        grU.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        SizeF size = grU.MeasureString(InputText, currentFont); //string format (zusatzparameter) , 495)                
        //SizeF result2 = grU.MeasureString(InputText, currentFont, int.MaxValue, StringFormat.GenericTypographic);
        SizeF result2 = grU.MeasureString(InputText, currentFont, new PointF(0, 0), new StringFormat(StringFormatFlags.MeasureTrailingSpaces));
        SizeF result3 = grU.MeasureString(InputText, currentFont, int.MaxValue, StringFormat.GenericTypographic);
        int resultInt = MeasureDisplayStringWidth(grU, InputText, currentFont);
        //return Math.Ceiling(size.Width);
        return Math.Ceiling(result2.Width);



    }
    catch (Exception ex)
    {
        logger4net.Error(ex);
        return 0;
    }

    return 0;
}

static public int MeasureDisplayStringWidth(Graphics graphics, string text, System.Drawing.Font font)
    {
        System.Drawing.StringFormat format = new System.Drawing.StringFormat();
        System.Drawing.RectangleF rect = new System.Drawing.RectangleF(0, 0, 1000, 1000);
        CharacterRange ranges = new System.Drawing.CharacterRange(0, text.Length);
        List<CharacterRange> RangesArray = new List<CharacterRange>();
        RangesArray.Add(ranges);
        System.Drawing.Region[] regions = new System.Drawing.Region[1];

        format.SetMeasurableCharacterRanges(RangesArray.ToArray());

        regions = graphics.MeasureCharacterRanges(text, font, rect, format);
        rect = regions[0].GetBounds(graphics);

        return (int)(rect.Right + 1.0f);
    }

在 getStingWith_mm 函数中,我得到了更多结果值来检查我的一种方法是否可以达到正确的值!

现在,如果我使用文本“test”启动此功能,字体 Arial 12,粗体。我得到了一个介于 21 到 25 毫米之间的返回值。但在打印输出上大约是 10 毫米 我不是我的错误。 stackoverflow 上的所有其他示例都可以与 MeasureString 一起使用,它应该可以工作......

我的大部分代码都是从以下帖子中获得的 how to measure width of a string precisely? How to determine width of a string when printed?

感谢任何建议!

【问题讨论】:

    标签: c# .net .net-2.0


    【解决方案1】:

    经过长时间的测试,我发现我无法用这两种方法测量得到准确的打印输出。 wo 这是我在 itextsharp 4.x 中使用的解决方案

    public double getStingWith_mm(string InputText, string Fontname, bool TypeBold, bool TypeItalic, double Fontsize)    
    {    
    
    try    
    {    
    
        string fontPathName = "";    
    
        // get parent of System folder to have Windows folder    
        DirectoryInfo dirWindowsFolder = Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.System));    
    
        // Concatenate Fonts folder onto Windows folder.    
        string strFontsFolder = Path.Combine(dirWindowsFolder.FullName, "Fonts");    
    
        // check fontname    
        // if Bold then search  font name + " Bold "    
        // if Italic then search font name + " Italic "    
        //only opentype fonts set the name to "-Italic" or "-Bold"    
        if ((TypeBold) && (TypeItalic))    
        {    
            fontPathName = fontsKey.GetValue(Fontname + " Bold Italic " + "(TrueType)", string.Empty) as string;    
        }    
        else if (TypeBold)    
        {    
            fontPathName = fontsKey.GetValue(Fontname + " Bold " + "(TrueType)", string.Empty) as string;    
        }    
        else if (TypeItalic)    
        {    
            fontPathName = fontsKey.GetValue(Fontname + " Italic " + "(TrueType)", string.Empty) as string;    
        }    
    
        //fallback to normal name if empty or normal font!    
        if (fontPathName == string.Empty)    
        {    
            fontPathName = fontsKey.GetValue(Fontname + " (TrueType)", string.Empty) as string;    
        }    
    
    
        // font for special characters!!!    
        string specialCharFontName = Path.Combine(strFontsFolder, fontPathName);    
        BaseFont specialCharBaseFont = BaseFont.CreateFont(specialCharFontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);    
    
    
    
        // setzen der Headline Fonts!    
        iTextSharp.text.Font currentITFont = null;    
        try    
        {    
            currentITFont = new iTextSharp.text.Font(    
                specialCharBaseFont,    
                (float)Fontsize,    
                iTextSharp.text.Font.NORMAL //set here bold or italic din't change the font measuement, so i set it in the fontname to load!    
                );    
        }    
        catch (Exception ex)    
        {    
            logger4net.Error("Font konnte nicht geladen werden: " + Fontname);    
        }    
    
    
        float returnvalue7 = currentITFont.GetCalculatedBaseFont(true).GetWidthPoint(InputText, (float)Fontsize);    
    
    
        double result4 = Utilities.PointsToMillimeters(returnvalue7);    
    
        return Math.Ceiling(result4);    
    
    
    
    }    
    catch (Exception ex)    
    {    
        logger4net.Error(ex);    
        return 0;    
    }    
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-31
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多