2017-05-08 6 views
0

우리는 RDLC 보고서에서 바코드 글꼴을 사용하는 응용 프로그램을 보유하고 있으며이를 VM에서 Azure 응용 프로그램 서비스 (이전의 웹 응용 프로그램)로 마이그레이션하려고합니다. 여기서 문제는 분명히 글꼴을 설치할 능력이 없다는 것입니다. RDLC가 GDI +를 사용하여 보고서를 렌더링했기 때문에 LocalReport에서 PrivateFontCollection의 일종을 설정할 수있는 메서드/속성을 찾을 수 있기를 기대했지만 벽돌 벽에 충돌했습니다.Azure 앱 서비스의 RDLC에서 타사 글꼴을 사용하려면 어떻게해야합니까?

  1. 일시적으로 글꼴을 설치하는 일반적인 방법이 있나요 :

    그래서 나는 그렇지 않으면 우리는 또 다른보고 솔루션을 마련 할 필요가있을 것이다, 나는이 알아 낸 얻을 도움이 될 몇 가지의 질문이있는 것 같아요. 현재 응용 프로그램에서 사용할 수있는 NET?
  2. LocalReport 개체에서 PrivateFontCollection을 지정하는 방법이 있습니까?

답변

1

RDLC 보고서는 성을 기준으로 글꼴을 참조하십시오. 써드 파티 폰트를 사용하려면 실제로 프로덕션 시스템에 폰트를 설치해야합니다.

다음은 SQL Server Reporting Services 팀의 피드백입니다.

The ReportViewer's rendering extensions do not support PrivateFontCollection.

는 해결 방법으로 개인 글꼴을 사용하지 않고 이미지로 바코드를 생성 할 수 및 RDLC 보고서에 이미지를 넣어. 다음은 바코드 이미지 파일을 생성하는 소스 코드 및 테스트 코드입니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     BarCodeGenerator barCode = new BarCodeGenerator("123456789"); 
     barCode.SaveImage("F:\\abc.jpeg"); 
    } 
} 

public class BarCodeGenerator 
{ 
    public BarCodeGenerator(string code, int barHeight = 200, int imageWidth = 420, int imageHeigth = 240) 
    { 
     _barCode = code; 
    } 

    public void SaveImage(string filePath) 
    { 
     Bitmap bmp = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

     Graphics g = Graphics.FromImage(bmp); 

     g.FillRectangle(Brushes.White, 0, 0, Width, Height); 

     String intercharacterGap = "0"; 
     String str = '*' + _barCode.ToUpper() + '*'; 
     int strLength = str.Length; 

     for (int i = 0; i < _barCode.Length; i++) 
     { 
      if (alphabet39.IndexOf(_barCode[i]) == -1 || _barCode[i] == '*') 
      { 
       g.DrawString("INVALID BAR CODE TEXT", new Font("Arial", 12), Brushes.Red, 10, 10); 
       return; 
      } 
     } 

     String encodedString = ""; 

     for (int i = 0; i < strLength; i++) 
     { 
      if (i > 0) 
       encodedString += intercharacterGap; 

      encodedString += coded39Char[alphabet39.IndexOf(str[i])]; 
     } 

     int encodedStringLength = encodedString.Length; 
     int widthOfBarCodeString = 0; 
     double wideToNarrowRatio = 3; 


     if (align != AlignType.Left) 
     { 
      for (int i = 0; i < encodedStringLength; i++) 
      { 
       if (encodedString[i] == '1') 
        widthOfBarCodeString += (int)(wideToNarrowRatio * (int)weight); 
       else 
        widthOfBarCodeString += (int)weight; 
      } 
     } 

     int x = 0; 
     int wid = 0; 
     int yTop = 0; 
     SizeF hSize = g.MeasureString(headerText, headerFont); 
     SizeF fSize = g.MeasureString(_barCode, footerFont); 

     int headerX = 0; 
     int footerX = 0; 

     if (align == AlignType.Left) 
     { 
      x = leftMargin; 
      headerX = leftMargin; 
      footerX = leftMargin; 
     } 
     else if (align == AlignType.Center) 
     { 
      x = (Width - widthOfBarCodeString)/2; 
      headerX = (Width - (int)hSize.Width)/2; 
      footerX = (Width - (int)fSize.Width)/2; 
     } 
     else 
     { 
      x = Width - widthOfBarCodeString - leftMargin; 
      headerX = Width - (int)hSize.Width - leftMargin; 
      footerX = Width - (int)fSize.Width - leftMargin; 
     } 

     if (showHeader) 
     { 
      yTop = (int)hSize.Height + topMargin; 
      g.DrawString(headerText, headerFont, Brushes.Black, headerX, topMargin); 
     } 
     else 
     { 
      yTop = topMargin; 
     } 

     for (int i = 0; i < encodedStringLength; i++) 
     { 
      if (encodedString[i] == '1') 
       wid = (int)(wideToNarrowRatio * (int)weight); 
      else 
       wid = (int)weight; 

      g.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, x, yTop, wid, height); 

      x += wid; 
     } 

