[ID CC-CC2022] Сделать кнопку (button) на основе ссылки из QR-кода

LeonidB

Шпационный шмотритель
Топикстартер
10 лет на форуме
Сообщения
2 485
Реакции
1 536
Коллеги, добрый день!

Подскажите, пожалуйста, как из QR-кода, содержащего внешний URL, сделать button, ведущий на этот URL?

Может, кто-нибудь знает скрипт, умеющий это делать быстро:
1) для выделенного фрейма QR-кода;
2) в идеале - и для всех объектов с QR-кодами в документе?


QR-1.png
QR-2.png
 

Вложения

Подскажите, пожалуйста, как из QR-кода, содержащего внешний URL, сделать button, ведущий на этот URL?
На нынешний день в InDesign не включена возможность чтения QR-кода скриптом - отсутствует должный метод. Тут люди столкнулись с этой проблемой и расстроились. Но на второй странице описана возможность экспорта QR-кода в сниппет и вытаскивания ссылки из XML в текстовом виде. Но это очень сильное колдунство, мне сложно. Надо звать грандов скриптинга.
 
  • Ого!
  • Спасибо
Реакции: Flame и LeonidB
А как часто/много такое нужно?
Не часто. Никогда такого не было. Но вот опять книжка в Индизайне с 1000+ QR-кодов - и надо сделать электронную версию, где при нажатии на QR-код можно перейти на ссылку, в ём сидящую. То есть в бумажной версии читатель QR сканирует, а в электронной - жмёт.
 
Последнее редактирование:
На нынешний день в InDesign не включена возможность чтения QR-кода скриптом - отсутствует должный метод.
А вот интересно: отсутствует только возможность чтения скриптом или и запись тоже? Можно ли, к примеру, выделив графический фрейм, скриптом записать в него QR, взяв web-ссылку, предположим, из выделенного текста?
 
And now I've tried it. It is indeed very easy: if you have a handle to an existing rectangle, you can immediately call its own createHyperlinkQRCode method, and the only argument it needs is the URL itself. (Unless you want to change the color etc., but see grefel's documentation for that.)
A one-line test shows this creates the exact same QR code as when done through the interface. In the image below, the left is a QR code generated with the menu option "Generate QR Code", type Web Link, and the right a blank rectangle that, when selected, gets filled with the same URL using the magic line
app.selection[0].createHyperlinkQRCode ("https://www.indesignjs.de/extendscriptAPI/indesign14/#EPS.html#d1e240502__d1e242534");

пробуйте, пишут, что работает
 
  • Спасибо
Реакции: densen и LeonidB
Можно ли, к примеру, выделив графический фрейм, скриптом записать в него QR, взяв web-ссылку, предположим, из выделенного текста?
Так можно. Можно даже выделить уже имеющийся QR код, запустить скрипт, ввести в появившемся окне новую ссылку и получить QR-код и на нем кнопку с этой ссылкой. Проверяй.
JavaScript:
var myURL = (prompt ("Введите URL»", "test"));
app.activeDocument.selection[0].createHyperlinkQRCode(myURL);
var myFrame = app.activeDocument.selection[0];
var myButton = convertToButton(myFrame);
myButton.gotoURLBehaviors.add({ url: myURL});


function convertToButton(/*PageItem*/obj, /*str*/bName, /*str*/bDesc)
{
     app.selection = [obj];
     var maCreateButton = app.menuActions.item('$ID/$$$/Dialog/CmdName/CreateButton'),
          ret;

     if( !maCreateButton.isValid ) return false;

     maCreateButton.invoke();
     ret = app.selection[0];
         
     ret.name = bName||ret.name;
     ret.description = bDesc||ret.description;
         
     return ret;
};
 
  • Спасибо
Реакции: Flame и LeonidB
Может быть, вот так будет проще? Чтобы заранее не копировать ссылку, можно выделить фрейм с QR-кодом, запустить скрипт, в появившемся окне изменения QR-кода нажать Ctrl+C, скопировав ссылку, затем нажать любую кнопку (ОК или Отмена - без разницы) и в последующем окне ввести ссылку, нажав Ctrl+V и затем нажать ОК. В принципе, так можно быстро наделать кнопок.
JavaScript:
app.menuActions.item("Edit QR Code...").invoke();
var myURL = (prompt ("Введите URL»", "test"));
var myFrame = app.activeDocument.selection[0];
//myFrame.createHyperlinkQRCode(myURL);
var myButton = convertToButton(myFrame);
myButton.gotoURLBehaviors.add({ url: myURL});


