2017-05-08 6 views
0

RDLCレポート内にバーコードフォントを使用するアプリケーションがあり、これをVMからAzureアプリケーションサービス(以前のWebアプリケーション)に移行したいと考えています。ここでの問題は明らかにフォントをインストールする能力がないことです。 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

関連する問題