因爲超過 128 的 ASCII 碼對
應的特殊字符在 PL/SQL 中沒法顯示,但是在 128 碼中使用這些字符做爲 128 碼的
起始終止位以及校驗位。編碼的過程放在 PL/SQL 端實現並生成 XML 數據結合模板
生成條碼較難實現。改變思路,咱們把編碼過程放在 JAVA 類中。經過在結合模板
時調用生成 128 碼就可以實現條碼的生成和打印。html
在《Oracle XML Publisher
Administration and Developer's Guide》中 Advanced Barcode Font Formatting
Implementation 中提供了這樣的方法的實現。在 Metalink 782809.1[2]中提供 JAVA 版
128 碼編碼實現類(BarcodeUtil.java)的下載,以及測試使用對應的模板文件
java
(TestBarcodeUtil.rtf)git
下面內容以字體IDAutomationC128M 爲演示sql
一.WINDOWS本地字體配置oracle
下載條形碼字體,拷貝到系統字體目錄裏,本身主動安裝app
二,上傳java到serveride
1.查看java里路徑 好比:package oracle.apps.xdo.template.rtf.util.barcoder;oop
上傳java文件BarcodeUtil.java到文件夾 $JAVA_TOP/oracle/apps/xdo/template/rtf/util/barcoder 沒有新建post
編譯java文件字體
java文件例如如下
/* Code extracted from Oracle?XML Publisher Core Components Guide Release 10.1.3.3 Pages 8-60 to 8-64 */ package oracle.apps.xdo.template.rtf.util.barcoder; import java.util.Hashtable; import java.lang.reflect.Method; import oracle.apps.xdo.template.rtf.util.XDOBarcodeEncoder; import oracle.apps.xdo.common.log.Logger; // This class name will be used in the register vendor // field in the template. public class BarcodeUtil implements XDOBarcodeEncoder // The class implements the XDOBarcodeEncoder interface { // This is the barcode vendor id that is used in the // register vendor field and format-barcode fields public static final String BARCODE_VENDOR_ID = "XMLPBarVendor"; // The hashtable is used to store references to // the encoding methods public static final Hashtable ENCODERS = new Hashtable(10); // The BarcodeUtil class needs to be instantiated public static final BarcodeUtil mUtility = new BarcodeUtil(); // This is the main code that is executed in the class, // it is loading the methods for the encoding into the hashtable. // In this case we are loading the three code128 encoding // methods we have created. static { try { Class[] clazz = new Class[] { "".getClass() }; ENCODERS.put("code128a",mUtility.getClass().getMethod("code128a", clazz)); ENCODERS.put("code128b",mUtility.getClass().getMethod("code128b", clazz)); ENCODERS.put("code128c",mUtility.getClass().getMethod("code128c", clazz)); } catch (Exception e) { // This is using the XML Publisher logging class to push // errors to the XMLP log file. Logger.log(e,5); } } // The getVendorID method is called from the template layer // at runtime to ensure the correct encoding method are used public final String getVendorID() { return BARCODE_VENDOR_ID; } //The isSupported method is called to ensure that the // encoding method called from the template is actually // present in this class. // If not then XMLP will report this in the log. public final boolean isSupported(String s) { if(s != null) return ENCODERS.containsKey(s.trim().toLowerCase()); else return false; } // The encode method is called to then call the appropriate // encoding method, in this example the code128a/b/c methods. public final String encode(String s, String s1) { if(s != null && s1 != null) { try { Method method = (Method)ENCODERS.get(s1.trim().toLowerCase()); if(method != null) return (String)method.invoke(this, new Object[] { s }); else return s; } catch(Exception exception) { Logger.log(exception,5); } return s; } else { return s; } } /** This is the complete method for Code128a */ public static final String code128a( String DataToEncode ) { char C128_Start = (char)203; char C128_Stop = (char)206; String Printable_string = ""; char CurrentChar; int CurrentValue=0; int weightedTotal=0; int CheckDigitValue=0; char C128_CheckDigit='w'; DataToEncode = DataToEncode.trim(); weightedTotal = ((int)C128_Start) - 100; for( int i = 1; i <= DataToEncode.length(); i++ ) { //get the value of each character CurrentChar = DataToEncode.charAt(i-1); if( ((int)CurrentChar) < 135 ) CurrentValue = ((int)CurrentChar) - 32; if( ((int)CurrentChar) > 134 ) CurrentValue = ((int)CurrentChar) - 100; CurrentValue = CurrentValue * i; weightedTotal = weightedTotal + CurrentValue; } //divide the WeightedTotal by 103 and get the remainder, //this is the CheckDigitValue CheckDigitValue = weightedTotal % 103; if( (CheckDigitValue < 95) && (CheckDigitValue > 0) ) C128_CheckDigit = (char)(CheckDigitValue + 32); if( CheckDigitValue > 94 ) C128_CheckDigit = (char)(CheckDigitValue + 100); if( CheckDigitValue == 0 ){ C128_CheckDigit = (char)194; } Printable_string = C128_Start + DataToEncode + C128_CheckDigit + C128_Stop + " "; return Printable_string; } /** This is the complete method for Code128b ***/ public static final String code128b( String DataToEncode ) { char C128_Start = (char)204; char C128_Stop = (char)206; String Printable_string = ""; char CurrentChar; int CurrentValue=0; int weightedTotal=0; int CheckDigitValue=0; char C128_CheckDigit='w'; DataToEncode = DataToEncode.trim(); weightedTotal = ((int)C128_Start) - 100; for( int i = 1; i <= DataToEncode.length(); i++ ) { //get the value of each character CurrentChar = DataToEncode.charAt(i-1); if( ((int)CurrentChar) < 135 ) CurrentValue = ((int)CurrentChar) - 32; if( ((int)CurrentChar) > 134 ) CurrentValue = ((int)CurrentChar) - 100; CurrentValue = CurrentValue * i; weightedTotal = weightedTotal + CurrentValue; } //divide the WeightedTotal by 103 and get the remainder, //this is the CheckDigitValue CheckDigitValue = weightedTotal % 103; if( (CheckDigitValue < 95) && (CheckDigitValue > 0) ) C128_CheckDigit = (char)(CheckDigitValue + 32); if( CheckDigitValue > 94 ) C128_CheckDigit = (char)(CheckDigitValue + 100); if( CheckDigitValue == 0 ){ C128_CheckDigit = (char)194; } Printable_string = C128_Start + DataToEncode + C128_CheckDigit + C128_Stop + " "; return Printable_string; } /** This is the complete method for Code128c **/ public static final String code128c( String s ) { char C128_Start = (char)205; char C128_Stop = (char)206; String Printable_string = ""; String DataToPrint = ""; String OnlyCorrectData = ""; int i=1; int CurrentChar=0; int CurrentValue=0; int weightedTotal=0; int CheckDigitValue=0; char C128_CheckDigit='w'; DataToPrint = ""; s = s.trim(); for(i = 1; i <= s.length(); i++ ) { //Add only numbers to OnlyCorrectData string CurrentChar = (int)s.charAt(i-1); if((CurrentChar < 58) && (CurrentChar > 47)) { OnlyCorrectData = OnlyCorrectData + (char)s.charAt(i-1); } } s = OnlyCorrectData; //Check for an even number of digits, add 0 if not even if( (s.length() % 2) == 1 ) { s = "0" + s; } //<<<< Calculate Modulo 103 Check Digit and generate // DataToPrint >>>>//Set WeightedTotal to the Code 128 value of // the start character weightedTotal = ((int)C128_Start) - 100; int WeightValue = 1; for( i = 1; i <= s.length(); i += 2 ) { //Get the value of each number pair (ex: 5 and 6 = 5*10+6 =56) //And assign the ASCII values to DataToPrint CurrentChar = ((((int)s.charAt(i-1))-48)*10) + (((int)s.charAt(i))-48); if((CurrentChar < 95) && (CurrentChar > 0)) DataToPrint = DataToPrint + (char)(CurrentChar + 32); if( CurrentChar > 94 ) DataToPrint = DataToPrint + (char)(CurrentChar + 100); if( CurrentChar == 0) DataToPrint = DataToPrint + (char)194; //multiply by the weighting character //add the values together to get the weighted total weightedTotal = weightedTotal + (CurrentChar * WeightValue); WeightValue = WeightValue + 1; } //divide the WeightedTotal by 103 and get the remainder, //this is the CheckDigitValue CheckDigitValue = weightedTotal % 103; if((CheckDigitValue < 95) && (CheckDigitValue > 0)) C128_CheckDigit = (char)(CheckDigitValue + 32); if( CheckDigitValue > 94 ) C128_CheckDigit = (char)(CheckDigitValue + 100); if( CheckDigitValue == 0 ){ C128_CheckDigit = (char)194; } Printable_string = C128_Start + DataToPrint + C128_CheckDigit + C128_Stop + " "; Logger.log(Printable_string,5); return Printable_string; } } /*End BarcodeUtil class */
舉比例如如下
<?xml version="1.0" encoding="UTF-8"?> <RECEIPT_APPLIED> <LINES> <ITEM_CODE>F4990010010</ITEM_CODE> <ITEM_NAME><![CDATA[財稅通軟件 V1.0]]></ITEM_NAME> <BARCODE>912014266</BARCODE> </LINES> <LINES> <ITEM_CODE>F4990010010</ITEM_CODE> <ITEM_NAME><![CDATA[財稅通軟件 V1.0]]></ITEM_NAME> <BARCODE>912014265</BARCODE> </LINES> </RECEIPT_APPLIED>
說明:REG裏面 <?register-barcode-vendor:'oracle.apps.xdo.template.rtf.util.barcoder.BarcodeUtil';'XMLPBarVendor'?> 註冊條碼編碼類
條碼裏 <?format-barcode:BARCODE;'Code128a';'XMLPBarVendor'?> 數據格式化
五.註冊數據源,模板
略
六.上傳字體
在XML Publisher Administrator職責下,首先上傳字體文件
七.配置字體映射
在XML Publisher Administrator職責下,定義字體轉換映射集
由於咱們的模板使用的是RTF格式的。所以Type需要選擇FO To PDF
在XML Publisher Administrator職責下,定義字體轉換映射關係
輸入Font Family,這個值可以打開字體文件來查看
依據模板中使用字體的狀況來選擇Style和Weight
假設需要依據Locale來決定使用字體映射,則填入Language和Territory,不填表明所有語音環境下都適用
八,模板和字體映射關聯
定義好字體映射以後,改動BIP模板文件的配置
查詢出BIP模板定義後,點擊右上角的 Edit Configuration button
查找模板
展開FO Processing部分,設置Font mapping set爲上面定義好的字體映射集
最後提交請求,查看輸出
附1:metalink
In this Document
APPLIES TO:JD Edwards EnterpriseOne Tools - Version 8.97 and laterBI Publisher (formerly XML Publisher) - Version 11.1.1.5.0 to 11.1.1.5.0 [Release 11.1] Information in this document applies to any platform. PURPOSEInformation Center: BI Publisher in the JD Edwards EnterpriseOne Tools and Technology Product > Information Center: Using BI Publisher in the JD Edwards EnterpriseOne Tools and Technology Product > Note 1460779.2 This document outlines the steps to use barcode java handlers to add control characters to barcode content in reports produced by embedded BI Publisher for EnterpriseOne. SCOPEEmbedded BI Publisher for EnterpriseOne. DETAILSOverviewBarcodes are a representation of a string of data in a barcode font. In order to be readable by barcode scanners, data represented in barcode format need to be preceded and followed by their respective control characters. See external page http://en.wikipedia.org/wiki/Code_128 for more information. LimitationBarcode encoding will not work if using a PDF type template with Embedded BI Publisher for EnterpriseOne. This is because there is no way to add the necessary call to the java script to enable the start and stop control characters in PDF templates and this can only be done in RTF templates. Without the java script, the font will show in the final output, however it will be unreadable to the barcode scanners. Steps to ImplementEnterpriseOne 8.98.3.0 and later (including 9.1):Since tools release 8.98.3.0 we include a newer BI Publisher core engine (10.1.3.4.1) which has built in support for barcode 128a,b,c. The barcode function can be invoked directly using te following command in your RTF template: <?format-barcode:FieldName;'code128b'?> Where FieldName is the name of the dynamic field you want to convert to Barcode 128b. You can use encodings 128a and 128c as well, for example: <?format-barcode:FieldName;'code128a'?> format-barcode:FieldName;'code128c'?> You may also want to try to use the barcode 128 font delivered with BI Publisher Desktop: 128R00.TTF. See article posted inhttps://blogs.oracle.com/xmlpublisher/entry/bundled_barcodes_batman_1 for more details. EnterpriseOne 8.98.2.4 and older:The following steps layout all pieces necessary to embed readable barcode strings in reports produced by BI Publisher for EnterpriseOne 8.98.2.4 and older.
The implementation of this solution requires knowledge of BI Publisher for EnterpriseOne and java programming language.
Note 1:
The same result can be achieved with BI Publisher Desktop (MS Word Plug-in), using its own xdocore.jar and its fonts. These are usually located in"c:\Program Files\Oracle\BI Publisher\BI Publisher Desktop\Template Builder for Word", in the jlib and fonts subfolders. If the issue is duplicated with the Desktop Plugin, then it is not an EnterpriseOne integration problem, and the cause should be sought either in the encryptor class from the barcode provider, or in the way it was integrated in the BarcodeUtil.java.
Note 2:
There are many different types of barcodes. This document is specific to handling of 128a, 128b and 128c types. It is possible to integrate other dynamic barcode types to use with BI Publisher for EnterpriseOne, however these are considered to be out of the scope of EnterpriseOne support. If you have questions about using 2D barcode fonts you may like to consider the following links: https://blogs.oracle.com/xmlpublisher/entry/bundled_barcodes_batman_1 https://blogs.oracle.com/xmlpublisher/entry/2d_barcodes_cracked https://blogs.oracle.com/xmlpublisher/entry/2d_barcode_addendum http://www.idautomation.com/oracle/xml_publisher_barcode.html. Discussion and tips on how to incorporate QR barcodes: https://blogs.oracle.com/xmlpublisher/entry/quick_quips_on_qr_codes Enhancement bugs requesting enhanced support for barcodes: BUG 11047749 - SUPPORT 2D BARCODE PRINTING
REFERENCESNOTE:652457.1 - E1: XMLP: Adding a Font to be Used with Embedded Publisher for EnterpriseOneNOTE:747323.1 - JD Edwards EnterpriseOne Current MTR Index NOTE:651589.1 - E1: XMLP: How to Capture BI Publisher Logs NOTE:789074.1 - E1: XMLP: BI Publisher for JD Edwards EnterpriseOne NOTE:704542.1 - JD Edwards EnterpriseOne Tools 8.97 Implementation of Oracle Business Intelligence (BI) Publisher (Formerly XML Publisher) BUG:11047749 - SUPPORT 2D BARCODE PRINTING - SAR: 8967722 |
![]() |
![]()
|
附2:report 實現
This IDAutomation tutorial should be used when implementing barcode generation in Oracle Reports with the IDAutomation PL/SQL Barcode Library and IDAutomation barcode fonts. The barcode library is a PLL file that formats data from fields in the report to create an accurate barcode when combined with IDAutomation barcode fonts.
The library contains functions for Code 128, Code 39, GS1, Codabar, UCC/EAN 128, Interleaved 2 of 5, UPC and EAN barcodes.
IDAutomation also provides Java barcode generation for Oracle Reports, which is easier to implement in for versions 9i, 10g and above, as well as in UNIX and Linux environments. Other solutions are also provided in the Oracle Reports Barcode Integration Guide.
Note: Use of this pll, requires a Developer License or above. This font encoder is supplied with Purchase of Developer's License or above of any Barcode Font Package.
IDAutomation offers many different barcode fonts for a variety of purposes. If unsure which to use, consider theUniversal Barcode Font with the Code 128 function. The IDAutomation.pll is a Feature Level 3 font encoder and cannot format data for the GS1-128 barcode standard. The IDAutomation_Universal.pll (compatible with Oracle 9i and above) can encode data for GS1-128 barcodes. To install these barcode fonts on Windows for Oracle Reports, run theInstall.exe file included in the font package or follow the font installation procedures. Because of the complexities and variety of UNIX and Linux system distributions, IDAutomation does not provide installation assistance for these systems. However, IDAutomation does provide two sets of installation instructions that may help as a guide:
If possible, consider using Java Barcoding for Oracle Reports for Unix and Linux environments.
The Oracle Reports Barcode PLL Library is compatible with all versions of Oracle Reports that support attached libraries. The IDAutomation.pll was developed and tested against Reports 6i, and the IDAutomation_Universal.pll is compatible with 10g and above. If used in the database itself, the version of the database would be any version that supports PL/SQL. PL/SQL source code is also provided for advanced Oracle developers in the IDAutomation.pkg file.
Oracle Reports Barcode Font Functions | ||
The methods listed below may only be used with IDAutomation.pll and the appropriate barcode font. IDAutomation strongly recommends using the Universal Barcode Font with the appropriate Universal Function when generating Code 128 or Interleaved 2 of 5 barcodes. | ||
Function | Font Name | Function Notes and Additional Information |
Code128 (DataToEncode, ReturnType) |
IDAutomationC128 * | Automatically encodes text data from ASCII 1 to ASCII 127. Using the Universal Barcode Font with the Universal Font Methods in the following situations is recommended:
It may be necessary to use the optional ReturnType for special purposes: |
Code128a(DataToEncode) | IDAutomationC128 * | Formats output to the Code 128 barcode fonts, character set A. |
Code128b(DataToEncode) | IDAutomationC128 * | Returns codes formatted to the Code 128 character set B. Formats output to the Code 128 barcode fonts. |
Code128c(DataToEncode) | IDAutomationC128 * | Interleaves numbers into pairs for high density. |
I2of5 (DataToEncode) |
IDAutomationI25 * IDAutomationI25 * |
Interleaves numbers into pairs for high density without check digits, and formats the return string to the Interleaved 2 of 5 barcode fonts. |
I2of5Mod10(DataToEncode,ReturnType) | IDAutomationI25 * IDAutomationI25 * |
(DataToEncode, 0) performs the mod10 checksum calculation for increased accuracy and formats the return string to the Interleaved 2 of 5 barcode fonts. (DataToEncode, 1) returns the human-readable data with the MOD10 check digit included. (DataToEncode, 2) returns the MOD10 check digit. |
* When using the IDAutomationC128 or IDAutomationI25 fonts outside of the USA or for GS1-128, consider using theUniversal Barcode Font with the appropriate Universal Function to avoid language and locale incompatibilities. | ||
Code39Mod43(DataToEncode,ReturnType) | IDAutomationC39 IDAutomationC39 |
(DataToEncode, 0) performs the mod43 checksum calculation for increased accuracy and formats the output to print using Code 39 fonts. The mod43 checksum is usually required for LOGMARS and HIBC applications. (DataToEncode, 1) returns the human readable data with the check digit included. (DataToEncode, 2) returns only the check digit. |
Code93 (DataToEncode) |
IDAutomationC93 | Formats the output to print with the 2 required check digits using Code 93 fonts. |
Codabar(DataToEncode) | IDAutomationCB | Formats the output to print using Codabar fonts. |
EAN13 (DataToEncode) |
IDAutomationUPCEAN | A number string of 12, 13, 14, 15, 17 or 18 digits with or without a check digit. Formats output to the UPC/EAN fonts. Add-ons are supported. |
EAN8 (DataToEncode) |
IDAutomationUPCEAN | A number string of 7 or 8 characters (EAN-8 without the check digit). Formats output to the UPC/EAN fonts. Entering incorrect data will create a barcode containing all zeros. |
Postnet (DataToEncode, ReturnType) |
IDAutomationPOSTNET or IDAutomationPOSTNET |
Enter a single string of Zip, Zip + 4 or Zip + 4 + Delivery Point or any number of digits for the planet code. The DataToEncode must be a number and can include dashes and spaces. (DataToEncode, 0) formats output to the Postnet fonts. (DataToEncode, 1) returns the human-readable data with the check digit included. (DataToEncode, 2) returns only the check digit. |
UPCa (DataToEncode) |
IDAutomationUPCEAN | A UPC-A number string of 11, 12, 13, 14, 16 or 17 digits with or without a check digit. Formats output to the UPC/EAN fonts. Add-ons are supported. |
Oracle Reports Universal Barcode Font Functions | ||
These methods may only be used with IDAutomation_Universal.pll and the Universal Barcode Fonts. | ||
Function | Font Name | Function Notes |
Code128(DataToEncode,ApplyTilde) | IDAutomation_Uni | Automatically encodes all text from ASCII 1 to ASCII 127. This method contains many options for encoding GS1-128 and includes tilde options to encode functions such as tabs and returns. |
Code128A(DataToEncode) | IDAutomation_Uni | Formats output to set A of Code-128. Use caution with this option because any lowercase character creates a function. Use the letter "i" for a tab and "m" for a return. For most purposes, it is better to use the C128() function instead of this one. |
Code128B(DataToEncode) | IDAutomation_Uni | Formats output to Code-128, character set B. For most purposes, it is better to use theC128() function instead of this one. |
Code128C(DataToEncode) | IDAutomation_Uni | This code128 function "interleaves" even numbers into pairs for high density. An even number of digits is required. For most purposes, it is better to use the C128() functioninstead of this one. |
Code39 (DataToEncode, N_Dimension,IncludeCheckDigit) |
IDAutomation_Uni | Formats the output to Code 39 with the Universal barcode font. A MOD 43 checksum will be calculated if IncludeCheckDigit is true. |
Codabar(DataToEncode,N_Dimension, StartChar, StopChar) |
IDAutomation_Uni | Creates Codabar (aka NW7) with the Universal barcode font. StartChar and StopChar are also required as the start and stop characters. Valid start and stop characters are A, B, C and D. |
I2of5 (DataToEncode, N_Dimension,IncludeCheckDigit) |
IDAutomation_Uni | Interleaves numbers into pairs for high density without check digits, and formats the return string to the Universal font. An even number of digits is required. A MOD 10 checksum will be calculated if IncludeCheckDigit is true. |
Planet (DataToEncode,IncludeCheckDigit) |
IDAutomation_Uni | This barcode type has a specific height requirement, and this function only works with the XS, S or M size of the Universal Font. XS is the normal version, S has the bars narrow by 10% and the M font has the bars narrow by 20%. DataToEncode is a single string of Zip, Zip + 4 or Zip + 4 + Delivery Point. A MOD 10 checksum will be calculated if IncludeCheckDigit is true. |
Postnet (DataToEncode,IncludeCheckDigit) |
IDAutomation_Uni | This barcode type has a specific height requirement, and this function only works with the XS, S or M size of the Universal Font. XS is the normal version, S has the bars narrow by 10% and the M font has the bars narrow by 20%. DataToEncode is a single string of Zip, Zip + 4 or Zip + 4 + Delivery Point. A MOD 10 checksum will be calculated if IncludeCheckDigit is true. |