[Acr XI] скрипт перевод всех символов кроме цифр в вектор

  • Автор темы Автор темы sylvio
  • Дата начала Дата начала
Ссылка ведёт на страницу программы. На этой странице ты выбрал ссылку на коммерческую версию, вместо свободной.
Предлагаю закончить, ТС-у вряд ли интересны наши препирательства, да и нет его уже.
 
Предлагаю закончить
Нет уж, а как же поговорить? ;)
ты выбрал ссылку на коммерческую версию, вместо свободной
Ok покажи мне ссылку на свободную версию
 
Да отсоритируйте вы уже файлы по дате, старпЕры 🤣.
 
В исходном коде этой утилитки нужно ограничить сравниваемые символы до цифр, собрать и ваша задачка решена. Ну или форкнуть и добавить такой пункт в меню.
Спасибо за подсказку, посмотрел коммерческую версию. Она делает то же, что и драфтабл, но является программой, а это не хорошо для корпоративного компьютера... Все же, удобнее было бы именно завекторить всё, что не является цифрами, а там и шустрый драфтбл справится.
Прикрепил для примера два файла, оригинал и перевод, с ошибкой в одной цифре. Если не убрать из сравнения нечисловые символы, ошибку не сильно-то и видно. То ли дело было бы, если завекторить текст...
 

Вложения

Если на скорую руку, то как-то так.
1684959997111.png

25 по счёту число отличается.
 
chatGPT выдал такой код на запрос "acrobat java script to vectorize all letters but leave digits as text"

JavaScript:
// iterate through all pages in the document
for (var i = 0; i < this.numPages; i++) {
  var page = this.getPageNth(i);
  var contentStream = page.contents;

  // iterate through each text object on the page
  for (var j = 0; j < contentStream.length; j++) {
    var element = contentStream[j];

    // check if the element is a text object
    if (element instanceof TextObject) {
      var textState = element.getTextState();
      var text = element.text;

      // iterate through each character in the text object
      for (var k = 0; k < text.length; k++) {
        var char = text.charAt(k);

        // check if the character is a letter
        if (/[a-zA-Z]/.test(char)) {
          // create a new path object for the character
          var path = new Path();
          path.strokeColor = null;
          path.fillColor = textState.fillColor;
          path.strokeWidth = textState.lineWidth;
          path.strokeCap = 'round';
          path.strokeJoin = 'round';

          // convert the character to a vector path
          var glyph = fontToGlyph(char, textState.fontName);
          var pathData = glyphToPath(glyph);
          path.pathData = pathData;

          // replace the character in the text object with the path object
          var charWidth = glyph.width * textState.fontSize / 1000;
          var charHeight = textState.fontSize;
          var charX = textState.transform[4] + textState.charSpace * k;
          var charY = textState.transform[5];
          var charMatrix = new Matrix(charWidth, 0, 0, charHeight, charX, charY);
          element.removeChild(k);
          element.insertChild(k, path);
          path.matrix = charMatrix;
        }
      }
    }
  }
}

// convert a character to its glyph representation
function fontToGlyph(char, fontName) {
  var font = fontName ? fontName : 'Helvetica';
  var glyph = fontToUnicode(font, char.charCodeAt(0));
  if (glyph === null) {
    font = 'Helvetica';
    glyph = fontToUnicode(font, char.charCodeAt(0));
  }
  return glyph;
}

