PrivateFontCollection sobre WindowsAzure

Usualmente usamos a fonte “Free 3 Of 9” para os projetos. O motivo disso é muito simples: é moleza… ou era.

Background geral

Os códigos de barras foram uma invenção realmente genial. Existem diversos tipos de códigos, um dos mais simples e práticos é o “3 of 9” ou “código 39” (é, eu sei ele tem seus problemas mas é free).

O que provavelmente os inventores não pensavam é que 40 anos depois usaríamos este sistema para identificar outras coisas, como vouchers de compras, inscrições em eventos e tantas outras coisas :).

Em c# é comum usarmos a classe System.Drawing.Graphics quando precisamos manipular imagens, com ela é possível, por exemplo, escrever uma string sobre uma imagem – você poderia usar para gerar marcas de créditos em suas imagens ou criar miniaturas e imagens. Porém essa função tem um pequeno problema, ao usar o método de escrita de texto ele vai por padrão usar as fontes do sistema e nenhum sistema que eu conheço vem com fontes de códigos de barras.

Alternativamente o .Net contém uma classe chamada PrivateFontCollection, feita justamente para carregar fontes que não estão no sistema e usá-las com o Graphics.

Recentemente precisei disponibilizar um gerador de códigos de barras em Windows Azure, e me deparei com o seguinte problema: como subir um arquivo .ttf junto com o package do Azure? Geralmente ao criar a PrivateFontCollection e inserir as fontes temos que passar um caminho dentro do sistema, o que não seria possível sem inserir o arquivo no package.

Para de enrolar e mostra o código

Este post (en-us) já explica bem o que precisava fazer e a abordagem aplicada, entretanto o meu problema não estava aqui e sim em conseguir subir a fonte do código de barras, coisa simples quando usamos qualquer solução de hosting que não seja Windows Azure. Creio que (não, eu não pesquisei) por segurança a ferramenta não permita isso.

“Mas você poderia usar o Remote Desktop e copiar a fonte pra lá, não?”

Não pois se o host reiniciasse a maquina virtual adeus fonte e olá códigos impressos em Arial.

A alternativa que encontrei é mais simples do que esperava. Resources.

Inseri a fonte como um resource no VS (Proprierties do projeto, resources, add resource file, add resource (setinha), add existing file) e carreguei a fonte como PrivateFontCollection. Veja abaixo o código para fazê-lo.

private static PrivateFontCollection carregarFonte()
{
PrivateFontCollection saida = new PrivateFontCollection();

byte[] font = Properties.Resources.FREE3OF9;

var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(font, 0);

saida.AddMemoryFont(ptr, font.Length);

return saida;
}

O código que gera as barras ficou assim:

Bitmap saida = new Bitmap(355, 45);

Graphics graph = Graphics.FromImage(saida);

graph.Clear(Color.White);

graph.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;

PrivateFontCollection fonts = carregarFonte();

Font fonteDoBarcode = new Font(fonts.Families[0], 40, FontStyle.Regular, GraphicsUnit.Point);

graph.DrawString(p, fonteDoBarcode, new SolidBrush(Color.Black), new PointF(0, 0));

E pronto, códigos gerados, sistema operante. Até a próxima!

Para saber mais:

Código de barras – http://pt.wikipedia.org/wiki/C%C3%B3digo_de_barras

PrivateFontCollection – http://msdn.microsoft.com/en-us/library/ms533820(v=vs.85).aspx

Advertisements

One thought on “PrivateFontCollection sobre WindowsAzure

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s