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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 919
Реакции
3 469
Ссылка ведёт на страницу программы. На этой странице ты выбрал ссылку на коммерческую версию, вместо свободной.
Предлагаю закончить, ТС-у вряд ли интересны наши препирательства, да и нет его уже.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852
Предлагаю закончить
Нет уж, а как же поговорить? ;)
ты выбрал ссылку на коммерческую версию, вместо свободной
Ok покажи мне ссылку на свободную версию
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852

Chiga

15 лет на форуме
Сообщения
804
Реакции
519
Да отсоритируйте вы уже файлы по дате, старпЕры 🤣.
 

sylvio

Участник
Топикстартер
Сообщения
77
Реакции
5
В исходном коде этой утилитки нужно ограничить сравниваемые символы до цифр, собрать и ваша задачка решена. Ну или форкнуть и добавить такой пункт в меню.
Спасибо за подсказку, посмотрел коммерческую версию. Она делает то же, что и драфтабл, но является программой, а это не хорошо для корпоративного компьютера... Все же, удобнее было бы именно завекторить всё, что не является цифрами, а там и шустрый драфтбл справится.
Прикрепил для примера два файла, оригинал и перевод, с ошибкой в одной цифре. Если не убрать из сравнения нечисловые символы, ошибку не сильно-то и видно. То ли дело было бы, если завекторить текст...
 

Вложения

  • test_TRANS.pdf
    55.2 КБ · Просм.: 89
  • test_EN.pdf
    7.7 КБ · Просм.: 86

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 919
Реакции
3 469
Если на скорую руку, то как-то так.
1684959997111.png

25 по счёту число отличается.
 

sylvio

Участник
Топикстартер
Сообщения
77
Реакции
5
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.

Но запустить его в акробате не удалось. Может, руки кривые...
Коллеги, подскажите, будьте добры, этот код можно довести до работающего вида?
 
Последнее редактирование:

Drawer

Участник
Сообщения
1 821
Реакции
805
Не надо переводить ничего в кривые, нужно провести сравнение и удалить комментарии содержащие только текст и знаки препинания скриптом. Это вполне реально.
 
Последнее редактирование модератором:

sylvio

Участник
Топикстартер
Сообщения
77
Реакции
5
благодарю за ответ. Я настолько ламер в таких вопросах! Но понял, что нужна отдельностоящая программа для сравнения, но и ее же как таковой в готов виде тоже нет...
А подскажите, коллеги, если я аккуратно разобью текст на символьные фрагменты Pitstop (там такое в меню есть), реально затем скриптом раскидать цифры на один слой, а нецифры - на другой, а затем слой нецифр завекторить pitstop?
 

Drawer

Участник
Сообщения
1 821
Реакции
805
реально затем скриптом раскидать цифры на один слой, а нецифры, не другой, а затем слой нецифр завекторить pitstop?
Вы уверены что после такого сравнение пройдет корректно?
Вы упорно лезете в какие-то дебри, когда есть более простое и вполне реализуемое решение.

Не по теме:
И кстати разница в вашем примере не в одном, а в 2-х числах :)
 

sylvio

Участник
Топикстартер
Сообщения
77
Реакции
5
Вы уверены что после такого сравнение пройдет корректно?
Вы упорно лезете в какие-то дебри, когда есть более простое и вполне реализуемое решение.

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

sylvio

Участник
Топикстартер
Сообщения
77
Реакции
5
Благодарю, коллеги
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852
По идее, должно сработать. Очередность цифр в оригинале и переводе должны близко совпадать, а сама идея исходит из наличествующего инструментария. Программы помимо акробата и онлайн-чекера использовать проблематично 'hz'
Питстоп тоже наличествует?
 

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 919
Реакции
3 469
Я хоть и не понял, чем мои два способа не подошли, таки предложу третий: растеризовать, а потом распознать только цифры.
 

Drawer

Участник
Сообщения
1 821
Реакции
805

Не по теме:

растеризовать, а потом распознать только цифры.
Оооо ... месье...
Смайлики от 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();
};
}
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 231
Реакции
10 852

Не по теме:


Оооо ... месье...
Смайлики от 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();
};
}
Я наверное, чего то недопонимаю, а в какой момент в задаче появились комментарии?