     yTop += height; 

     if (showFooter) 
      g.DrawString(_barCode, footerFont, Brushes.Black, footerX, yTop); 

     g.Flush(); 
     using (FileStream stream = File.Create(filePath)) 
     { 
      bmp.Save(stream, ImageFormat.Jpeg); 
     } 
    } 

    private string alphabet39 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*"; 

    private string[] coded39Char = 
    { 
     /* 0 */ "000110100", 
     /* 1 */ "100100001", 
     /* 2 */ "001100001", 
     /* 3 */ "101100000", 
     /* 4 */ "000110001", 
     /* 5 */ "100110000", 
     /* 6 */ "001110000", 
     /* 7 */ "000100101", 
     /* 8 */ "100100100", 
     /* 9 */ "001100100", 
     /* A */ "100001001", 
     /* B */ "001001001", 
     /* C */ "101001000", 
     /* D */ "000011001", 
     /* E */ "100011000", 
     /* F */ "001011000", 
     /* G */ "000001101", 
     /* H */ "100001100", 
     /* I */ "001001100", 
     /* J */ "000011100", 
     /* K */ "100000011", 
     /* L */ "001000011", 
     /* M */ "101000010", 
     /* N */ "000010011", 
     /* O */ "100010010", 
     /* P */ "001010010", 
     /* Q */ "000000111", 
     /* R */ "100000110", 
     /* S */ "001000110", 
     /* T */ "000010110", 
     /* U */ "110000001", 
     /* V */ "011000001", 
     /* W */ "111000000", 
     /* X */ "010010001", 
     /* Y */ "110010000", 
     /* Z */ "011010000", 
     /* - */ "010000101", 
     /* . */ "110000100", 
     /*' '*/ "011000100", 
     /* $ */ "010101000", 
     /*/*/ "010100010", 
     /* + */ "010001010", 
     /* % */ "000101010", 
     /* * */ "010010100" 
    }; 

    public enum AlignType 
    { 
     Left, Center, Right 
    } 

    public enum BarCodeWeight 
    { 
     Small = 1, Medium, Large 
    } 

    private AlignType align = AlignType.Center; 
    private string _barCode = "1234567890"; 
    private int leftMargin = 10; 
    private int topMargin = 20; 
    private int height = 200; 
    private bool showHeader = false; 
    private bool showFooter = false; 
    private String headerText = "BarCode Demo"; 
    private BarCodeWeight weight = BarCodeWeight.Small; 
    private Font headerFont = new Font("Courier", 18); 
    private Font footerFont = new Font("Courier", 8); 

    private int _height = 240; 
    public int Height 
    { 
     get { return _height; } 
     set { _height = value; } 
    } 

    private int _width = 420; 
    public int Width 
    { 
     get { return _width; } 
     set { _width = value; } 
    } 
} 

위 코드에서 생성 된 바코드 이미지입니다.

enter image description here