Штрих-код Code128 в текстовом поле формы Adobe Acrobat

У нас есть PDF-форма, в которой вы заполняете параметры продукта, затем она преобразует эти параметры в одно текстовое поле «Номер партии», а затем, наконец, поле «Штрих-код номера партии», принимает номер партии и преобразует его в штрих-код. По какой-то причине это не работает. Я почти ничего не знаю об интеграции штрих-кодов, но я программист и просто ищу рекомендации по этой теме.

Поле «Штрих-код номера партии» в свойствах Calculate-> Custom Calculation Script использует этот код. Итак, как я уже сказал выше, он берет поле «Номер партии» и преобразует его в строку, которую, как мне кажется, затем использует шрифт для генерации правильного штрих-кода, или это идея.

event.value = this.getField("Lot No").valueAsString;

Вот ссылка на фактический PDF-файл, который мне предоставил клиент:
https://ufile.io/ihh87

Это то, что я узнал по этой теме, но, очевидно, все еще не хватает деталей в головоломке, и надеюсь, что кто-то может дать мне точные шаги, необходимые для того, чтобы это работало в Acrobat Pro.

  1. Мне нужен встраиваемый шрифт CODE 128? Я нашел этот набор шрифтов, но он стоит 159 долларов. Есть ли бесплатная версия, которую я мог бы использовать, и она все еще работает? https://www.idautomation.com/barcode-fonts/code-128/
  2. Javascript - мне нужно добавить пользовательский код Javascript в свойства Действия текстового поля «Штрих-код номера партии», но я не знаю, какой код нужно реализовать, и ищу ресурс по этому вопросу, чтобы лучше объяснить процесс.
  3. Высота шрифта и размер шрифта. Если я получу предыдущие 2 шага, мне все равно нужно будет заботиться о том, чтобы установить в текстовом поле PDF точный размер и высоту шрифта, иначе сканер штрих-кода может выйти из строя. Это правда? В настоящее время для размера шрифта текстового поля PDF установлено значение «Авто».
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 512
4

Ответы 4

Code 128 - это относительно сложный штрих-код, который не может быть представлен заменой заменяемой строки шрифтом. Следовательно, вам понадобится некоторая логика, чтобы собрать правильную строку для отображения. Я не знаю ничего общедоступного, что могло бы сделать такой расчет; вы были бы одни или вам нужно было бы найти кого-нибудь, кто поможет.

Чтобы создать эту логику, вам нужно понять, как работает Code 128; эта информация должна быть в свободном доступе.

Что касается лицензии на шрифт, вы можете сравнить ее стоимость с другими решениями: попробуйте поработать со свободным шрифтом, плавающим вокруг, или создайте свой собственный шрифт, или используйте графику (например, в аннотации, которую можно рассчитать с помощью Acrobat JavaScript). В конце концов, даже этот довольно дорогой шрифт может оказаться самым экономичным решением.

Поскольку вы уже изучили спецификацию Code 128, вы также ознакомились с требованиями для ее печати. Вам нужно будет внести изменения в поле и, скорее всего, установить фиксированный размер шрифта. Однако это будет зависеть от масштабирования при печати страницы.

Вы можете попробовать шрифт Libre Code128 (бесплатно) по адресу https://fonts.googleapis.com/css?family=Libre+Barcode+128+Text и приложенный код JavaScript для расчета контрольной суммы.