function convertToButton(/*PageItem*/obj, /*str*/bName, /*str*/bDesc)
{
     app.selection = [obj];
     var maCreateButton = app.menuActions.item('$ID/$$$/Dialog/CmdName/CreateButton'),
          ret;

     if( !maCreateButton.isValid ) return false;

     maCreateButton.invoke();
     ret = app.selection[0];
          
     ret.name = bName||ret.name;
     ret.description = bDesc||ret.description;
          
     return ret;
};
 
  • Спасибо
Реакции: LeonidB
А это не решит проблему?
 
  • Спасибо
Реакции: LeonidB
Просто запустить...
JavaScript:
//=======================================
addHyperlinkQRCode();
function addHyperlinkQRCode(){
    var myDoc = app.documents[0];
    var apis;
    for(var i = 0; i < myDoc.pages.length; i++){
        apis = myDoc.pages[i].allPageItems;
        for(var p = 0; p < apis.length; p++){
            try{
                if(apis[p].epss.length > 0){
                    var QRCode = getHyperlinkQRCode(apis[p].epss[0]);
                    if(QRCode != null){
                        apis[p].createHyperlinkQRCode(QRCode);
                        var src=myDoc.hyperlinkPageItemSources.add(apis[p]);
                        var dest = myDoc.hyperlinkURLDestinations.add(QRCode);
                        myDoc.hyperlinks.add(src, dest);
                        }
                    }
                }
            catch(e){}
            }
        }
    }
//=======================================
function getHyperlinkQRCode(QRCodeObject){
    try{
        var idmsFile = File (Folder.temp+"/~QR.idms");
        QRCodeObject.exportFile(ExportFormat.INDESIGN_SNIPPET, idmsFile);
        idmsFile.encoding = "UTF-8";
        idmsFile.open("r");
        var allData = new XML (idmsFile.read());
        idmsFile.close();
        idmsFile.remove();
        var qrcode = allData..HyperlinkQRCode.@UrlLink;
        if(qrcode.length() == 1) {
            return qrcode.toString();
            }
        else{
            null;
            }
        }
    catch(e){
        return null;
        }
    }
 
  • Спасибо
Реакции: LeonidB и densen
Просто запустить...
Отличный код, но только он делает URL в панели Hyperlinks, а не встраивает URL в кнопку. 1000+ гиперлинков в документе - плохая идея.
Вот этот код будет делать изначально планируемое.
JavaScript:
//=======================================
addHyperlinkQRCode();
function addHyperlinkQRCode(){
    var myDoc = app.documents[0];
    var apis;
    for(var i = 0; i < myDoc.pages.length; i++){
        apis = myDoc.pages[i].allPageItems;
        for(var p = 0; p < apis.length; p++){
            try{
                if(apis[p].epss.length > 0){
                    var QRCode = getHyperlinkQRCode(apis[p].epss[0]);
                    if(QRCode != null){
                    var myButton = convertToButton(apis[p]);
                    myButton.gotoURLBehaviors.add({url: QRCode});
                        }
                    }
                }
            catch(e){}
            }
        }
    }
//=======================================
function getHyperlinkQRCode(QRCodeObject){
    try{
        var idmsFile = File (Folder.temp+"/~QR.idms");
        QRCodeObject.exportFile(ExportFormat.INDESIGN_SNIPPET, idmsFile);
        idmsFile.encoding = "UTF-8";
        idmsFile.open("r");
        var allData = new XML (idmsFile.read());
        idmsFile.close();
        idmsFile.remove();
        var qrcode = allData..HyperlinkQRCode.@UrlLink;
        if(qrcode.length() == 1) {
            return qrcode.toString();
            }
        else{
            null;
            }
        }
    catch(e){
        return null;
        }
    }

function convertToButton(/*PageItem*/obj, /*str*/bName, /*str*/bDesc)
{
     app.selection = [obj];
     var maCreateButton = app.menuActions.item('$ID/$$$/Dialog/CmdName/CreateButton'),
          ret;

     if( !maCreateButton.isValid ) return false;

     maCreateButton.invoke();
     ret = app.selection[0];
          
     ret.name = bName||ret.name;
     ret.description = bDesc||ret.description;
          
     return ret;
};
 
Вот этот код будет делать изначально планируемое.
:) Ну и чудненько :) Леонид получил желаемое :) Правда мне думается поужинать можно пока отработает, главное чтоб ID не вылетал :)
 
  • Спасибо
Реакции: LeonidB и densen
Леонид получил желаемое :)

Не по теме:

Не, народ, я не просто получил желаемое, я просто реально прифигел, когда вернулся к компьютеру и это желаемое пощупал. Господа, вы реально (даже нереально!!!) круты, круче, чем весь вот этот остальной интернет, вместе взятый. :)


densen, Drawer, Flame, iv-mi, спасибо!!!​