6 Replies Latest reply on Dec 18, 2016 8:41 AM by Terkelsen

    Export text from grouped items

    Terkelsen

      I have found the following script, that does a really good job of exporting all text from an InDesign document in a chosen format. The only problem seems to be, that text from grouped objects is not exported. Could anybody help to tweak the script to handle these items as well?

       

      if(app.documents.length != 0){

           if(app.documents.item(0).stories.length != 0){

                myGetFileName(app.documents.item(0).name);

           }

      }

      //========================= FUNCTIONS ===========================

      function myGetFileName(myDocumentName){

           var myFilePath = File.saveDialog("Save Exported Text As:");

           if(myFilePath != null){

                myDisplayDialog(myDocumentName, myFilePath);

           }

      }

      //---------------------------------------------------------------------------------------- ----------------------

      function myDisplayDialog(myDocumentName, myFilePath){

           //Need to get export format, story separator.

           var myExportFormats = ["Text Only", "Tagged Text", "RTF"];

           var myDialog = app.dialogs.add({name:"ExportAllStories"});

           with(myDialog.dialogColumns.add()){

                with(dialogRows.add()){

                     with(dialogColumns.add()){

                          var myExportFormatDropdown = dropdowns.add({stringList:myExportFormats, selectedIndex:2});

                     }

                }

                with(dialogRows.add()){

                     var myAddSeparatorCheckbox = checkboxControls.add({staticLabel:"Add separator line", checkedState:true});

                }

           }

           var myResult = myDialog.show();

           if(myResult == true){

                var myExportFormat = myExportFormats[myExportFormatDropdown.selectedIndex];

                var myAddSeparator = myAddSeparatorCheckbox.checkedState;

                myDialog.destroy();

                myExportAllText(myDocumentName, myFilePath, myExportFormat, myAddSeparator);

           }

           else{

                myDialog.destroy();

           }

      }

       

       

      //---------------------------------------------------------------------------------------- ----------------------

      function myExportAllText(myDocumentName, myFilePath, myExportFormat, myAddSeparator){

           var myPage, myStory;

           var myExportedStories = [];

           var myTempFolder = Folder.temp;

           var myTempFile = File(myTempFolder + "/tempTextFile.txt");

           var myNewDocument = app.documents.add();

           var myDocument = app.documents.item(myDocumentName);

           var myTextFrame = myNewDocument.pages.item(0).textFrames.add({geometricBounds:myGetBounds(myNewDocument, myNewDocument.pages.item(0))});

           var myNewStory = myTextFrame.parentStory;

           for (var i = 0; i < myDocument.pages.length; i++) {

                myPage = myDocument.pages.item(i);

                for (var t = 0; t < myPage.textFrames.length; t++){

                     myStory = myPage.textFrames[t].parentStory;

                     if (!IsInArray(myStory.id, myExportedStories)) {

                          //Export the story as tagged text.

                          myStory.exportFile(ExportFormat.taggedText, myTempFile);

                          myExportedStories.push(myStory.id);

                          //Import (place) the file at the end of the temporary story.

                          myNewStory.insertionPoints.item(-1).place(myTempFile);

                          //If the imported text did not end with a return, enter a return

                          //to keep the stories from running together.

                          if(i != myDocument.stories.length -1){

                               if(myNewStory.characters.item(-1).contents != "\r"){

                                    myNewStory.insertionPoints.item(-1).contents = "\r";

                               }

                               if(myAddSeparator == true){

                                    myNewStory.insertionPoints.item(-1).contents = "----------------------------------------\r";

                               }

                          }

                     } // if not exported

                } // for text frames

           } // for pages

           switch(myExportFormat){

                case "Text Only":

                     myFormat = ExportFormat.textType;

                     myExtension = ".txt"

                     break;

                case "RTF":

                     myFormat = ExportFormat.RTF;

                     myExtension = ".rtf"

                     break;

                case "Tagged Text":

                     myFormat = ExportFormat.taggedText;

                     myExtension = ".txt"

                     break;

           }

           myNewStory.exportFile(myFormat, File(myFilePath));

           myNewDocument.close(SaveOptions.no);

           myTempFile.remove();

      }

      //---------------------------------------------------------------------------------------- ----------------------

      function myGetBounds(myDocument, myPage){

           var myPageWidth = myDocument.documentPreferences.pageWidth;

           var myPageHeight = myDocument.documentPreferences.pageHeight

           if(myPage.side == PageSideOptions.leftHand){

                var myX2 = myPage.marginPreferences.left;

                var myX1 = myPage.marginPreferences.right;

           }

           else{

                var myX1 = myPage.marginPreferences.left;

                var myX2 = myPage.marginPreferences.right;

           }

           var myY1 = myPage.marginPreferences.top;

           var myX2 = myPageWidth - myX2;

           var myY2 = myPageHeight - myPage.marginPreferences.bottom;

           return [myY1, myX1, myY2, myX2];

      }

      //---------------------------------------------------------------------------------------- ----------------------

      function IsInArray(myString, myArray) {

           for (x in myArray) {

                if (myString == myArray[x]) {

                     return true;

                }

           }

           return false;

      }

        • 1. Re: Export text from grouped items
          Laubender Adobe Community Professional & MVP

          Hi,
          I would ask the author of that script.

           

          Regards,
          Uwe

          • 2. Re: Export text from grouped items
            Terkelsen Level 1

            I certainly would, if I knew who wrote the original script :-)

            • 3. Re: Export text from grouped items
              Wosven Level 1

              Hi,

               

              You can look at: https://forums.adobe.com/thread/733900

               

              or change/use this part of code:

               

              // by groups
              var theGroups = myDocument.pages[p].groups;
              for(var g = 0, gln = theGroups.length; g < gln; g++){
                  var grp = theGroups[g];
              
                  for(var t = 0; t < grp.textFrames.length;t++){
                      b = grp.textFrames[t];
                      if (b instanceof TextFrame) {
                          // code here...
                      }
                  }
              } 
              

               


              Swo

              • 4. Re: Export text from grouped items
                Terkelsen Level 1

                Hi Wosven,

                 

                Thank you so much for trying to help me and excuse my ignorance, but where exactly would you place the code you suggest into the following script? I keep getting errors like “[p] is not defined”:

                 

                             

                if(app.documents.length != 0){

                     if(app.documents.item(0).stories.length != 0){

                          myGetFileName(app.documents.item(0).name);

                     }

                }

                //========================= FUNCTIONS ===========================

                function myGetFileName(myDocumentName){

                     var myFilePath = File.saveDialog("Save Exported Text As:");

                     if(myFilePath != null){

                          myDisplayDialog(myDocumentName, myFilePath);

                     }

                }

                //

                • 5. Re: Export text from grouped items
                  Wosven Level 1

                  Hi,

                  "p" stand for the "page" in my original script, here, you need to replace it by "i".

                  Here an example with a group and a sub-level of group (a group in a group is exported too).

                   

                  Text isn't exported depending on position in the page, so this script would need more tweaking, since you need to reorder exported texts.

                   

                   

                  if(app.documents.length != 0){
                       if(app.documents.item(0).stories.length != 0){
                              myGetFileName(app.documents.item(0).name);
                       }
                  }
                  //========================= FUNCTIONS ===========================
                  function myGetFileName(myDocumentName){
                       var myFilePath = File.saveDialog("Save Exported Text As:");
                       if(myFilePath != null){
                              myDisplayDialog(myDocumentName, myFilePath);
                       }
                  }
                  //---------------------------------------------------------------------------------------- ----------------------
                  function myDisplayDialog(myDocumentName, myFilePath){
                       //Need to get export format, story separator.
                       var myExportFormats = ["Text Only", "Tagged Text", "RTF"];
                       var myDialog = app.dialogs.add({name:"ExportAllStories"});
                       with(myDialog.dialogColumns.add()){
                              with(dialogRows.add()){
                                   with(dialogColumns.add()){
                                      var myExportFormatDropdown = dropdowns.add({stringList:myExportFormats, selectedIndex:2});
                                   }
                              }
                              with(dialogRows.add()){
                                   var myAddSeparatorCheckbox = checkboxControls.add({staticLabel:"Add separator line", checkedState:true});
                              }
                       }
                       var myResult = myDialog.show();
                       if(myResult == true){
                              var myExportFormat = myExportFormats[myExportFormatDropdown.selectedIndex];
                              var myAddSeparator = myAddSeparatorCheckbox.checkedState;
                              myDialog.destroy();
                              myExportAllText(myDocumentName, myFilePath, myExportFormat, myAddSeparator);
                       }
                       else{
                              myDialog.destroy();
                       }
                  }
                  
                  
                  //---------------------------------------------------------------------------------------- ----------------------
                  function myExportAllText(myDocumentName, myFilePath, myExportFormat, myAddSeparator){
                       var myPage, myStory;
                       var myExportedStories = [];
                       var myTempFolder = Folder.temp;
                       var myTempFile = File(myTempFolder + "/tempTextFile.txt");
                       var myNewDocument = app.documents.add();
                       var myDocument = app.documents.item(myDocumentName);
                       var myTextFrame = myNewDocument.pages.item(0).textFrames.add({geometricBounds:myGetBounds(myNewDocument, myNewDocument.pages.item(0))});
                       var myNewStory = myTextFrame.parentStory;
                       for (var i = 0; i < myDocument.pages.length; i++) {
                              myPage = myDocument.pages.item(i);
                              for (var t = 0; t < myPage.textFrames.length; t++){
                                   myStory = myPage.textFrames[t].parentStory;
                                   if (!IsInArray(myStory.id, myExportedStories)) {
                                      //Export the story as tagged text.
                                      myStory.exportFile(ExportFormat.taggedText, myTempFile);
                                      myExportedStories.push(myStory.id);
                                      //Import (place) the file at the end of the temporary story.
                                      myNewStory.insertionPoints.item(-1).place(myTempFile);
                                      //If the imported text did not end with a return, enter a return
                                      //to keep the stories from running together.
                                      if(i != myDocument.stories.length -1){
                                           if(myNewStory.characters.item(-1).contents != "\r"){
                                                  myNewStory.insertionPoints.item(-1).contents = "\r";
                                           }
                                           if(myAddSeparator == true){
                                                  myNewStory.insertionPoints.item(-1).contents = "----------------------------------------\r";
                                           }
                                      }
                                   } // if not exported
                              } // for text frames
                  
                          // by groups
                          var theGroups = myDocument.pages[i].groups;
                          for(var g = 0, gln = theGroups.length; g < gln; g++){
                              var grp = theGroups[g];
                  
                              // try second level of groups (nested group)
                              if (grp.groups.length > 0) {
                                  for(var g2 = 0, gln2 = grp.groups.length; g2 < gln2; g2++){
                                      var grp2 = grp.groups[g2];
                  
                                      for(var t2 = 0; t2 < grp2.textFrames.length;t2++){
                                          b2 = grp2.textFrames[t2];
                                          if (b2 instanceof TextFrame) {
                  
                                              // code here...
                                              myStory = b2.parentStory;
                                              if (!IsInArray(myStory.id, myExportedStories)) {
                                                  //Export the story as tagged text.
                                                  myStory.exportFile(ExportFormat.taggedText, myTempFile);
                                                  myExportedStories.push(myStory.id);
                                                  //Import (place) the file at the end of the temporary story.
                                                  myNewStory.insertionPoints.item(-1).place(myTempFile);
                                                  //If the imported text did not end with a return, enter a return
                                                  //to keep the stories from running together.
                                                  if (i != myDocument.stories.length -1) {
                                                      if (myNewStory.characters.item(-1).contents != "\r") {
                                                          myNewStory.insertionPoints.item(-1).contents = "\r";
                                                      }
                                                      if (myAddSeparator == true) {
                                                          myNewStory.insertionPoints.item(-1).contents = "----------------------------------------\r";
                                                      }
                                                  }
                                              } // if not exported
                                          } // if TextFrame
                                      } // for grp2
                                  } // for
                              } // if grp2
                  
                  
                              for(var t = 0; t < grp.textFrames.length;t++){
                                  b = grp.textFrames[t];
                                  if (b instanceof TextFrame) {
                  
                                      // code here...
                                       myStory = b.parentStory;
                                       if (!IsInArray(myStory.id, myExportedStories)) {
                                          //Export the story as tagged text.
                                          myStory.exportFile(ExportFormat.taggedText, myTempFile);
                                          myExportedStories.push(myStory.id);
                                          //Import (place) the file at the end of the temporary story.
                                          myNewStory.insertionPoints.item(-1).place(myTempFile);
                                          //If the imported text did not end with a return, enter a return
                                          //to keep the stories from running together.
                                          if (i != myDocument.stories.length -1) {
                                              if (myNewStory.characters.item(-1).contents != "\r") {
                                                  myNewStory.insertionPoints.item(-1).contents = "\r";
                                              }
                                              if (myAddSeparator == true) {
                                                  myNewStory.insertionPoints.item(-1).contents = "----------------------------------------\r";
                                              }
                                          }
                                       } // if not exported
                  
                                  }
                              } // for grp
                          }
                       } // for pages
                       switch(myExportFormat){
                              case "Text Only":
                                   myFormat = ExportFormat.textType;
                                   myExtension = ".txt"
                                   break;
                              case "RTF":
                                   myFormat = ExportFormat.RTF;
                                   myExtension = ".rtf"
                                   break;
                              case "Tagged Text":
                                   myFormat = ExportFormat.taggedText;
                                   myExtension = ".txt"
                                   break;
                       }
                       myNewStory.exportFile(myFormat, File(myFilePath));
                       myNewDocument.close(SaveOptions.no);
                       myTempFile.remove();
                  }
                  //---------------------------------------------------------------------------------------- ----------------------
                  function myGetBounds(myDocument, myPage){
                       var myPageWidth = myDocument.documentPreferences.pageWidth;
                       var myPageHeight = myDocument.documentPreferences.pageHeight
                       if(myPage.side == PageSideOptions.leftHand){
                              var myX2 = myPage.marginPreferences.left;
                              var myX1 = myPage.marginPreferences.right;
                       }
                       else{
                              var myX1 = myPage.marginPreferences.left;
                              var myX2 = myPage.marginPreferences.right;
                       }
                       var myY1 = myPage.marginPreferences.top;
                       var myX2 = myPageWidth - myX2;
                       var myY2 = myPageHeight - myPage.marginPreferences.bottom;
                       return [myY1, myX1, myY2, myX2];
                  }
                  //---------------------------------------------------------------------------------------- ----------------------
                  function IsInArray(myString, myArray) {
                       for (x in myArray) {
                              if (myString == myArray[x]) {
                                   return true;
                              }
                       }
                       return false;
                  }
                  

                   

                   

                  Swo

                  • 6. Re: Export text from grouped items
                    Terkelsen Level 1

                    Thank you so much, Wosven! This works perfect.

                     

                    The order is not important as long as you can search the full text, which you can now. Thanks again!