var buttonGen = document.getElementById("btnGen");
buttonGen.onclick = function () {
  var x = document.getElementById("textIn").value;
  var i, j, intWeight, intLength, intWtProd = 0, arrayData = [], fs;
  var arraySubst = [ "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê" ];

/*
 * Checksum Calculation for Code 128 B
 */
  intLength = x.length;
	arrayData[0] = 104; // Assume Code 128B, Will revise to support A, C and switching.
	intWtProd = 104;
	for (j = 0; j < intLength; j += 1) {
			arrayData[j + 1] = x.charCodeAt(j) - 32; // Have to convert to Code 128 encoding
			intWeight = j + 1; // to generate the checksum
			intWtProd += intWeight * arrayData[j + 1]; // Just a weighted sum
	}
	arrayData[j + 1] = intWtProd % 103; // Modulo 103 on weighted sum
	arrayData[j + 2] = 106; // Code 128 Stop character
  chr = parseInt(arrayData[j + 1], 10); // Gotta convert from character to a number
  if (chr > 94) {
    chrString = arraySubst[chr - 95];
  } else {
    chrString = String.fromCharCode(chr + 32);
  }
  
  // Change the font-size style to match the drop down
  fs = document.getElementsByTagName("option")[document.getElementById("selList").selectedIndex].value;
  document.getElementById("test").style.fontSize = fs  + 'px';
  
  document.getElementById("check").innerHTML =
    'Checksum = ' + chr + ' or character ' + // Make It Visual
    chrString + ', for text = "' + x + '"';
  
  document.getElementById("test").innerHTML =
    'Ì' + // Start Code B
    x + // The originally typed string
    chrString + // The generated checksum
    'Î'; // Stop Code
}
<html>
  <head>
    <link href = "https://fonts.googleapis.com/css?family=Libre+Barcode+128+Text" rel = "stylesheet">
    <style>
      td, th {
        text-align: center;
        padding: 6px;
      }

      .ss {
        font-family: 'Libre Barcode 128 Text', cursive;
        font-size: 24px;
      }
    </style>
  </head>
  <body>
    &nbsp;Font Size:&nbsp;
    <select id = "selList">
      <option value = "24" selected>24px</option>
      <option value = "30">30px</option>
      <option value = "36">36px</option>
      <option value = "42">42px</option>
      <option value = "48">48px</option>
      <option value = "54">54px</option>
      <option value = "60">60px</option>
      <option value = "66">66px</option>
      <option value = "72">72px</option>
      <option value = "78">78px</option>
      <option value = "84">84px</option>
      <option value = "90">90px</option>
      <option value = "96">96px</option>
    </select>&nbsp;

    <input type = "text" id = "textIn"></input>
    <input type = "button" id = "btnGen" value = "Generate Code 128 Checksum" tabindex=4/>
    <div id = "check"></div><br /><span id = "test" class = "ss">ÌMaking the Web Beautiful!$Î</span><br />
    <p>This is a demonstration of use of the Libre Barcode 128 Font.</p>
    <p>Because the Libre Barcode Code 128 font does not generate checksums, you need this component to produce a scanning barcode.</p>
    <p>To use, just enter the text you want to embed in the barcode and press the generate button. Happy barcoding!</p>
    <p>By the way, Libre Barcode 128 Font uses the following high ASCII / unicode characters to implement the control codes symbols. (This is essentially adding 100 to the value, in other words 'Ã' is U+00C3 (195) to 'Î' is U+00CE (206).)</p>
<table border = "3">
    <tr>
    <th>Value</th>
    <th>Encoding</th>
    <th>Subst</th>
  </tr>
<tr><td> 95</td><td>A: US, B: DEL, C: 95</td><td>Ã</td></tr>
<tr><td> 96</td><td>A: FNC 3, B: FNC 3, C: 96</td><td>Ä</td></tr>
<tr><td> 97</td><td>A: FNC 2, B: FNC 2, C: 97</td><td>Å</td></tr>
<tr><td> 98</td><td>A: Shift B, B: Shift A, C: 98</td><td>Æ</td></tr>
<tr><td> 99</td><td>A: Code C, B: Code C, C: 99</td><td>Ç</td></tr>
<tr><td>100</td><td>A: Code B, B: FNC 4, C: Code B</td><td>È</td></tr>
<tr><td>101</td><td>A: FNC 4, B: Code A, C: Code A</td><td>É</td></tr>
<tr><td>102</td><td>A: FNC 1, B: FNC 1, C: FNC 1</td><td>Ê</td></tr>
<tr><td>103</td><td>Begin Code A</td><td>Ë</td></tr>
<tr><td>104</td><td>Begin Code B</td><td>Ì</td></tr>
<tr><td>105</td><td>Begin Code C</td><td>Í</td></tr>
<tr><td>106</td><td>Stop Code</td><td>Î</td></tr></table>
  </body>
</html>

