Generar una imagen de código de barras personalizada
Un código de barras es una representación visual de datos en forma de líneas paralelas o patrones. Los códigos de barras se utilizan ampliamente en varias industrias como el comercio minorista, la logística, la salud, los servicios bancarios y muchas otras.
Microsoft Word permite a los usuarios incrustar códigos de barras directamente en documentos utilizando campos. Los usuarios pueden insertar un tipo específico de código de barras, como un código QR o un código lineal, utilizando el campo BARCODE.
En este artículo, examinaremos cómo se implementa el campo BARCODE en Aspose.Words y cómo Aspose.Words permite que los usuarios trabajen con documentos de Word a los que ya se ha añadido un código de barras.
Tipos de códigos de barras admitidos por Aspose.Words
Aspose.Words admite varios tipos de códigos de barras. El tipo de código de barras se pasa como un valor de cadena en la propiedad BarcodeType.
Al guardar en formatos de Word que admiten códigos de barras, puede utilizar cualquier tipo de código de barras que sea supported by Microsoft Word. Si se pasa un tipo incorrecto de código de barras, Word mostrará un error.
Al guardar en otros formatos, como PDF, Aspose.Words delega el renderizado de códigos de barras en el código del usuario, por lo que el usuario se limita a los tipos de códigos de barras de su implementación o biblioteca utilizada.
Inserte un código de barras en un documento o cargue un documento con un código de barras añadido
Aspose.Words ofrece la capacidad de:
- Inserte programáticamente un código de barras en un documento usando los códigos DisplayBarcode y MergeBarcode
- O cargar un documento de Word con códigos de barras ya insertados en él para un mayor trabajo
Aspose.Words tiene una interfaz para generar códigos de barras personalizados que lo hace fácil de usar Aspose.Words y Aspose.BarCode juntos para representar imágenes de códigos de barras en documentos de salida. Por ejemplo, puede crear un documento DOC, OOXML o RTF y agregar el campo DISPLAYBARCODE a él usando Aspose.Words. O puede cargar un documento DOC, OOXML o RTF con el campo DISPLAYBARCODE ya existente en ella y proporcionar su implementación personalizada del generador de códigos de barras.
Un campo tipico de DISPLAYBARCODE tiene la siguiente sintaxis:
{ DISPLAYBARCODE "SomeData" QR \h 720 }
A continuación se muestra un ejemplo de generador de código utilizando Aspose.Words y los códigos Aspose. Barcode API. Este ejemplo muestra cómo insertar imágenes de código de barras en la posición de campo DISPLAYBARCODE en un documento de Word:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Field sample - BARCODE.docx"); | |
doc.FieldOptions.BarcodeGenerator = new CustomBarcodeGenerator(); | |
doc.Save(ArtifactsDir + "WorkingWithBarcodeGenerator.BarcodeGenerator.pdf"); |
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
internal class CustomBarcodeGeneratorUtils | |
{ | |
/// <summary> | |
/// Converts a height value in twips to pixels using a default DPI of 96. | |
/// </summary> | |
/// <param name="heightInTwips">The height value in twips.</param> | |
/// <param name="defVal">The default value to return if the conversion fails.</param> | |
/// <returns>The height value in pixels.</returns> | |
public static double TwipsToPixels(string heightInTwips, double defVal) | |
{ | |
return TwipsToPixels(heightInTwips, 96, defVal); | |
} | |
/// <summary> | |
/// Converts a height value in twips to pixels based on the given resolution. | |
/// </summary> | |
/// <param name="heightInTwips">The height value in twips to be converted.</param> | |
/// <param name="resolution">The resolution in pixels per inch.</param> | |
/// <param name="defVal">The default value to be returned if the conversion fails.</param> | |
/// <returns>The converted height value in pixels.</returns> | |
public static double TwipsToPixels(string heightInTwips, double resolution, double defVal) | |
{ | |
try | |
{ | |
int lVal = int.Parse(heightInTwips); | |
return (lVal / 1440.0) * resolution; | |
} | |
catch | |
{ | |
return defVal; | |
} | |
} | |
/// <summary> | |
/// Gets the rotation angle in degrees based on the given rotation angle string. | |
/// </summary> | |
/// <param name="rotationAngle">The rotation angle string.</param> | |
/// <param name="defVal">The default value to return if the rotation angle is not recognized.</param> | |
/// <returns>The rotation angle in degrees.</returns> | |
public static float GetRotationAngle(string rotationAngle, float defVal) | |
{ | |
switch (rotationAngle) | |
{ | |
case "0": | |
return 0; | |
case "1": | |
return 270; | |
case "2": | |
return 180; | |
case "3": | |
return 90; | |
default: | |
return defVal; | |
} | |
} | |
/// <summary> | |
/// Converts a string representation of an error correction level to a QRErrorLevel enum value. | |
/// </summary> | |
/// <param name="errorCorrectionLevel">The string representation of the error correction level.</param> | |
/// <param name="def">The default error correction level to return if the input is invalid.</param> | |
/// <returns>The corresponding QRErrorLevel enum value.</returns> | |
public static QRErrorLevel GetQRCorrectionLevel(string errorCorrectionLevel, QRErrorLevel def) | |
{ | |
switch (errorCorrectionLevel) | |
{ | |
case "0": | |
return QRErrorLevel.LevelL; | |
case "1": | |
return QRErrorLevel.LevelM; | |
case "2": | |
return QRErrorLevel.LevelQ; | |
case "3": | |
return QRErrorLevel.LevelH; | |
default: | |
return def; | |
} | |
} | |
/// <summary> | |
/// Gets the barcode encode type based on the given encode type from Word. | |
/// </summary> | |
/// <param name="encodeTypeFromWord">The encode type from Word.</param> | |
/// <returns>The barcode encode type.</returns> | |
public static SymbologyEncodeType GetBarcodeEncodeType(string encodeTypeFromWord) | |
{ | |
// https://support.microsoft.com/en-au/office/field-codes-displaybarcode-6d81eade-762d-4b44-ae81-f9d3d9e07be3 | |
switch (encodeTypeFromWord) | |
{ | |
case "QR": | |
return EncodeTypes.QR; | |
case "CODE128": | |
return EncodeTypes.Code128; | |
case "CODE39": | |
return EncodeTypes.Code39; | |
case "JPPOST": | |
return EncodeTypes.RM4SCC; | |
case "EAN8": | |
case "JAN8": | |
return EncodeTypes.EAN8; | |
case "EAN13": | |
case "JAN13": | |
return EncodeTypes.EAN13; | |
case "UPCA": | |
return EncodeTypes.UPCA; | |
case "UPCE": | |
return EncodeTypes.UPCE; | |
case "CASE": | |
case "ITF14": | |
return EncodeTypes.ITF14; | |
case "NW7": | |
return EncodeTypes.Codabar; | |
default: | |
return EncodeTypes.None; | |
} | |
} | |
/// <summary> | |
/// Converts a hexadecimal color string to a Color object. | |
/// </summary> | |
/// <param name="inputColor">The hexadecimal color string to convert.</param> | |
/// <param name="defVal">The default Color value to return if the conversion fails.</param> | |
/// <returns>The Color object representing the converted color, or the default value if the conversion fails.</returns> | |
public static Color ConvertColor(string inputColor, Color defVal) | |
{ | |
if (string.IsNullOrEmpty(inputColor)) return defVal; | |
try | |
{ | |
int color = Convert.ToInt32(inputColor, 16); | |
// Return Color.FromArgb((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF); | |
return Color.FromArgb(color & 0xFF, (color >> 8) & 0xFF, (color >> 16) & 0xFF); | |
} | |
catch | |
{ | |
return defVal; | |
} | |
} | |
/// <summary> | |
/// Calculates the scale factor based on the provided string representation. | |
/// </summary> | |
/// <param name="scaleFactor">The string representation of the scale factor.</param> | |
/// <param name="defVal">The default value to return if the scale factor cannot be parsed.</param> | |
/// <returns> | |
/// The scale factor as a decimal value between 0 and 1, or the default value if the scale factor cannot be parsed. | |
/// </returns> | |
public static double ScaleFactor(string scaleFactor, double defVal) | |
{ | |
try | |
{ | |
int scale = int.Parse(scaleFactor); | |
return scale / 100.0; | |
} | |
catch | |
{ | |
return defVal; | |
} | |
} | |
/// <summary> | |
/// Sets the position code style for a barcode generator. | |
/// </summary> | |
/// <param name="gen">The barcode generator.</param> | |
/// <param name="posCodeStyle">The position code style to set.</param> | |
/// <param name="barcodeValue">The barcode value.</param> | |
public static void SetPosCodeStyle(BarcodeGenerator gen, string posCodeStyle, string barcodeValue) | |
{ | |
switch (posCodeStyle) | |
{ | |
// STD default and without changes. | |
case "SUP2": | |
gen.CodeText = barcodeValue.Substring(0, barcodeValue.Length - 2); | |
gen.Parameters.Barcode.Supplement.SupplementData = barcodeValue.Substring(barcodeValue.Length - 2, 2); | |
break; | |
case "SUP5": | |
gen.CodeText = barcodeValue.Substring(0, barcodeValue.Length - 5); | |
gen.Parameters.Barcode.Supplement.SupplementData = barcodeValue.Substring(barcodeValue.Length - 5, 5); | |
break; | |
case "CASE": | |
gen.Parameters.Border.Visible = true; | |
gen.Parameters.Border.Color = gen.Parameters.Barcode.BarColor; | |
gen.Parameters.Border.DashStyle = BorderDashStyle.Solid; | |
gen.Parameters.Border.Width.Pixels = gen.Parameters.Barcode.XDimension.Pixels * 5; | |
break; | |
} | |
} | |
public const double DefaultQRXDimensionInPixels = 4.0; | |
public const double Default1DXDimensionInPixels = 1.0; | |
/// <summary> | |
/// Draws an error image with the specified exception message. | |
/// </summary> | |
/// <param name="error">The exception containing the error message.</param> | |
/// <returns>A Bitmap object representing the error image.</returns> | |
public static Bitmap DrawErrorImage(Exception error) | |
{ | |
Bitmap bmp = new Bitmap(100, 100); | |
using (Graphics grf = Graphics.FromImage(bmp)) | |
#if NET5_0_OR_GREATER | |
grf.DrawString(error.Message, new Aspose.Drawing.Font("Microsoft Sans Serif", 8f, FontStyle.Regular), Brushes.Red, new Rectangle(0, 0, bmp.Width, bmp.Height)); | |
#else | |
grf.DrawString(error.Message, new System.Drawing.Font("Microsoft Sans Serif", 8f, FontStyle.Regular), Brushes.Red, new Rectangle(0, 0, bmp.Width, bmp.Height)); | |
#endif | |
return bmp; | |
} | |
#if NET5_0_OR_GREATER | |
public static SKBitmap ConvertImageToWord(Bitmap bmp) | |
{ | |
MemoryStream ms = new MemoryStream(); | |
bmp.Save(ms, ImageFormat.Png); | |
ms.Position = 0; | |
return SKBitmap.Decode(ms); | |
} | |
#else | |
public static Image ConvertImageToWord(Bitmap bmp) | |
{ | |
return bmp; | |
} | |
#endif | |
} | |
internal class CustomBarcodeGenerator : IBarcodeGenerator | |
{ | |
#if NET5_0_OR_GREATER | |
public SKBitmap GetBarcodeImage(Aspose.Words.Fields.BarcodeParameters parameters) | |
#else | |
public Image GetBarcodeImage(Aspose.Words.Fields.BarcodeParameters parameters) | |
#endif | |
{ | |
try | |
{ | |
BarcodeGenerator gen = new BarcodeGenerator(CustomBarcodeGeneratorUtils.GetBarcodeEncodeType(parameters.BarcodeType), parameters.BarcodeValue); | |
// Set color. | |
gen.Parameters.Barcode.BarColor = CustomBarcodeGeneratorUtils.ConvertColor(parameters.ForegroundColor, gen.Parameters.Barcode.BarColor); | |
gen.Parameters.BackColor = CustomBarcodeGeneratorUtils.ConvertColor(parameters.BackgroundColor, gen.Parameters.BackColor); | |
// Set display or hide text. | |
if (!parameters.DisplayText) | |
gen.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.None; | |
else | |
gen.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below; | |
// Set QR Code error correction level.s | |
gen.Parameters.Barcode.QR.QrErrorLevel = QRErrorLevel.LevelH; | |
if (!string.IsNullOrEmpty(parameters.ErrorCorrectionLevel)) | |
gen.Parameters.Barcode.QR.QrErrorLevel = CustomBarcodeGeneratorUtils.GetQRCorrectionLevel(parameters.ErrorCorrectionLevel, gen.Parameters.Barcode.QR.QrErrorLevel); | |
// Set rotation angle. | |
if (!string.IsNullOrEmpty(parameters.SymbolRotation)) | |
gen.Parameters.RotationAngle = CustomBarcodeGeneratorUtils.GetRotationAngle(parameters.SymbolRotation, gen.Parameters.RotationAngle); | |
// Set scaling factor. | |
double scalingFactor = 1; | |
if (!string.IsNullOrEmpty(parameters.ScalingFactor)) | |
scalingFactor = CustomBarcodeGeneratorUtils.ScaleFactor(parameters.ScalingFactor, scalingFactor); | |
// Set size. | |
if (gen.BarcodeType == EncodeTypes.QR) | |
gen.Parameters.Barcode.XDimension.Pixels = (float)Math.Max(1.0, Math.Round(CustomBarcodeGeneratorUtils.DefaultQRXDimensionInPixels * scalingFactor)); | |
else | |
gen.Parameters.Barcode.XDimension.Pixels = (float)Math.Max(1.0, Math.Round(CustomBarcodeGeneratorUtils.Default1DXDimensionInPixels * scalingFactor)); | |
//Set height. | |
if (!string.IsNullOrEmpty(parameters.SymbolHeight)) | |
gen.Parameters.Barcode.BarHeight.Pixels = (float)Math.Max(5.0, Math.Round(CustomBarcodeGeneratorUtils.TwipsToPixels(parameters.SymbolHeight, gen.Parameters.Barcode.BarHeight.Pixels) * scalingFactor)); | |
// Set style of a Point-of-Sale barcode. | |
if (!string.IsNullOrEmpty(parameters.PosCodeStyle)) | |
CustomBarcodeGeneratorUtils.SetPosCodeStyle(gen, parameters.PosCodeStyle, parameters.BarcodeValue); | |
return CustomBarcodeGeneratorUtils.ConvertImageToWord(gen.GenerateBarCodeImage()); | |
} | |
catch (Exception e) | |
{ | |
return CustomBarcodeGeneratorUtils.ConvertImageToWord(CustomBarcodeGeneratorUtils.DrawErrorImage(e)); | |
} | |
} | |
#if NET5_0_OR_GREATER | |
public SKBitmap GetOldBarcodeImage(Aspose.Words.Fields.BarcodeParameters parameters) | |
#else | |
public Image GetOldBarcodeImage(Aspose.Words.Fields.BarcodeParameters parameters) | |
#endif | |
{ | |
throw new NotImplementedException(); | |
} | |
} |
También puede guardar el documento con el código de barras cargado o recién insertado en formatos fijos de página, como PDF, XPS, etc. El siguiente ejemplo de código muestra cómo guardar un documento de Word en formato PDF:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Document.docx"); | |
doc.Save(ArtifactsDir + "BaseConversions.DocxToPdf.pdf"); |
Especifique opciones de código de barras
Cuando se trabaja con códigos de barras, puede establecer algunas propiedades adicionales. Aspose.Words le proporciona la clase BarcodeParameters - clase para parámetros de código de barras para pasar a través de GeneradorDeCódigosDeBarras".
Aspose.Words admite la resolución entrelazada de 96 ppi para las imágenes generadas con IBarcodeGenerator, lo que limita el tamaño mínimo de una imagen de código de barras. Para abordar esto, los desarrolladores pueden insertar manualmente imágenes de código de barras con la resolución objetivo en un documento de Word y guardarlos en el formato requerido. Para más detalles y ejemplos sobre cómo trabajar con códigos de barras, consulte el artículo Create Custom Barcodes with IBarcodeGenerator.