یک تصویر بارکد سفارشی تولید کنید

بارکد یک نمایش بصری داده‌ها به صورت خطوط موازی یا الگوها است. بارکدها در صنایع مختلفی مانند خرده فروشی، لجستیک، بهداشت و درمان، بانکداری و بسیاری دیگر استفاده می‌شوند.

Microsoft Word به کاربران اجازه می دهد تا بارکد را مستقیماً در اسناد با استفاده از فیلدها قرار دهند. کاربران می توانند یک نوع خاص از بارکد مانند یک کد QR یا یک بارکد خطی را با استفاده از فیلد BARCODE وارد کنند.

در این مقاله، ما به نحوه پیاده‌سازی فیلد بارکد در Aspose.Words و چگونگی کمک Aspose.Words به کاربران برای کار با اسناد وردی که قبلاً بارکد به آنها اضافه شده نگاه خواهیم کرد.

انواع بارکد که Aspose.Words پشتیبانی می‌کند

Aspose.Words از انواع مختلفی از بارکد پشتیبانی می کند. نوع بارکد به عنوان یک مقدار رشته ای در خاصیت BarcodeType ارسال می شود.

هنگام ذخیره کردن در قالب‌های ورد که از بارکد پشتیبانی می‌کنند، شما می‌توانید هر نوع بارکدی را که supported by Microsoft Word است استفاده کنید. اگر یک نوع نادرست از بارکد وارد شده باشد، ورد خطایی را نشان خواهد داد.

وقتی به دیگر فرمت‌ها مانند PDF ذخیره می‌کنید، Aspose.Words رندر کردن بارکد را به کد کاربر تفویض می‌کند، بنابراین کاربر فقط محدود به انواع بارکد پیاده‌سازی یا کتابخانه‌ای است که استفاده می‌کند.

یک بارکد را در یک سند قرار دهید یا یک سند با یک بارکد اضافه شده بارگذاری کنید

Aspose.Words فراهم می کند توانایی:

۱. به‌صورت برنامه‌ای یک بارکد را در یک سند با استفاده از کدهای DisplayBarcode و MergeBarcode وارد کنید ۲- یا یک سند ورد با بارکدهای موجود در آن برای کار بیشتر

Aspose.Words دارای یک واسط برای تولید بارکدهای سفارشی است که استفاده از “Aspose.Words” و “Aspose.BarCode” را در کنار هم آسان می کند تا تصاویر بارکد را در اسناد خروجی ایجاد کند. به عنوان مثال، شما می توانید یک سند DOC، OOXML یا RTF ایجاد کنید و با استفاده از “Aspose.Words” فیلد DISPLAYBARCODE را به آن اضافه کنید. یا شما می توانید یک سند DOC، OOXML یا RTF را بارگذاری کنید که در آن فیلد DISPLAYBARCODE قبلاً وجود دارد و پیاده سازی سفارشی خود را برای تولید کننده بارکد ارائه دهید.

یک فیلد tipical DISPLAYBARCODE دارای ساختاری زیر است:

{ DISPLAYBARCODE "SomeData" QR \h 720 }

در زیر یک مثال از تولیدکننده کد با استفاده از Aspose.Words و Aspose.Barcode API نشان داده شده است. این مثال نحوه قرار دادن تصاویر بارکد در موقعیت “DISPLAYBARCODE” را در سند ورد نشان می دهد:

// 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();
}
}

شما همچنین می‌توانید سند را با بارگذاری یا وارد کردن جدید کدهای بار، در قالب‌های صفحه ثابت مانند PDF، XPS و غیره ذخیره کنید. مثال کد زیر نشان می‌دهد که چگونه یک سند ورد را به قالب 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");
view raw docx-to-pdf.cs hosted with ❤ by GitHub

گزینه های بارکد را مشخص کنید

هنگام کار با بارکد‌ها، می‌توانید برخی ویژگی‌های اضافی را تنظیم کنید. Aspose.Words به شما کلاس BarcodeParameters - کلاس پارامترهای بارکد را برای ارسال به BarcodeGenerator ارائه می‌دهد.

Aspose.Words پشتیبانی از تصاویر با رزولوشن 96 ppi را برای تصاویری که با IBarcodeGenerator ایجاد شده اند، فراهم می کند و اندازه حداقل یک تصویر بارکد را محدود می کند. برای حل این مشکل، توسعه دهندگان می توانند به صورت دستی تصاویر بارکد با رزنولوی هدف را در یک سند ورد قرار داده و آن ها را در قالب مورد نیاز ذخیره کنند. برای جزئیات بیشتر و مثال هایی درباره چگونگی کار با بارکدها، مقاله Create Custom Barcodes with IBarcodeGenerator را بخوانید.