Чтобы получить штрих-код Code 128 для печати и сканирования, необходимо вычислить контрольную сумму. Это включает в себя вычисление взвешенной суммы содержимого номера лота и получение остатка от деления на 103.

Интересная работа. К сожалению, немецкие буквы, такие как ä, ü, ö, ß, Ü или Ö, не будут переведены.

Aldo Paradiso 20.10.2020 14:08

Это верно для любой буквы, которая не найдена в столбце Code 128 B таблицы Code 128 здесь: en.wikipedia.org/wiki/Code_128.

Brian Anderson 20.10.2020 21:14

Шрифт свободный штрих-код128, похоже, является копией семейства шрифтов штрих-кода ID с открытым исходным кодом. Таким образом, коды символов могут совпадать.

Оптимизированные 128 кодов (которые переключаются между Code128B и 128C для обеспечения более коротких штрих-кодов, если во входной строке используются последовательные цифры) не будут очень удобочитаемы, поэтому их использование со шрифтом, который включает в себя читаемые человеком символы, не даст хороших результатов, потому что Кодировка Code128C (для чисел) искажает последовательные числа.

Я нашел этот проект librebarcode на github, где кто-то использовал большой массив javascript с картами символов для шрифта и весами, которые вы должны использовать для вычисления контрольной суммы.

Вместе с примером кода и страница Википедии для кода 128 вы сможете заставить что-то работать в Acrobat.

Вот массив:

