Tạo một hình mã vạch tùy chỉnh
Mã vạch là sự thể hiện thị giác của dữ liệu dưới dạng các đường song song hoặc mô hình. Mã vạch được sử dụng phổ biến trong nhiều ngành công nghiệp khác nhau như bán lẻ, hậu cần, y tế, ngân hàng và nhiều ngành khác.
Microsoft Word cho phép người dùng nhúng mã vạch trực tiếp vào tài liệu bằng cách sử dụng các trường. Người dùng có thể chèn một loại mã vạch cụ thể, chẳng hạn như mã QR hoặc mã vạch tuyến tính, bằng trường BARCODE.
Trong bài viết này, chúng ta sẽ xem cách thực hiện trường mã vạch trong Aspose.Words và cách Aspose.Words cho phép người dùng làm việc với các tài liệu Word đã có mã vạch đã được thêm vào.
Loại mã vạch được hỗ trợ bởi Aspose.Words
Aspose.Words hỗ trợ các loại mã vạch khác nhau. Loại mã vạch được truyền dưới dạng giá trị chuỗi trong thuộc tính BarcodeType.
Khi lưu sang các định dạng Word hỗ trợ mã vạch, bạn có thể sử dụng mọi loại mã vạch là supported by Microsoft Word. Nếu một loại mã vạch không chính xác được truyền, Word sẽ hiển thị lỗi.
Khi lưu sang các định dạng khác, như PDF, Aspose.Words ủy quyền cho mã người dùng xử lý mã vạch, vì vậy người dùng bị giới hạn với loại mã vạch của thực hiện hoặc thư viện của họ.
Chèn mã vạch vào tài liệu hoặc tải một tài liệu với mã vạch đã thêm
Aspose.Words cung cấp khả năng:
- Chèn mã vạch vào một tài liệu bằng cách sử dụng các mã DisplayBarcode và MergeBarcode
- Hoặc tải một tài liệu word với mã vạch đã được chèn sẵn để làm việc thêm
Aspose.Words có một giao diện để tạo mã vạch tùy chỉnh mà làm cho nó dễ dàng để sử dụng Aspose.Words và Aspose.BarCode cùng nhau để hiển thị hình ảnh mã vạch trong các tài liệu đầu ra. Ví dụ, bạn có thể tạo một tài liệu DOC, OOXML hoặc RTF và thêm trường DISPLAYBARCODE bằng cách sử dụng Aspose.Words. Hoặc bạn có thể tải một tài liệu DOC, OOXML hoặc RTF với trường “DISPLAYBARCODE” đã tồn tại trong nó và cung cấp thực hiện của bạn về bộ mã tạo mã thông báo tùy chỉnh.
Một trường DISPLAYBARCODE điển hình có cú pháp sau:
{ DISPLAYBARCODE "SomeData" QR \h 720 }
Dưới đây là ví dụ về bộ tạo mã sử dụng các API Aspose.Words và Aspose.BarCode. Ví dụ này cho thấy cách chèn ảnh mã vạch vào vị trí trường DISPLAYBARCODE trong tài liệu Word:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(getMyDir() + "Field sample - BARCODE.docx"); | |
doc.getFieldOptions().setBarcodeGenerator(new CustomBarcodeGenerator()); | |
doc.save(getArtifactsDir() + "WorkingWithBarcodeGenerator.GenerateACustomBarCodeImage.pdf"); |
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
public class CustomBarcodeGenerator extends DocsExamplesBase implements IBarcodeGenerator | |
{ | |
/// <summary> | |
/// Converts barcode image height from Word units to Aspose.BarCode units. | |
/// </summary> | |
/// <param name="heightInTwipsString"></param> | |
/// <returns></returns> | |
private static float convertSymbolHeight(String heightInTwipsString) throws Exception { | |
// Input value is in 1/1440 inches (twips). | |
int heightInTwips = tryParseInt(heightInTwipsString); | |
if (heightInTwips == Integer.MIN_VALUE) | |
throw new Exception("Error! Incorrect height - " + heightInTwipsString + "."); | |
// Convert to mm. | |
return (float) (heightInTwips * 25.4 / 1440.0); | |
} | |
/// <summary> | |
/// Converts barcode image color from Word to Aspose.BarCode. | |
/// </summary> | |
/// <param name="inputColor"></param> | |
/// <returns></returns> | |
private static Color convertColor(String inputColor) throws Exception { | |
// Input should be from "0x000000" to "0xFFFFFF". | |
int color = tryParseHex(inputColor.replace("0x", "")); | |
if (color == Integer.MIN_VALUE) | |
throw new Exception("Error! Incorrect color - " + inputColor + "."); | |
return new Color((color >> 16), ((color & 0xFF00) >> 8), (color & 0xFF)); | |
// Backward conversion - | |
// return string.Format("0x{0,6:X6}", mControl.ForeColor.ToArgb() & 0xFFFFFF); | |
} | |
/// <summary> | |
/// Converts bar code scaling factor from percent to float. | |
/// </summary> | |
/// <param name="scalingFactor"></param> | |
/// <returns></returns> | |
private static float convertScalingFactor(String scalingFactor) throws Exception { | |
boolean isParsed = false; | |
int percent = tryParseInt(scalingFactor); | |
if (percent != Integer.MIN_VALUE && percent >= 10 && percent <= 10000) | |
isParsed = true; | |
if (!isParsed) | |
throw new Exception("Error! Incorrect scaling factor - " + scalingFactor + "."); | |
return percent / 100.0f; | |
} | |
/// <summary> | |
/// Implementation of the GetBarCodeImage() method for IBarCodeGenerator interface. | |
/// </summary> | |
/// <param name="parameters"></param> | |
/// <returns></returns> | |
public BufferedImage getBarcodeImage(BarcodeParameters parameters) throws Exception { | |
if (parameters.getBarcodeType() == null || parameters.getBarcodeValue() == null) | |
return null; | |
BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.QR); | |
String type = parameters.getBarcodeType().toUpperCase(); | |
switch (type) | |
{ | |
case "QR": | |
generator = new BarcodeGenerator(EncodeTypes.QR); | |
break; | |
case "CODE128": | |
generator = new BarcodeGenerator(EncodeTypes.CODE_128); | |
break; | |
case "CODE39": | |
generator = new BarcodeGenerator(EncodeTypes.CODE_39_STANDARD); | |
break; | |
case "EAN8": | |
generator = new BarcodeGenerator(EncodeTypes.EAN_8); | |
break; | |
case "EAN13": | |
generator = new BarcodeGenerator(EncodeTypes.EAN_13); | |
break; | |
case "UPCA": | |
generator = new BarcodeGenerator(EncodeTypes.UPCA); | |
break; | |
case "UPCE": | |
generator = new BarcodeGenerator(EncodeTypes.UPCE); | |
break; | |
case "ITF14": | |
generator = new BarcodeGenerator(EncodeTypes.ITF_14); | |
break; | |
case "CASE": | |
generator = new BarcodeGenerator(EncodeTypes.NONE); | |
break; | |
} | |
if (generator.getBarcodeType().equals(EncodeTypes.NONE)) | |
return null; | |
generator.setCodeText(parameters.getBarcodeValue()); | |
if (generator.getBarcodeType().equals(EncodeTypes.QR)) | |
generator.getParameters().getBarcode().getCodeTextParameters().setTwoDDisplayText(parameters.getBarcodeValue()); | |
if (parameters.getForegroundColor() != null) | |
generator.getParameters().getBarcode().setBarColor(convertColor(parameters.getForegroundColor())); | |
if (parameters.getBackgroundColor() != null) | |
generator.getParameters().setBackColor(convertColor(parameters.getBackgroundColor())); | |
if (parameters.getSymbolHeight() != null) | |
{ | |
generator.getParameters().getImageHeight().setPixels(convertSymbolHeight(parameters.getSymbolHeight())); | |
generator.getParameters().setAutoSizeMode(AutoSizeMode.NONE); | |
} | |
generator.getParameters().getBarcode().getCodeTextParameters().setLocation(CodeLocation.NONE); | |
if (parameters.getDisplayText()) | |
generator.getParameters().getBarcode().getCodeTextParameters().setLocation(CodeLocation.BELOW); | |
generator.getParameters().getCaptionAbove().setText(""); | |
// Empiric scaling factor for converting Word barcode to Aspose.BarCode. | |
final float SCALE = 2.4f; | |
float xdim = 1.0f; | |
if (generator.getBarcodeType().equals(EncodeTypes.QR)) | |
{ | |
generator.getParameters().setAutoSizeMode(AutoSizeMode.NEAREST); | |
generator.getParameters().getImageWidth().setInches(generator.getParameters().getImageWidth().getInches() * SCALE); | |
generator.getParameters().getImageHeight().setInches(generator.getParameters().getImageWidth().getInches()); | |
xdim = generator.getParameters().getImageHeight().getInches() / 25; | |
generator.getParameters().getBarcode().getXDimension().setInches(xdim); | |
generator.getParameters().getBarcode().getBarHeight().setInches(xdim); | |
} | |
if (parameters.getScalingFactor() != null) | |
{ | |
float scalingFactor = convertScalingFactor(parameters.getScalingFactor()); | |
generator.getParameters().getImageHeight().setInches(generator.getParameters().getImageHeight().getInches() * scalingFactor); | |
if (generator.getBarcodeType().equals(EncodeTypes.QR)) | |
{ | |
generator.getParameters().getImageWidth().setInches(generator.getParameters().getImageHeight().getInches()); | |
generator.getParameters().getBarcode().getXDimension().setInches(xdim * scalingFactor); | |
generator.getParameters().getBarcode().getBarHeight().setInches(xdim * scalingFactor); | |
} | |
generator.getParameters().setAutoSizeMode(AutoSizeMode.NONE); | |
} | |
return generator.generateBarCodeImage(); | |
} | |
/// <summary> | |
/// Implementation of the GetOldBarcodeImage() method for IBarCodeGenerator interface. | |
/// </summary> | |
/// <param name="parameters"></param> | |
/// <returns></returns> | |
public BufferedImage getOldBarcodeImage(BarcodeParameters parameters) | |
{ | |
if (parameters.getPostalAddress() == null) | |
return null; | |
BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.POSTNET); | |
{ | |
generator.setCodeText(parameters.getPostalAddress()); | |
} | |
return generator.generateBarCodeImage(); | |
} | |
/// <summary> | |
/// Parses an integer using the invariant culture. Returns Int.MinValue if cannot parse. | |
/// | |
/// Allows leading sign. | |
/// Allows leading and trailing spaces. | |
/// </summary> | |
public static int tryParseInt(String s) { | |
try { | |
double value = Double.parseDouble(s); | |
return castDoubleToInt(value); | |
} catch (NumberFormatException e) { | |
return Integer.MIN_VALUE; | |
} | |
} | |
/// <summary> | |
/// Casts a double to int32 in a way that uint32 are "correctly" casted too (they become negative numbers). | |
/// </summary> | |
public static int castDoubleToInt(double value) | |
{ | |
long temp = (long) value; | |
return (int) temp; | |
} | |
/// <summary> | |
/// Try parses a hex String into an integer value. | |
/// on error return int.MinValue | |
/// </summary> | |
public static int tryParseHex(String s) | |
{ | |
try { | |
return Integer.parseInt(s); | |
} catch (NumberFormatException e) { | |
return Integer.MIN_VALUE; | |
} | |
} | |
} |
Bạn cũng có thể lưu tài liệu với mã vạch đã tải hoặc đã chèn mới trong các định dạng trang cố định như PDF, XPS, v.v… Ví dụ mã sau cho thấy cách lưu một tài liệu Word sang định dạng PDF:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(getMyDir() + "Document.docx"); | |
doc.save(getArtifactsDir() + "BaseConversions.DocxToPdf.pdf"); |
Chỉ định các tùy chọn mã vạch
Khi làm việc với mã vạch bạn có thể thiết lập một số thuộc tính bổ sung. Aspose.Words cung cấp cho bạn lớp BarcodeParameters - lớp cho các tham số mã vạch để truyền qua BarcodeGenerator".
Aspose.Words hỗ trợ độ phân giải nhúng 96 ppi cho hình ảnh được tạo ra với IBarcodeGenerator, điều này giới hạn kích thước tối thiểu của một hình ảnh mã vạch. Để giải quyết vấn đề này, các nhà phát triển có thể chèn thủ công hình ảnh mã vạch với độ phân giải mục tiêu vào tài liệu Word và lưu chúng ở định dạng cần thiết. Để biết thêm chi tiết và ví dụ về cách làm việc với mã vạch, xem bài viết Read Barcodes from Word Documents.