// convert a glyph to its vector path representation
function glyphToPath(glyph) {
  var pathData = '';
  var paths = glyph.path;
  for (var i = 0; i < paths.length; i++) {
    var points = paths[i].points;
    var type = paths[i].type;
    pathData += type;
    for (var j = 0; j < points.length; j++) {
      var x = points[j].x;
      var y = points[j].y;
      pathData += x + ',' + y + ' ';
    }
  }
  return pathData.trim();
}
```

The code works by iterating through each page in the PDF document and then iterating through each text object on the page. For each text object, the code iterates through each character in the text and checks if it is a letter. If the character is a letter, the code creates a new vector path object for the character and replaces the character in the text object with the path object. If the character is a digit, it is left as text.

The `fontToGlyph` function converts a character to its glyph representation for a given font. The `glyphToPath` function converts a glyph to its vector path representation.

Но запустить его в акробате не удалось. Может, руки кривые...
Коллеги, подскажите, будьте добры, этот код можно довести до работающего вида?
 
Последнее редактирование:
Не надо переводить ничего в кривые, нужно провести сравнение и удалить комментарии содержащие только текст и знаки препинания скриптом. Это вполне реально.
 
Последнее редактирование модератором:
благодарю за ответ. Я настолько ламер в таких вопросах! Но понял, что нужна отдельностоящая программа для сравнения, но и ее же как таковой в готов виде тоже нет...
А подскажите, коллеги, если я аккуратно разобью текст на символьные фрагменты Pitstop (там такое в меню есть), реально затем скриптом раскидать цифры на один слой, а нецифры - на другой, а затем слой нецифр завекторить pitstop?
 
реально затем скриптом раскидать цифры на один слой, а нецифры, не другой, а затем слой нецифр завекторить pitstop?
Вы уверены что после такого сравнение пройдет корректно?
Вы упорно лезете в какие-то дебри, когда есть более простое и вполне реализуемое решение.

Не по теме:
И кстати разница в вашем примере не в одном, а в 2-х числах :)
 
Вы уверены что после такого сравнение пройдет корректно?
Вы упорно лезете в какие-то дебри, когда есть более простое и вполне реализуемое решение.

Не по теме:
И кстати разница в вашем примере не в одном, а в 2-х числах :)
По идее, должно сработать. Очередность цифр в оригинале и переводе должны близко совпадать, а сама идея исходит из наличествующего инструментария. Программы помимо акробата и онлайн-чекера использовать проблематично 'hz'
 
Благодарю, коллеги
 
По идее, должно сработать. Очередность цифр в оригинале и переводе должны близко совпадать, а сама идея исходит из наличествующего инструментария. Программы помимо акробата и онлайн-чекера использовать проблематично 'hz'
Питстоп тоже наличествует?
 
Я хоть и не понял, чем мои два способа не подошли, таки предложу третий: растеризовать, а потом распознать только цифры.
 

Не по теме:

растеризовать, а потом распознать только цифры.
Оооо ... месье...
Смайлики от Aiwan (Колобки)



Вообще-то ответ полностью удовлетворяющий желанию ТС уже дан, разве что в нем нет перевода в кривые, но результат в конце такой же... Видимо ТС уже сложил у себя в голове цепочку действий и скоро мы увидим его результат с питстопом '))'

Не по теме:
Первый раз вижу как наличие питстопа может усложнить жизнь :)

Пока выложу и свой код в простейшем виде :)
Код:
annots = this.getAnnots();
var r = /\d+/g;
for ( var i= 0; i< annots.length; i++){
if (r.exec(annots[i].contents) != null) {
    annots[i].destroy();
};
}
 
Последнее редактирование:

Не по теме:


Оооо ... месье...
Смайлики от Aiwan (Колобки)



Вообще-то ответ полностью удовлетворяющий желанию ТС уже дан, разве что в нем нет перевода в кривые, но результат в конце такой же... Видимо ТС уже сложил у себя в голове цепочку действий и скоро мы увидим его результат с питстопом '))'

Не по теме:
Первый раз вижу как наличие питстопа может усложнить жизнь :)

Пока выложу и свой код в простейшем виде :)
Код:
annots = this.getAnnots();
var r = /\d+/g;
for ( var i= 0; i< annots.length; i++){
if (r.exec(annots[i].contents) != null) {
    annots[i].destroy();
};
}
Я наверное, чего то недопонимаю, а в какой момент в задаче появились комментарии?