var data = [
      // the unicode chars are from:
      //   www.idautomation.com/barcode-fonts/code.128/user-manual.html
      //   http://www.jtbarton.com/Barcodes/Code128.aspx
      // checksum value, pattern, canonical id/name (based on Code Set B)
      // (name of the glyph in the font?), [unicode chars], textbelow_flag_or_charcodes
      [   0, ' ', ' ', '00', 'Â']
    , [   1, '!', '!', '01', '!']
    , [   2, '"', '"', '02', '"']
    , [   3, '#', '#', '03', '#']
    , [   4, '$', '$', '04', '$']
    , [   5, '%', '%', '05', '%']
    , [   6, '&', '&', '06', '&']
    , [   7, "'", "'", "07", "'"]
    , [   8, '(', '(', '08', '(']
    , [   9, ')', ')', '09', ')']
    , [  10, '*', '*', '10', '*']
    , [  11, '+', '+', '11', '+']
    , [  12, ',', ',', '12', ',']
    , [  13, '-', '-', '13', '-']
    , [  14, '.', '.', '14', '.']
    , [  15, '/', '/', '15', '/']
    , [  16, '0', '0', '16', '0']
    , [  17, '1', '1', '17', '1']
    , [  18, '2', '2', '18', '2']
    , [  19, '3', '3', '19', '3']
    , [  20, '4', '4', '20', '4']
    , [  21, '5', '5', '21', '5']
    , [  22, '6', '6', '22', '6']
    , [  23, '7', '7', '23', '7']
    , [  24, '8', '8', '24', '8']
    , [  25, '9', '9', '25', '9']
    , [  26, ':', ':', '26', ':']
    , [  27, ';', ';', '27', ';']
    , [  28, '<', '<', '28', '<']
    , [  29, '=', '=', '29', '=']
    , [  30, '>', '>', '30', '>']
    , [  31, '?', '?', '31', '?']
    , [  32, '@', '@', '32', '@']
    , [  33, 'A', 'A', '33', 'A']
    , [  34, 'B', 'B', '34', 'B']
    , [  35, 'C', 'C', '35', 'C']
    , [  36, 'D', 'D', '36', 'D']
    , [  37, 'E', 'E', '37', 'E']
    , [  38, 'F', 'F', '38', 'F']
    , [  39, 'G', 'G', '39', 'G']
    , [  40, 'H', 'H', '40', 'H']
    , [  41, 'I', 'I', '41', 'I']
    , [  42, 'J', 'J', '42', 'J']
    , [  43, 'K', 'K', '43', 'K']
    , [  44, 'L', 'L', '44', 'L']
    , [  45, 'M', 'M', '45', 'M']
    , [  46, 'N', 'N', '46', 'N']
    , [  47, 'O', 'O', '47', 'O']
    , [  48, 'P', 'P', '48', 'P']
    , [  49, 'Q', 'Q', '49', 'Q']
    , [  50, 'R', 'R', '50', 'R']
    , [  51, 'S', 'S', '51', 'S']
    , [  52, 'T', 'T', '52', 'T']
    , [  53, 'U', 'U', '53', 'U']
    , [  54, 'V', 'V', '54', 'V']
    , [  55, 'W', 'W', '55', 'W']
    , [  56, 'X', 'X', '56', 'X']
    , [  57, 'Y', 'Y', '57', 'Y']
    , [  58, 'Z', 'Z', '58', 'Z']
    , [  59, '[', '[', '59', '[']
    , [  60, '\\', '\\', '60', '\\']
    , [  61, ']', ']', '61', ']']
    , [  62, '^', '^', '62', '^']
    , [  63, '_', '_', '63', '_']
    , [  64, 'NUL', '`', '64', '`']
    , [  65, 'SOH', 'a', '65', 'a']
    , [  66, 'STX', 'b', '66', 'b']
    , [  67, 'ETX', 'c', '67', 'c']
    , [  68, 'EOT', 'd', '68', 'd']
    , [  69, 'ENQ', 'e', '69', 'e']
    , [  70, 'ACK', 'f', '70', 'f']
    , [  71, 'BEL', 'g', '71', 'g']
    , [  72, 'BS', 'h', '72', 'h']
    , [  73, 'HT', 'i', '73', 'i']
    , [  74, 'LF', 'j', '74', 'j']
    , [  75, 'VT', 'k', '75', 'k']
    , [  76, 'FF', 'l', '76', 'l']
    , [  77, 'CR', 'm', '77', 'm']
    , [  78, 'SO', 'n', '78', 'n']
    , [  79, 'SI', 'o', '79', 'o']
    , [  80, 'DLE', 'p', '80', 'p']
    , [  81, 'DC1', 'q', '81', 'q']
    , [  82, 'DC2', 'r', '82', 'r']
    , [  83, 'DC3', 's', '83', 's']
    , [  84, 'DC4', 't', '84', 't']
    , [  85, 'NAK', 'u', '85', 'u']
    , [  86, 'SYN', 'v', '86', 'v']
    , [  87, 'ETB', 'w', '87', 'w']
    , [  88, 'CAN', 'x', '88', 'x']
    , [  89, 'EM', 'y', '89', 'y']
    , [  90, 'SUB', 'z', '90', 'z']
    , [  91, 'ESC', '{', '91', '{']
    , [  92, 'FS', '|', '92', '|']
    , [  93, 'GS', '}', '93', '}']
    , [  94, 'RS', '~', '94', '~']
    , [  95, 'US', 'DEL', '95 ', 'Ã']
    , [  96, 'FNC 3', 'FNC 3', '96', 'Ä']
    , [  97, 'FNC 2', 'FNC 2', '97', 'Å']
    , [  98, 'Shift B', 'Shift A', '98', 'Æ']
    , [  99, 'Code C', 'Code C', '99', 'Ç']
    , [ 100, 'Code B', 'FNC 4', 'Code B', 'È']
    , [ 101, 'FNC 4', 'Code A', 'Code A', 'É']
    , [ 102, 'FNC 1', 'FNC 1', 'FNC 1', 'Ê']
    , [ 103, 'Start Code A', 'Start Code A', 'Start Code A', 'Ë']
    , [ 104, 'Start Code B', 'Start Code B', 'Start Code B', 'Ì']
    , [ 105, 'Start Code C', 'Start Code C', 'Start Code C', 'Í']
    , [ 206, 'Stop', 'Stop', 'Stop', 'Î']
    ]
;

Мой собственный полу-рабочий эксперимент на GitHub, если хочешь попробовать.

Имея аналогичную проблему, я нашел решение. Если вы обновите ссылку на свой pdf-файл из клиента, я буду рад его попробовать.

В MS Word вы можете легко получить Code128 из любой входной строки. Я импортировал PDF-форму в Word с помощью FineReader, где выбрал форму в качестве фонового изображения, добавил поля, а затем добавил Code128, встроенный в Word. Довольно неплохой результат.

Другие вопросы по теме