Automator / Applescript Batch export

Is it possible to create automator actions or applescript that will batch export a folder of keynote documents to .mov files?

No you can't batch them all at once because Quicktime is used for rendering the slideshow and it's a one at a time operation. It might be done with Applescript but you'd have to ask over in the Applescript forum for help with that.
TIP: For insurance against the iPhoto database corruption that many users have experienced I recommend making a backup copy of the Library6.iPhoto (iPhoto.Library for iPhoto 5 and earlier) database file and keep it current. If problems crop up where iPhoto suddenly can't see any photos or thinks there are no photos in the library, replacing the working Library6.iPhoto file with the backup will often get the library back. By keeping it current I mean backup after each import and/or any serious editing or work on books, slideshows, calendars, cards, etc. That insures that if a problem pops up and you do need to replace the database file, you'll retain all those efforts. It doesn't take long to make the backup and it's good insurance.
I've created an Automator workflow application (requires Tiger or later), iPhoto dB File Backup, that will copy the selected Library6.iPhoto file from your iPhoto Library folder to the Pictures folder, replacing any previous version of it. It's compatible with iPhoto 6 and 7 libraries and Tiger and Leopard. Just put the application in the Dock and click on it whenever you want to backup the dB file. iPhoto does not have to be closed to run the application, just idle. You can download it at Toad's Cellar. Be sure to read the Read Me pdf file.
Note: There's now an Automator backup application for iPhoto 5 that will work with Tiger or Leopard.

Similar Messages

  • Batch Export Slideshows?  Automator?

    I have about 15 lengthy slideshows to export to .mov files, this takes a while for each one. Is there anyway I can make it batch export so I don't have to keep hopping back to my computer to set the next one to export? Automator looks like a promising tool for this, but I'm not sure how to make it select a different slideshow each time and give it a different name? Any suggestions would be greatly appreciated.

    No you can't batch them all at once because Quicktime is used for rendering the slideshow and it's a one at a time operation. It might be done with Applescript but you'd have to ask over in the Applescript forum for help with that.
    TIP: For insurance against the iPhoto database corruption that many users have experienced I recommend making a backup copy of the Library6.iPhoto (iPhoto.Library for iPhoto 5 and earlier) database file and keep it current. If problems crop up where iPhoto suddenly can't see any photos or thinks there are no photos in the library, replacing the working Library6.iPhoto file with the backup will often get the library back. By keeping it current I mean backup after each import and/or any serious editing or work on books, slideshows, calendars, cards, etc. That insures that if a problem pops up and you do need to replace the database file, you'll retain all those efforts. It doesn't take long to make the backup and it's good insurance.
    I've created an Automator workflow application (requires Tiger or later), iPhoto dB File Backup, that will copy the selected Library6.iPhoto file from your iPhoto Library folder to the Pictures folder, replacing any previous version of it. It's compatible with iPhoto 6 and 7 libraries and Tiger and Leopard. Just put the application in the Dock and click on it whenever you want to backup the dB file. iPhoto does not have to be closed to run the application, just idle. You can download it at Toad's Cellar. Be sure to read the Read Me pdf file.
    Note: There's now an Automator backup application for iPhoto 5 that will work with Tiger or Leopard.

  • Automator Workflow to export Numbers documents in PDF format

    Does anyone know of any automator workflow to export Numbers documents in PDF format? I tried this program: Convert to PDF 1.2
    http://www.apple.com/downloads/macosx/automator/converttopdf_mauriziominelli.htm l
    But it gives an error.

    Reading carefully is often useful.
    The description of the tool which you tried clearly states :
    *About Convert to PDF*
    *_Convert all of your text files to PDF_. This action uses the underlying cups printing system ability to convert files, it’s a simple front end to the command line tool cupsfilter.*
    As far as I know, but maybe you don't, *_a Numbers document isn't a text file._*
    I already posted a script exporting Numbers documents as PDF.
    Here is an enhanced version which apply only to Numbers '09 (or maybe higher) :
    --[SCRIPT save2Numbers&PDF.app]
    Enregistrer le script en tant que Script : save2Numbers&PDF.scpt
    déplacer le fichier créé dans le dossier
    <VolumeDeDémarrage>:Users:<votreCompte>:Library:Scripts:Applications:Numbers:
    Il vous faudra peut-être créer le dossier Numbers et peut-être même le dossier Applications.
    aller au menu Scripts , choisir Numbers puis choisir save2Numbers&PDF
    Le script enregistre le document au format natif de Numbers
    et l'enregistre dans un fichier PDF.
    S'il existe déjà un PDF homonyme, il est renommé en lui ajoutant une chaîne
    construite sur sa date de modification.
    --=====
    L'aide du Finder explique:
    L'Utilitaire AppleScript permet d'activer le Menu des scripts :
    Ouvrez l'Utilitaire AppleScript situé dans le dossier Applications/AppleScript.
    Cochez la case "Afficher le menu des scripts dans la barre de menus".
    +++++++
    Save the script
    as a Script: save2Numbers&PDF.scpt
    Move the newly created file into the folder:
    <startup Volume>:Users:<yourAccount>:Library:Scripts:Applications:Numbers:
    Maybe you would have to create the folder Numbers and even the folder Applications by yourself.
    go to the Scripts Menu, choose Numbers, then choose save2Numbers&PDF
    The script saves the document in the native Numbers format and saves it in a .pdf file
    If such a .pdf already exists, it is renamed with a stamp matching its modification date.
    --=====
    The Finder's Help explains:
    To make the Script menu appear:
    Open the AppleScript utility located in Applications/AppleScript.
    Select the "Show Script Menu in menu bar" checkbox
    --=====
    Yvan KOENIG (VALLAURIS, France)
    modifié 2010/08/17
    property closeIt : true
    (* true = closes the saved document
    false = doesn't close it *)
    property theApp : "Numbers"
    property theExt : "numbers"
    --=====
    on run
    tell application theApp
    activate
    set le_document to front document
    if modified of le_document then save le_document
    delay 0.2
    set thePath to path of document 1
    end tell -- theapp
    set {xPath, xExt} to my saveAs(thePath)
    if closeIt then tell application theApp to close document 1 saving no
    end run
    --=====
    on saveAs(p)
    local extension_export, type_export, nomde_loriginal, dossierde_loriginal, nomde_lexport, cheminde_lexport
    set {extension_export, type_export} to {"pdf", "LSDocumentTypePDF"}
    set {nomde_loriginal, dossierde_loriginal} to my quelNomEtDossier(p)
    if nomde_loriginal ends with theExt then
    • replace the original extension by the xExt one *)
    set nomde_lexport to (text 1 thru -(1 + (length of theExt)) of nomde_loriginal) & extension_export
    else
    • add the xExt extension name *)
    set nomde_lexport to nomde_loriginal & "." & extension_export
    end if
    set cheminde_lexport to dossierde_loriginal & nomde_lexport
    • CAUTION, When saving, Numbers doesn't take care of an existing document.
    It replaces it by the new one. *)
    tell application "System Events"
    if exists (file cheminde_lexport) then
    Playing safety, we rename the existing file by inserting a modificationdatetime stamp *)
    set name of file cheminde_lexport to (text 1 thru -(2 + (length of extension_export)) of nomde_lexport) & my horoDateur(modification date of file cheminde_lexport) & "." & extension_export
    end if
    end tell -- System Events
    • save as type_export document *)
    tell application "Numbers" to save document nomde_loriginal as type_export in cheminde_lexport
    return {cheminde_lexport, extension_export}
    end saveAs
    -- =====
    on quelNomEtDossier(f)
    local nom, dossier
    tell application "System Events" to tell file (f as Unicode text)
    set nom to name (* Unicode text *)
    set dossier to path of container (* Unicode HFS path *)
    end tell -- to System Events
    return {nom, dossier}
    end quelNomEtDossier
    --=====
    • Build a stamp from the modification date_time
    on horoDateur(datedemodification)
    local les_secondes
    set les_secondes to time of datedemodification
    return ("_" & year of datedemodification & text -2 thru -1 of ("0" & (month of datedemodification as integer)) & text -2 thru -1 of ("0" & day of datedemodification) & "_" & text -2 thru -1 of ("0" & les_secondes div 3600) & text -2 thru -1 of ("0" & (les_secondes mod 3600) div 60) & text -2 thru -1 of ("0" & les_secondes mod 60))
    (* Here, the stamp is "YYYYMMDDhhmmss" *)
    end horoDateur
    --=====
    --[/SCRIPT]
    Yvan KOENIG (VALLAURIS, France) mardi 17 août 2010 18:16:27

  • Batch export possible?

    first a little backstory - my band recorded all of our songs at a real studio - we did all the instruments live going to 2" tape on a studer A-80 (for those of you who care). i took rough mixes home, and i have recorded all of my vocals in garageband to that mix for every song. i now have around 5-6 takes for all 6 songs we recorded, and i want to export every single vocal track separately so we can bring them back to the studio we recorded at, and mix them properly. does anyone know of a way to batch export every single track separately, rather than mute each one i want and export one at a time? i'm wondering if automator might be able to help?
    thanks in advance for any suggestions anyone may have.

    Thanks for the quick response, Jim.  I need the splash images to match the videos they came from, which are going to be all different sizes, so I don't think batch resizing will work.
    Do you know of any other software that can do this?  This may not be the place to ask that, but I wouldn't know where else to start.
    Thanks,
    Calvin

  • QuickTime batch export ?

    Hi,
    Can QuickTime Pro do movie batch export ?
    thanks

    With some Automator help it's easy to batch convert. If your setting requirements are identical use this Automator action:
    http://www.apple.com/downloads/macosx/automator/quicktimecompressionactionsandwo rkflow.html
    QuickTime 7 can also export more than one file and these settings can be different formats, codecs etc.
    Just open the file and export (you choose from the dialog windows). Open another file, change the settings and export. And again. And again.

  • API for batch export to CMS

    Hello Experts,
    I am trying to locate an API that could replicate the features of the publishing wizard, but for local wid files - ie, batch export local wid files to BOE.
    Is this possible?
    Regards,
    Bobby

    Does anyone have an Automator workflow or script that will give the same result as we can get from Quick Time Pro when we chose Export to Apple TV?Here is a RippleCast which may be of interest to you. You can open it directly in the QT Player using the "Open URL" File option:
    http://homepage.mac.com/jrwalker4/.Public/Automator for the People.mp4/
    In addition. remember that QT Pro is designed for parallel processing natively. You can, of course, open multiple source files and export them simultaneously rather than opting to "sequentially" process one file at a time, one file after the other. This approach does not save any time since each file is individually processed more slowly but has about the same effect as batch processing the same number of files sequentially. I usually just close the players and leave the multiple "Progress Bar" window open to monitor activity (or just go to bed) while QT is working.

  • How do i change the size of a clip using batch export?

    hi, when i try and do a batch export to change my clips from a DV PAL to PhotoJpeg 320*240 sized clips the "options" button is greyed out. so all i have as export settings are the QT presets in a pulldown list. is there any way i can create my own setting? (and the also save that?)
    thx

    what i'm seeing is that
    a) selecting all files in Media Man. gives me the option to size and set codecs but not the audio off.
    b) selecting all files in Batch Export allows me to pick a format (QT, aiff etc) choose a preset (photoJpeg included) select whether to include audio and video or both but not set the size or customize the QT settings
    c) selecting all clips then "file>export>using QT conversion" gives me all options, but seem to grab only the first clip.

  • Is there a way to select multiple sequences and batch export them using the same settings in CS6?

    I am a current Final Cut Pro7 user and looking to switch over to Premiere Pro CS6.  We edit approx. 100 short (15 sec.) videos daily, and then select them all at the end of the day and batch export them over night using the same export recipe for all. I have having trouble finding an easy way to do this in Premiere pro CS6, as command +E is grayed out if i select more than one sequence at a time. 
    so far, it appears that i have to select each video individually and manually set encoding recipe and export location for each....  Not only would this be terribly time consuming, but it leaves a lot of room for error and missed videos.  I thought i would be able to send all of the sequences to Adobe Media Encoder,  but i dont see that option either.
    Any suggestions/
    thanks!

    Open Media Encoder and add your Sequences:
    File > Add Premiere Pro Sequence
    Navigate to your Premiere Project and select it in the list.
    You can then select multiple Sequences from the Project (Ctrl+Click)
    and load them all at once into Media Encoder and apply
    the same encoding preset to all Sequences at the same time.

  • Help Needed: Automator Applescript for Folder Action - Encode Video

    Hi !
    I have created an Automator Applescript for a Folder Action to do the following:
    When a new video file is moved to the target folder (i.e. Download of Vuze is done), automatically launch the Applescript Action that does the followin g(Applescripted):
    1) Using "run shell script" and FFMPEG on a UNIX command line, determine Width/Height, Framerate, Bitrate
    2) Calculate encoding parameters (slightly reduced bitrate, reduced Aspect etc.)
    3) Using "run shell script" with ffmpeg on the command line and the calculated parameters to encode the video file
    At the same time, the action is written to a log file so I know if a file is recognized, when encoding started etc.
    It works fine if I save this Action as an .app, make an alias on the Desktop and drop video files on it.
    It also works fine if I attach the script to a folder as a folder action and drag a video file in there.
    However, when I attach the script as a folder action to the Vuze download folder, it encodes only some video files, i.e. if there was a download of 5 files, chances are good that it will not encode 1 or 2 files out of those 5.
    If for example a second download finishes while the encoding for the first download is still going on, sometimes the second file starts encoding after the first encode finishes, sometimes it does not, the file does not make the log file at all, i.e. the folder action missed it or the automator action dropped it because it was still encoding. Still, sometimes it happens, sometimes not.
    As I need a solution that is 100% accurate, I would like to ask if there are any ideas on how to do this better maybe? As I am not an Applescript Guru, I would need some help to know what works and what doesn't and what the syntax is.
    My main idea right now:
    Similar to how ffmpegX works with its "process" application, have a second script (as .app) that receives the files to be encoded from the automator action and puts them in a queue, then proceeds to encode this queue while the main automator action is free to receive the next file.
    Writing this second app is quite straightforward (a modified version of my current script) but I have some questions I need help with:
    1) How do I call another applescript from within an existing applescript that launches the new applescript in a new process?
    2) How do I pass parameters to this new applescript?
    3) In case of this "Queueing" Idea, once I called the external applescript the first time, how do I make sure when I call next time, that I don't open a second instance of this script but rather pass another queue item to the original instance to be processed?
    Or in general: Is there a better way to achieve this automatic encoding solution that I have not thought about?
    Alternatively:
    Does anyone know how to call the "process" application that comes with the ffmpegX package with the correct parameters to use as a queueing / processing tool?
    Thanks!
    Joe
    Message was edited by: Joe15000
    Message was edited by: Joe15000

    To do this, I created an Automator workflow with an Applescript snippet to change the 'media kind'.
    Here is the 'Run Applescript' workflow step code:
    on run {input, parameters}
              tell application "iTunes"
                        set video kind of (item 1 of input) to movie
              end tell
              return input
    end run
    Prior to this running, I have an 'Import Files into iTunes' workflow step.
    You can switch out 'movie' with: 'TV show', 'music video', or anything in ITLibMediaItemMediaKind.
    Good luck,
    Glenn

  • No Method of Batch Export for Clips with Alpha Channels?

    Good morning,
    As many a flustered editor has eventually discovered, in order for FCP to export sequences with alpha channels to a 32-bit format, the timeline has to be un-rendered at the time of export, or else the transparent parts will appear black in the outputted file. This sort-of makes sense if you know how FCP and render files work, but in a perfect world I think I'd have designed the export interface a bit differently. Now that I think about it, I'm actually working in an Animation (Millions of Colors +) sequence, so converting transparent areas to black makes no logical sense at all.
    Anyway, I have several sequences that I would like to export as 32-bit TGA QuickTime files, preserving their transparency. If I Export Using Compressor, the process results in pre-rendering of the sequence, turning the transparent areas black. The same problem occurs if I export QuickTime reference movies from FCP and open them directly with Compressor.
    Does anyone know of a way to avoid this silly phenomenon or am I stuck individually exporting each sequence from FCP, one...at.......a................time?
    Thanks,
    Zap

    Thanks, Andy, "Batch Export" eventually did the trick!
    I forgot about that tool because I've never actually had to use it before! After playing around with it for a while, I found that as long as the sequence settings for each sequence in the batch are set to a codec with an activated alpha channel, it works just fine.
    Thanks again,
    Zap

  • How batch export layers to files png in cc

    I am having trouble with an export layers to files script i am wanting to batch export layer to png and this script i have seems to be the one i want although every time i run the script i get this error message "could not complete the action  since the destination folder doesn't exist" the script required me to hard code my destination path the path i require is "C:/Users/Tim/Desktop/Backdrops/png/" I am not completely sure why its stating it does not exist any help would be greatly appreciated. i have tried to contact the creator but the post it was on was very old.
    // enable double clicking from the Macintosh Finder or the Windows Explorer
    #target photoshop
    //=================================================================
    // Globals
    //=================================================================
    var exportPath = "/Users/pedr/Documents/Work/Clients/Pathways/Learning_Hub/Source/Comics/export";
    exportPath = exportPath + '/layers';
    // UI strings to be localized
    var strTitle = localize("$$$/JavaScripts/X2L/Title=X2L");
    var strButtonRun = localize("$$$/JavaScripts/X2L/Run=Run");
    var strButtonCancel = localize("$$$/JavaScripts/X2L/Cancel=Cancel");
    var strHelpText = localize("$$$/JavaScripts/X2L/Help=Please specify the format and location for saving each layer as a file.");
    var strLabelDestination = localize("$$$/JavaScripts/X2L/Destination=Destination:");
    var strButtonBrowse = localize("$$$/JavaScripts/X2L/Browse=&Browse...");
    var strLabelFileNamePrefix = localize("$$$/JavaScripts/X2L/FileNamePrefix=File Name Prefix:");
    var strCheckboxVisibleOnly = localize("$$$/JavaScripts/X2L/VisibleOnly=&Visible Layers Only");
    var strLabelFileType = localize("$$$/JavaScripts/X2L/FileType=File Type:");
    var strCheckboxIncludeICCProfile = localize("$$$/JavaScripts/X2L/IncludeICC=&Include ICC Profile");
    var strJPEGOptions = localize("$$$/JavaScripts/X2L/JPEGOptions=JPEG Options:");
    var strLabelQuality = localize("$$$/JavaScripts/X2L/Quality=Quality:");
    var strCheckboxMaximizeCompatibility = localize("$$$/JavaScripts/X2L/Maximize=&Maximize Compatibility");
    var strTIFFOptions = localize("$$$/JavaScripts/X2L/TIFFOptions=TIFF Options:");
    var strLabelImageCompression = localize("$$$/JavaScripts/X2L/ImageCompression=Image Compression:");
    var strNone = localize("$$$/JavaScripts/X2L/None=None");
    var strPDFOptions = localize("$$$/JavaScripts/X2L/PDFOptions=PDF Options:");
    var strLabelEncoding = localize("$$$/JavaScripts/X2L/Encoding=Encoding:");
    var strTargaOptions = localize("$$$/JavaScripts/X2L/TargaOptions=Targa Options:");
    var strLabelDepth = localize("$$$/JavaScripts/X2L/Depth=Depth:");
    var strRadiobutton16bit = localize("$$$/JavaScripts/X2L/Bit16=16bit");
    var strRadiobutton24bit = localize("$$$/JavaScripts/X2L/Bit24=24bit");
    var strRadiobutton32bit = localize("$$$/JavaScripts/X2L/Bit32=32bit");
    var strBMPOptions = localize("$$$/JavaScripts/X2L/BMPOptions=BMP Options:");
    var strAlertSpecifyDestination = localize("$$$/JavaScripts/X2L/SpecifyDestination=Please specify destination.");
    var strAlertDestinationNotExist = localize("$$$/JavaScripts/X2L/DestionationDoesNotExist=Destination does not exist.");
    var strTitleSelectDestination = localize("$$$/JavaScripts/X2L/SelectDestination=Select Destination");
    var strAlertDocumentMustBeOpened = localize("$$$/JavaScripts/X2L/OneDocument=You must have a document open to export!");
    var strAlertNeedMultipleLayers = localize("$$$/JavaScripts/X2L/NoLayers=You need a document with multiple layers to export!");
    var strAlertWasSuccessful = localize("$$$/JavaScripts/X2L/Success= was successful.");
    var strUnexpectedError = localize("$$$/JavaScripts/X2L/Unexpected=Unexpected error");
    var strMessage = localize("$$$/JavaScripts/X2L/Message=X2L");
    var stretQuality = localize( "$$$/locale_specific/JavaScripts/X2L/ETQualityLength=30" );
    var stretDestination = localize( "$$$/locale_specific/JavaScripts/X2L/ETDestinationLength=160" );
    var strddFileType = localize( "$$$/locale_specific/JavaScripts/X2L/DDFileType=100" );
    var strpnlOptions = localize( "$$$/locale_specific/JavaScripts/X2L/PNLOptions=100" );
    var strPNG8Options = localize("$$$/JavaScripts/X2L/PNG8Options=PNG-8 Options:");
    var strCheckboxPNGTransparency = localize("$$$/JavaScripts/X2L/Transparency=Transparency");
    var strCheckboxPNGInterlaced = localize("$$$/JavaScripts/X2L/Interlaced=Interlaced");
    var strCheckboxPNGTrm = localize("$$$/JavaScripts/X2L/Trim=Trim Layers");
    var strPNG24Options = localize("$$$/JavaScripts/X2L/PNG24Options=PNG-24 Options:");
    // the drop down list indexes for file type
    var png24Index = 7;
    main();
    // Functions
    // Function: main
    // Usage: the core routine for this script
    // Input: <none>
    // Return: <none>
    function main() {
        if ( app.documents.length <= 0 ) {
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                alert( strAlertDocumentMustBeOpened );
            return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
        var exportInfo = new Object();
        initExportInfo(exportInfo);
        // look for last used params via Photoshop registry, getCustomOptions will throw if none exist
        try {
        catch(e) {
            // it's ok if we don't have any options, continue with defaults
        try {
            var docName = app.activeDocument.name;  // save the app.activeDocument name before duplicate.
            var layerCount = app.documents[docName].layers.length;
            var layerSetsCount = app.documents[docName].layerSets.length;
            if ((layerCount <= 1)&&(layerSetsCount <= 0)) {
                if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                    alert( strAlertNeedMultipleLayers );
                return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
            } else {
                var rememberMaximize;
                var needMaximize = exportInfo.psdMaxComp ? QueryStateType.ALWAYS : QueryStateType.NEVER;
                app.activeDocument = app.documents[docName];
                var duppedDocument = app.activeDocument.duplicate();
                duppedDocument.activeLayer = duppedDocument.layers[duppedDocument.layers.length-1]; // for removing
                setInvisibleAllArtLayers(duppedDocument);
                exportChildren(duppedDocument, app.documents[docName], exportInfo, duppedDocument, exportInfo.fileNamePrefix);
                duppedDocument.close( SaveOptions.DONOTSAVECHANGES );
                if ( rememberMaximize != undefined ) {
                    app.preferences.maximizeCompatibility = rememberMaximize;
                if ( DialogModes.ALL == app.playbackDisplayDialogs ) {
                    //alert(strTitle + strAlertWasSuccessful);
                app.playbackDisplayDialogs = DialogModes.ALL;
        } catch (e) {
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                alert(e);
            return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
    // Function: settingDialog
    // Usage: pop the ui and get user settings
    // Input: exportInfo object containing our parameters
    // Return: on ok, the dialog info is set to the exportInfo object
    function settingDialog(exportInfo) {
      return;
    // Function: hideAllFileTypePanel
    // Usage: hide all the panels in the common actions
    // Input: <none>, dlgMain is a global for this script
    // Return: <none>, all panels are now hidden
    function hideAllFileTypePanel() {
    // Function: initExportInfo
    // Usage: create our default parameters
    // Input: a new Object
    // Return: a new object with params set to default
    function initExportInfo(exportInfo) {
        //exportInfo.destination = new String(exportPath);
        exportInfo.fileNamePrefix = new String("untitled_");
        exportInfo.visibleOnly = false;
        exportInfo.fileType = png24Index;
        exportInfo.icc = true;
        exportInfo.png24Transparency = true;
        exportInfo.png24Interlaced = false;
        exportInfo.png24Trim = true;
        try {
            exportInfo.destination = Folder(new String(exportPath)).fsName; // destination folder
            var tmp = app.activeDocument.fullName.name;
            exportInfo.fileNamePrefix = decodeURI(tmp.substring(0, tmp.indexOf("."))); // filename body part
        } catch(someError) {
            exportInfo.destination = new String(exportPath);
            exportInfo.fileNamePrefix = app.activeDocument.name; // filename body part
    // Function: saveFile
    // Usage: the worker routine, take our params and save the file accordingly
    // Input: reference to the document, the name of the output file,
    //        export info object containing more information
    // Return: <none>, a file on disk
    function saveFile( docRef, fileNameBody, exportInfo) {
                saveFile(docRef, fileNameBody, exportInfo, false, true);
                function saveFile( docRef, fileNameBody, exportInfo, interlacedValue, transparencyValue) {
                var id6 = charIDToTypeID( "Expr" );
                    var desc3 = new ActionDescriptor();
                    var id7 = charIDToTypeID( "Usng" );
                        var desc4 = new ActionDescriptor();
                        var id8 = charIDToTypeID( "Op  " );
                        var id9 = charIDToTypeID( "SWOp" );
                        var id10 = charIDToTypeID( "OpSa" );
                        desc4.putEnumerated( id8, id9, id10 );
                        var id11 = charIDToTypeID( "Fmt " );
                        var id12 = charIDToTypeID( "IRFm" );
                        var id13 = charIDToTypeID( "PN24" );
                        desc4.putEnumerated( id11, id12, id13 );
                        var id14 = charIDToTypeID( "Intr" );
                        desc4.putBoolean( id14, interlacedValue );
                        var id15 = charIDToTypeID( "Trns" );
                        desc4.putBoolean( id15, transparencyValue );
                        var id16 = charIDToTypeID( "Mtt " );
                        desc4.putBoolean( id16, true );
                        var id17 = charIDToTypeID( "MttR" );
                        desc4.putInteger( id17, 255 );
                        var id18 = charIDToTypeID( "MttG" );
                        desc4.putInteger( id18, 255 );
                        var id19 = charIDToTypeID( "MttB" );
                        desc4.putInteger( id19, 255 );
                        var id20 = charIDToTypeID( "SHTM" );
                        desc4.putBoolean( id20, false );
                        var id21 = charIDToTypeID( "SImg" );
                        desc4.putBoolean( id21, true );
                        var id22 = charIDToTypeID( "SSSO" );
                        desc4.putBoolean( id22, false );
                        var id23 = charIDToTypeID( "SSLt" );
                            var list1 = new ActionList();
                        desc4.putList( id23, list1 );
                        var id24 = charIDToTypeID( "DIDr" );
                        desc4.putBoolean( id24, false );
                        var id25 = charIDToTypeID( "In  " );
                        desc4.putPath( id25, new File( exportPath + "C:/Users/Tim/Desktop/Backdrops/png/"  + fileNameBody + ".png") );
                    var id26 = stringIDToTypeID( "SaveForWeb" );
                    desc3.putObject( id7, id26, desc4 );
                executeAction( id6, desc3, DialogModes.NO );
    // Function: zeroSuppress
    // Usage: return a string padded to digit(s)
    // Input: num to convert, digit count needed
    // Return: string padded to digit length
    function zeroSuppress (num, digit) {
        var tmp = num.toString();
        while (tmp.length < digit) {
            tmp = "0" + tmp;
        return tmp;
    // Function: setInvisibleAllArtLayers
    // Usage: unlock and make invisible all art layers, recursively
    // Input: document or layerset
    // Return: all art layers are unlocked and invisible
    function setInvisibleAllArtLayers(obj) {
        for( var i = 0; i < obj.artLayers.length; i++) {
            obj.artLayers[i].allLocked = false;
            obj.artLayers[i].visible = false;
        for( var i = 0; i < obj.layerSets.length; i++) {
            setInvisibleAllArtLayers(obj.layerSets[i]);
    // Function: removeAllInvisibleArtLayers
    // Usage: remove all the invisible art layers, recursively
    // Input: document or layer set
    // Return: <none>, all layers that were invisible are now gone
    function removeAllInvisibleArtLayers(obj) {
        for( var i = obj.artLayers.length-1; 0 <= i; i--) {
            try {
                if(!obj.artLayers[i].visible) {
                    obj.artLayers[i].remove();
            catch (e) {
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            removeAllInvisibleArtLayers(obj.layerSets[i]);
    // Function: removeAllEmptyLayerSets
    // Usage: find all empty layer sets and remove them, recursively
    // Input: document or layer set
    // Return: empty layer sets are now gone
    function removeAllEmptyLayerSets(obj) {
        var foundEmpty = true;
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            if( removeAllEmptyLayerSets(obj.layerSets[i])) {
                obj.layerSets[i].remove();
            } else {
                foundEmpty = false;
        if (obj.artLayers.length > 0) {
            foundEmpty = false;
        return foundEmpty;
    // Function: zeroSuppress
    // Usage: return a string padded to digit(s)
    // Input: num to convert, digit count needed
    // Return: string padded to digit length
    function removeAllInvisible(docRef) {
        removeAllInvisibleArtLayers(docRef);
        removeAllEmptyLayerSets(docRef);
    // Function: exportChildren
    // Usage: find all the children in this document to save
    // Input: duplicate document, original document, export info,
    //        reference to document, starting file name
    // Return: <none>, documents are saved accordingly
    function exportChildren(dupObj, orgObj, exportInfo, dupDocRef, fileNamePrefix) {
        for( var i = 0; i < dupObj.artLayers.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.artLayers[i].visible) {
                    continue;
            dupObj.artLayers[i].visible = true;
            var layerName = dupObj.artLayers[i].name;  // store layer name before change doc
            var duppedDocumentTmp = dupDocRef.duplicate();
            if ((png24Index == exportInfo.fileType)||(png8Index == exportInfo.fileType)) { // PSD: Keep transparency
                removeAllInvisible(duppedDocumentTmp);
                //PNGFileOptions
                        if (activeDocument.activeLayer.isBackgroundLayer == false) { //is it anything but a background layer?
                            app.activeDocument.trim(TrimType.TRANSPARENT);
            } else { // just flatten
                duppedDocumentTmp.flatten();
            // Edit
            var docName = app.activeDocument.name;
            // For some reason indexOf fails if we include the '-', so we use 'copy' and decrement the index by 1.
            docName = docName.slice(0, docName.indexOf('copy')-1);
            var fileNameBody = (docName+'_'+layerName).toLowerCase();
            fileNameBody = fileNameBody.replace(/[:\/\\*\?\"\<\>\|]/g, "_");  // '/\:*?"<>|' -> '_'
            if (fileNameBody.length > 120) {
                fileNameBody = fileNameBody.substring(0,120);
            saveFile(duppedDocumentTmp, fileNameBody, exportInfo);
            duppedDocumentTmp.close(SaveOptions.DONOTSAVECHANGES);
            dupObj.artLayers[i].visible = false;
        for( var i = 0; i < dupObj.layerSets.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.layerSets[i].visible) {
                    continue;
            var fileNameBody = fileNamePrefix;
            fileNameBody += "_" + zeroSuppress(i, 4) + "s";
            exportChildren(dupObj.layerSets[i], orgObj.layerSets[i], exportInfo, dupDocRef, fileNameBody);  // recursive call
    // Function: objectToDescriptor
    // Usage: create an ActionDescriptor from a JavaScript Object
    // Input: JavaScript Object (o)
    //        object unique string (s)
    //        Pre process converter (f)
    // Return: ActionDescriptor
    // NOTE: Only boolean, string, number and UnitValue are supported, use a pre processor
    //       to convert (f) other types to one of these forms.
    // REUSE: This routine is used in other scripts. Please update those if you
    //        modify. I am not using include or eval statements as I want these
    //        scripts self contained.
    function objectToDescriptor (o, s, f) {
        o = {};
        var d = new ActionDescriptor;
        var l = o.reflect.properties.length;
        d.putString( app.charIDToTypeID( 'Msge' ), s );
        for (var i = 0; i < l; i++ ) {
            var k = o.reflect.properties[i].toString();
            if (k == "__proto__" || k == "__count__" || k == "__class__" || k == "reflect")
                continue;
            var v = o[ k ];
            k = app.stringIDToTypeID(k);
            switch ( typeof(v) ) {
                case "boolean":
                    d.putBoolean(k, v);
                    break;
                case "string":
                    d.putString(k, v);
                    break;
                case "number":
                    d.putDouble(k, v);
                    break;
                default:
                    if ( v instanceof UnitValue ) {
                        var uc = new Object;
                        uc["px"] = charIDToTypeID("#Rlt"); // unitDistance
                        uc["%"] = charIDToTypeID("#Prc"); // unitPercent
                        d.putUnitDouble(k, uc[v.type], v.value);
                    } else {
                        throw( new Error("Unsupported type in objectToDescriptor " + typeof(v) ) );
        return d;
    // Function: descriptorToObject
    // Usage: update a JavaScript Object from an ActionDescriptor
    // Input: JavaScript Object (o), current object to update (output)
    //        Photoshop ActionDescriptor (d), descriptor to pull new params for object from
    //        object unique string (s)
    //        JavaScript Function (f), post process converter utility to convert
    // Return: Nothing, update is applied to passed in JavaScript Object (o)
    // NOTE: Only boolean, string, number and UnitValue are supported, use a post processor
    //       to convert (f) other types to one of these forms.
    // REUSE: This routine is used in other scripts. Please update those if you
    //        modify. I am not using include or eval statements as I want these
    //        scripts self contained.
    function descriptorToObject (o, d, s, f) {
        var l = d.count;
        if (l) {
            var keyMessage = app.charIDToTypeID( 'Msge' );
            if ( d.hasKey(keyMessage) && ( s != d.getString(keyMessage) )) return;
        for (var i = 0; i < l; i++ ) {
            var k = d.getKey(i); // i + 1 ?
            var t = d.getType(k);
            strk = app.typeIDToStringID(k);
            switch (t) {
                case DescValueType.BOOLEANTYPE:
                    o[strk] = d.getBoolean(k);
                    break;
                case DescValueType.STRINGTYPE:
                    o[strk] = d.getString(k);
                    break;
                case DescValueType.DOUBLETYPE:
                    o[strk] = d.getDouble(k);
                    break;
                case DescValueType.UNITDOUBLE:
                    var uc = new Object;
                    uc[charIDToTypeID("#Rlt")] = "px"; // unitDistance
                    uc[charIDToTypeID("#Prc")] = "%"; // unitPercent
                    uc[charIDToTypeID("#Pxl")] = "px"; // unitPixels
                    var ut = d.getUnitDoubleType(k);
                    var uv = d.getUnitDoubleValue(k);
                    o[strk] = new UnitValue( uv, uc[ut] );
                    break;
                case DescValueType.INTEGERTYPE:
                case DescValueType.ALIASTYPE:
                case DescValueType.CLASSTYPE:
                case DescValueType.ENUMERATEDTYPE:
                case DescValueType.LISTTYPE:
                case DescValueType.OBJECTTYPE:
                case DescValueType.RAWTYPE:
                case DescValueType.REFERENCETYPE:
                default:
                    throw( new Error("Unsupported type in descriptorToObject " + t ) );
        if (undefined != f) {
            o = f(o);
    // Function: preProcessExportInfo
    // Usage: convert Photoshop enums to strings for storage
    // Input: JavaScript Object of my params for this script
    // Return: JavaScript Object with objects converted for storage
    function preProcessExportInfo(o) {
        o.tiffCompression = o.tiffCompression.toString();
        o.pdfEncoding = o.pdfEncoding.toString();
        o.targaDepth = o.targaDepth.toString();
        o.bmpDepth = o.bmpDepth.toString();
        return o;
    // Function: postProcessExportInfo
    // Usage: convert strings from storage to Photoshop enums
    // Input: JavaScript Object of my params in string form
    // Return: JavaScript Object with objects in enum form
    function postProcessExportInfo(o) {
        o.tiffCompression = eval(o.tiffCompression);
        o.pdfEncoding = eval(o.pdfEncoding);
        o.targaDepth = eval(o.targaDepth);
        o.bmpDepth = eval(o.bmpDepth);
        return o;
    // Function: StrToIntWithDefault
    // Usage: convert a string to a number, first stripping all characters
    // Input: string and a default number
    // Return: a number
    function StrToIntWithDefault( s, n ) {
        var onlyNumbers = /[^0-9]/g;
        var t = s.replace( onlyNumbers, "" );
        t = parseInt( t );
        if ( ! isNaN( t ) ) {
            n = t;
        return n;
    // End X2L.jsx

    I have put the like var exportPath = "~/Desktop/Backdrops/png/";  and have removed the exportPath = exportPath + '/layers';
    but when i run the script it still comes up with the error
    could not complete action since the destination folder does not exist
    if you are using the extendedscript toolkit would be able to run the script and see if you know were the problem is coming from i cant seem to understand why its not seeing the destination.
    thanks for all your help
    // enable double clicking from the Macintosh Finder or the Windows Explorer
    #target photoshop
    //=================================================================
    // Globals
    //=================================================================
    var exportPath = "~/Desktop/Backdrops/png/";
    // UI strings to be localized
    var strTitle = localize("$$$/JavaScripts/X2L/Title=X2L");
    var strButtonRun = localize("$$$/JavaScripts/X2L/Run=Run");
    var strButtonCancel = localize("$$$/JavaScripts/X2L/Cancel=Cancel");
    var strHelpText = localize("$$$/JavaScripts/X2L/Help=Please specify the format and location for saving each layer as a file.");
    var strLabelDestination = localize("$$$/JavaScripts/X2L/Destination=Destination:");
    var strButtonBrowse = localize("$$$/JavaScripts/X2L/Browse=&Browse...");
    var strLabelFileNamePrefix = localize("$$$/JavaScripts/X2L/FileNamePrefix=File Name Prefix:");
    var strCheckboxVisibleOnly = localize("$$$/JavaScripts/X2L/VisibleOnly=&Visible Layers Only");
    var strLabelFileType = localize("$$$/JavaScripts/X2L/FileType=File Type:");
    var strCheckboxIncludeICCProfile = localize("$$$/JavaScripts/X2L/IncludeICC=&Include ICC Profile");
    var strJPEGOptions = localize("$$$/JavaScripts/X2L/JPEGOptions=JPEG Options:");
    var strLabelQuality = localize("$$$/JavaScripts/X2L/Quality=Quality:");
    var strCheckboxMaximizeCompatibility = localize("$$$/JavaScripts/X2L/Maximize=&Maximize Compatibility");
    var strTIFFOptions = localize("$$$/JavaScripts/X2L/TIFFOptions=TIFF Options:");
    var strLabelImageCompression = localize("$$$/JavaScripts/X2L/ImageCompression=Image Compression:");
    var strNone = localize("$$$/JavaScripts/X2L/None=None");
    var strPDFOptions = localize("$$$/JavaScripts/X2L/PDFOptions=PDF Options:");
    var strLabelEncoding = localize("$$$/JavaScripts/X2L/Encoding=Encoding:");
    var strTargaOptions = localize("$$$/JavaScripts/X2L/TargaOptions=Targa Options:");
    var strLabelDepth = localize("$$$/JavaScripts/X2L/Depth=Depth:");
    var strRadiobutton16bit = localize("$$$/JavaScripts/X2L/Bit16=16bit");
    var strRadiobutton24bit = localize("$$$/JavaScripts/X2L/Bit24=24bit");
    var strRadiobutton32bit = localize("$$$/JavaScripts/X2L/Bit32=32bit");
    var strBMPOptions = localize("$$$/JavaScripts/X2L/BMPOptions=BMP Options:");
    var strAlertSpecifyDestination = localize("$$$/JavaScripts/X2L/SpecifyDestination=Please specify destination.");
    var strAlertDestinationNotExist = localize("$$$/JavaScripts/X2L/DestionationDoesNotExist=Destination does not exist.");
    var strTitleSelectDestination = localize("$$$/JavaScripts/X2L/SelectDestination=Select Destination");
    var strAlertDocumentMustBeOpened = localize("$$$/JavaScripts/X2L/OneDocument=You must have a document open to export!");
    var strAlertNeedMultipleLayers = localize("$$$/JavaScripts/X2L/NoLayers=You need a document with multiple layers to export!");
    var strAlertWasSuccessful = localize("$$$/JavaScripts/X2L/Success= was successful.");
    var strUnexpectedError = localize("$$$/JavaScripts/X2L/Unexpected=Unexpected error");
    var strMessage = localize("$$$/JavaScripts/X2L/Message=X2L");
    var stretQuality = localize( "$$$/locale_specific/JavaScripts/X2L/ETQualityLength=30" );
    var stretDestination = localize( "$$$/locale_specific/JavaScripts/X2L/ETDestinationLength=160" );
    var strddFileType = localize( "$$$/locale_specific/JavaScripts/X2L/DDFileType=100" );
    var strpnlOptions = localize( "$$$/locale_specific/JavaScripts/X2L/PNLOptions=100" );
    var strPNG8Options = localize("$$$/JavaScripts/X2L/PNG8Options=PNG-8 Options:");
    var strCheckboxPNGTransparency = localize("$$$/JavaScripts/X2L/Transparency=Transparency");
    var strCheckboxPNGInterlaced = localize("$$$/JavaScripts/X2L/Interlaced=Interlaced");
    var strCheckboxPNGTrm = localize("$$$/JavaScripts/X2L/Trim=Trim Layers");
    var strPNG24Options = localize("$$$/JavaScripts/X2L/PNG24Options=PNG-24 Options:");
    // the drop down list indexes for file type
    var png24Index = 7;
    main();
    // Functions
    // Function: main
    // Usage: the core routine for this script
    // Input: <none>
    // Return: <none>
    function main() {
        if ( app.documents.length <= 0 ) {
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                alert( strAlertDocumentMustBeOpened );
            return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
        var exportInfo = new Object();
        initExportInfo(exportInfo);
        // look for last used params via Photoshop registry, getCustomOptions will throw if none exist
        try {
        catch(e) {
            // it's ok if we don't have any options, continue with defaults
        try {
            var docName = app.activeDocument.name;  // save the app.activeDocument name before duplicate.
            var layerCount = app.documents[docName].layers.length;
            var layerSetsCount = app.documents[docName].layerSets.length;
            if ((layerCount <= 1)&&(layerSetsCount <= 0)) {
                if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                    alert( strAlertNeedMultipleLayers );
                return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
            } else {
                var rememberMaximize;
                var needMaximize = exportInfo.psdMaxComp ? QueryStateType.ALWAYS : QueryStateType.NEVER;
                app.activeDocument = app.documents[docName];
                var duppedDocument = app.activeDocument.duplicate();
                duppedDocument.activeLayer = duppedDocument.layers[duppedDocument.layers.length-1]; // for removing
                setInvisibleAllArtLayers(duppedDocument);
                exportChildren(duppedDocument, app.documents[docName], exportInfo, duppedDocument, exportInfo.fileNamePrefix);
                duppedDocument.close( SaveOptions.DONOTSAVECHANGES );
                if ( rememberMaximize != undefined ) {
                    app.preferences.maximizeCompatibility = rememberMaximize;
                if ( DialogModes.ALL == app.playbackDisplayDialogs ) {
                    //alert(strTitle + strAlertWasSuccessful);
                app.playbackDisplayDialogs = DialogModes.ALL;
        } catch (e) {
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                alert(e);
            return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
    // Function: settingDialog
    // Usage: pop the ui and get user settings
    // Input: exportInfo object containing our parameters
    // Return: on ok, the dialog info is set to the exportInfo object
    function settingDialog(exportInfo) {
      return;
    // Function: hideAllFileTypePanel
    // Usage: hide all the panels in the common actions
    // Input: <none>, dlgMain is a global for this script
    // Return: <none>, all panels are now hidden
    function hideAllFileTypePanel() {
    // Function: initExportInfo
    // Usage: create our default parameters
    // Input: a new Object
    // Return: a new object with params set to default
    function initExportInfo(exportInfo) {
        //exportInfo.destination = new String(exportPath);
        exportInfo.fileNamePrefix = new String("untitled_");
        exportInfo.visibleOnly = false;
        exportInfo.fileType = png24Index;
        exportInfo.icc = true;
        exportInfo.png24Transparency = true;
        exportInfo.png24Interlaced = false;
        exportInfo.png24Trim = true;
        try {
            exportInfo.destination = Folder(new String(exportPath)).fsName; // destination folder
            var tmp = app.activeDocument.fullName.name;
            exportInfo.fileNamePrefix = decodeURI(tmp.substring(0, tmp.indexOf("."))); // filename body part
        } catch(someError) {
            exportInfo.destination = new String(exportPath);
            exportInfo.fileNamePrefix = app.activeDocument.name; // filename body part
    // Function: saveFile
    // Usage: the worker routine, take our params and save the file accordingly
    // Input: reference to the document, the name of the output file,
    //        export info object containing more information
    // Return: <none>, a file on disk
    function saveFile( docRef, fileNameBody, exportInfo) {
                saveFile(docRef, fileNameBody, exportInfo, false, true);
                function saveFile( docRef, fileNameBody, exportInfo, interlacedValue, transparencyValue) {
                var id6 = charIDToTypeID( "Expr" );
                    var desc3 = new ActionDescriptor();
                    var id7 = charIDToTypeID( "Usng" );
                        var desc4 = new ActionDescriptor();
                        var id8 = charIDToTypeID( "Op  " );
                        var id9 = charIDToTypeID( "SWOp" );
                        var id10 = charIDToTypeID( "OpSa" );
                        desc4.putEnumerated( id8, id9, id10 );
                        var id11 = charIDToTypeID( "Fmt " );
                        var id12 = charIDToTypeID( "IRFm" );
                        var id13 = charIDToTypeID( "PN24" );
                        desc4.putEnumerated( id11, id12, id13 );
                        var id14 = charIDToTypeID( "Intr" );
                        desc4.putBoolean( id14, interlacedValue );
                        var id15 = charIDToTypeID( "Trns" );
                        desc4.putBoolean( id15, transparencyValue );
                        var id16 = charIDToTypeID( "Mtt " );
                        desc4.putBoolean( id16, true );
                        var id17 = charIDToTypeID( "MttR" );
                        desc4.putInteger( id17, 255 );
                        var id18 = charIDToTypeID( "MttG" );
                        desc4.putInteger( id18, 255 );
                        var id19 = charIDToTypeID( "MttB" );
                        desc4.putInteger( id19, 255 );
                        var id20 = charIDToTypeID( "SHTM" );
                        desc4.putBoolean( id20, false );
                        var id21 = charIDToTypeID( "SImg" );
                        desc4.putBoolean( id21, true );
                        var id22 = charIDToTypeID( "SSSO" );
                        desc4.putBoolean( id22, false );
                        var id23 = charIDToTypeID( "SSLt" );
                            var list1 = new ActionList();
                        desc4.putList( id23, list1 );
                        var id24 = charIDToTypeID( "DIDr" );
                        desc4.putBoolean( id24, false );
                        var id25 = charIDToTypeID( "In  " );
                        desc4.putPath( id25, new File( exportPath + "C:/Users/Tim/Desktop/Backdrops/png/"  + fileNameBody + ".png") );
                    var id26 = stringIDToTypeID( "SaveForWeb" );
                    desc3.putObject( id7, id26, desc4 );
                executeAction( id6, desc3, DialogModes.NO );
    // Function: zeroSuppress
    // Usage: return a string padded to digit(s)
    // Input: num to convert, digit count needed
    // Return: string padded to digit length
    function zeroSuppress (num, digit) {
        var tmp = num.toString();
        while (tmp.length < digit) {
            tmp = "0" + tmp;
        return tmp;
    // Function: setInvisibleAllArtLayers
    // Usage: unlock and make invisible all art layers, recursively
    // Input: document or layerset
    // Return: all art layers are unlocked and invisible
    function setInvisibleAllArtLayers(obj) {
        for( var i = 0; i < obj.artLayers.length; i++) {
            obj.artLayers[i].allLocked = false;
            obj.artLayers[i].visible = false;
        for( var i = 0; i < obj.layerSets.length; i++) {
            setInvisibleAllArtLayers(obj.layerSets[i]);
    // Function: removeAllInvisibleArtLayers
    // Usage: remove all the invisible art layers, recursively
    // Input: document or layer set
    // Return: <none>, all layers that were invisible are now gone
    function removeAllInvisibleArtLayers(obj) {
        for( var i = obj.artLayers.length-1; 0 <= i; i--) {
            try {
                if(!obj.artLayers[i].visible) {
                    obj.artLayers[i].remove();
            catch (e) {
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            removeAllInvisibleArtLayers(obj.layerSets[i]);
    // Function: removeAllEmptyLayerSets
    // Usage: find all empty layer sets and remove them, recursively
    // Input: document or layer set
    // Return: empty layer sets are now gone
    function removeAllEmptyLayerSets(obj) {
        var foundEmpty = true;
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            if( removeAllEmptyLayerSets(obj.layerSets[i])) {
                obj.layerSets[i].remove();
            } else {
                foundEmpty = false;
        if (obj.artLayers.length > 0) {
            foundEmpty = false;
        return foundEmpty;
    // Function: zeroSuppress
    // Usage: return a string padded to digit(s)
    // Input: num to convert, digit count needed
    // Return: string padded to digit length
    function removeAllInvisible(docRef) {
        removeAllInvisibleArtLayers(docRef);
        removeAllEmptyLayerSets(docRef);
    // Function: exportChildren
    // Usage: find all the children in this document to save
    // Input: duplicate document, original document, export info,
    //        reference to document, starting file name
    // Return: <none>, documents are saved accordingly
    function exportChildren(dupObj, orgObj, exportInfo, dupDocRef, fileNamePrefix) {
        for( var i = 0; i < dupObj.artLayers.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.artLayers[i].visible) {
                    continue;
            dupObj.artLayers[i].visible = true;
            var layerName = dupObj.artLayers[i].name;  // store layer name before change doc
            var duppedDocumentTmp = dupDocRef.duplicate();
            if ((png24Index == exportInfo.fileType)||(png8Index == exportInfo.fileType)) { // PSD: Keep transparency
                removeAllInvisible(duppedDocumentTmp);
                //PNGFileOptions
                        if (activeDocument.activeLayer.isBackgroundLayer == false) { //is it anything but a background layer?
                            app.activeDocument.trim(TrimType.TRANSPARENT);
            } else { // just flatten
                duppedDocumentTmp.flatten();
            // Edit
            var docName = app.activeDocument.name;
            // For some reason indexOf fails if we include the '-', so we use 'copy' and decrement the index by 1.
            docName = docName.slice(0, docName.indexOf('copy')-1);
            var fileNameBody = (docName+'_'+layerName).toLowerCase();
            fileNameBody = fileNameBody.replace(/[:\/\\*\?\"\<\>\|]/g, "_");  // '/\:*?"<>|' -> '_'
            if (fileNameBody.length > 120) {
                fileNameBody = fileNameBody.substring(0,120);
            saveFile(duppedDocumentTmp, fileNameBody, exportInfo);
            duppedDocumentTmp.close(SaveOptions.DONOTSAVECHANGES);
            dupObj.artLayers[i].visible = false;
        for( var i = 0; i < dupObj.layerSets.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.layerSets[i].visible) {
                    continue;
            var fileNameBody = fileNamePrefix;
            fileNameBody += "_" + zeroSuppress(i, 4) + "s";
            exportChildren(dupObj.layerSets[i], orgObj.layerSets[i], exportInfo, dupDocRef, fileNameBody);  // recursive call
    // Function: objectToDescriptor
    // Usage: create an ActionDescriptor from a JavaScript Object
    // Input: JavaScript Object (o)
    //        object unique string (s)
    //        Pre process converter (f)
    // Return: ActionDescriptor
    // NOTE: Only boolean, string, number and UnitValue are supported, use a pre processor
    //       to convert (f) other types to one of these forms.
    // REUSE: This routine is used in other scripts. Please update those if you
    //        modify. I am not using include or eval statements as I want these
    //        scripts self contained.
    function objectToDescriptor (o, s, f) {
        o = {};
        var d = new ActionDescriptor;
        var l = o.reflect.properties.length;
        d.putString( app.charIDToTypeID( 'Msge' ), s );
        for (var i = 0; i < l; i++ ) {
            var k = o.reflect.properties[i].toString();
            if (k == "__proto__" || k == "__count__" || k == "__class__" || k == "reflect")
                continue;
            var v = o[ k ];
            k = app.stringIDToTypeID(k);
            switch ( typeof(v) ) {
                case "boolean":
                    d.putBoolean(k, v);
                    break;
                case "string":
                    d.putString(k, v);
                    break;
                case "number":
                    d.putDouble(k, v);
                    break;
                default:
                    if ( v instanceof UnitValue ) {
                        var uc = new Object;
                        uc["px"] = charIDToTypeID("#Rlt"); // unitDistance
                        uc["%"] = charIDToTypeID("#Prc"); // unitPercent
                        d.putUnitDouble(k, uc[v.type], v.value);
                    } else {
                        throw( new Error("Unsupported type in objectToDescriptor " + typeof(v) ) );
        return d;
    // Function: descriptorToObject
    // Usage: update a JavaScript Object from an ActionDescriptor
    // Input: JavaScript Object (o), current object to update (output)
    //        Photoshop ActionDescriptor (d), descriptor to pull new params for object from
    //        object unique string (s)
    //        JavaScript Function (f), post process converter utility to convert
    // Return: Nothing, update is applied to passed in JavaScript Object (o)
    // NOTE: Only boolean, string, number and UnitValue are supported, use a post processor
    //       to convert (f) other types to one of these forms.
    // REUSE: This routine is used in other scripts. Please update those if you
    //        modify. I am not using include or eval statements as I want these
    //        scripts self contained.
    function descriptorToObject (o, d, s, f) {
        var l = d.count;
        if (l) {
            var keyMessage = app.charIDToTypeID( 'Msge' );
            if ( d.hasKey(keyMessage) && ( s != d.getString(keyMessage) )) return;
        for (var i = 0; i < l; i++ ) {
            var k = d.getKey(i); // i + 1 ?
            var t = d.getType(k);
            strk = app.typeIDToStringID(k);
            switch (t) {
                case DescValueType.BOOLEANTYPE:
                    o[strk] = d.getBoolean(k);
                    break;
                case DescValueType.STRINGTYPE:
                    o[strk] = d.getString(k);
                    break;
                case DescValueType.DOUBLETYPE:
                    o[strk] = d.getDouble(k);
                    break;
                case DescValueType.UNITDOUBLE:
                    var uc = new Object;
                    uc[charIDToTypeID("#Rlt")] = "px"; // unitDistance
                    uc[charIDToTypeID("#Prc")] = "%"; // unitPercent
                    uc[charIDToTypeID("#Pxl")] = "px"; // unitPixels
                    var ut = d.getUnitDoubleType(k);
                    var uv = d.getUnitDoubleValue(k);
                    o[strk] = new UnitValue( uv, uc[ut] );
                    break;
                case DescValueType.INTEGERTYPE:
                case DescValueType.ALIASTYPE:
                case DescValueType.CLASSTYPE:
                case DescValueType.ENUMERATEDTYPE:
                case DescValueType.LISTTYPE:
                case DescValueType.OBJECTTYPE:
                case DescValueType.RAWTYPE:
                case DescValueType.REFERENCETYPE:
                default:
                    throw( new Error("Unsupported type in descriptorToObject " + t ) );
        if (undefined != f) {
            o = f(o);
    // Function: preProcessExportInfo
    // Usage: convert Photoshop enums to strings for storage
    // Input: JavaScript Object of my params for this script
    // Return: JavaScript Object with objects converted for storage
    function preProcessExportInfo(o) {
        o.tiffCompression = o.tiffCompression.toString();
        o.pdfEncoding = o.pdfEncoding.toString();
        o.targaDepth = o.targaDepth.toString();
        o.bmpDepth = o.bmpDepth.toString();
        return o;
    // Function: postProcessExportInfo
    // Usage: convert strings from storage to Photoshop enums
    // Input: JavaScript Object of my params in string form
    // Return: JavaScript Object with objects in enum form
    function postProcessExportInfo(o) {
        o.tiffCompression = eval(o.tiffCompression);
        o.pdfEncoding = eval(o.pdfEncoding);
        o.targaDepth = eval(o.targaDepth);
        o.bmpDepth = eval(o.bmpDepth);
        return o;
    // Function: StrToIntWithDefault
    // Usage: convert a string to a number, first stripping all characters
    // Input: string and a default number
    // Return: a number
    function StrToIntWithDefault( s, n ) {
        var onlyNumbers = /[^0-9]/g;
        var t = s.replace( onlyNumbers, "" );
        t = parseInt( t );
        if ( ! isNaN( t ) ) {
            n = t;
        return n;
    // End X2L.jsx

  • Action batch export issue with image trace

    So, currently I'm working on batch processing jpeg sequences using illustrator's image trace and distortion effects. I have batch exported the image traces of the sequences via Adobe bridge.  Now I'm trying to create an action which opens the .ai files containing those image traces, apply a graphic style to the trace, and export a png from that.  I'm banging my head against the wall trying to get this to work right now. If I do the steps (step by step... not using a recorded action) I want on a single file, it works great, but the moment I batch export using the action I've created, it puts the original .png image that the image trace was linked to, on top of the image. The result is a bunch of .png exports that look exactly like my original image sequence.  If I add a "save" function to the action and open the resulting .ai files, I can see that the image trace vectors are in the file. The "linked png" however visible on the layer above those vectors.  Anyone have any idea what I'm doing wrong? How do I get rid of that pesky linked image.
    Also, for anyone who might be thinking that it has something to do with expanding the image trace before applying effects, this issue I'm running into, I've determined, is happening higher up in the hierarchy of the actions... If I simply make an action to open the image trace illustrator file and save it back out, the same issue occurs... placing the .png "linked file" on top of the vector image.
    While I'm at it, I might as well ask if anyone knows how to change the illustrator default image trace preset.... Without being able to change it, or much less specify in the action sequence that I'd like to use a user created image trace preset rather than the default setting, it's greatly overcomplicating my workflow. Makes what could easily be one-step batch processing into two. Seems pretty silly if you ask me.
    Please, if you guys have any insights on this, let me know. It's super frustrating... By the way, if you're wondering what type of effect I'm going for, the idea (as well as some explanation into their own process) starts at 12:44 of this video (http://vimeo.com/77427470).
    THANKS!

    Just wanted to let you guys know, for anyone who might be having my same issue... My home computer, even after a fresh install of Illustrator, was still placing the linked jpeg over the traced vector shapes when batch exporting... I did however find a workaround.  Rather than using Bridge CS6 for the batch image tracing, I used Bridge CS5 to trace in Illustrator CS5. Then, I used Illustrator CS6 to batch export an action that imported and applied an effect to those image traced sequences.  When you do this, it forces you to expand the tracing on import (because of the difference in Illustrator versions I'm assuming).  This way, when you batch run the action, it's already working with expanded vector shapes.  Not sure why this works, but it does.
    Also, I was having some issues getting Illustrator to apply the graphic style when batch exporting. I got it to work by copying an object with that particular graphic style to the clipboard, then adding in the action I was running a "paste" command, followed by a "clear" command.  I can only assume that Illustrator was having issues loading custom graphics styles while batch exporting. The paste/delete technique is annoying, but gets it done.
    Anyways. Just wanted to check in on this one. I'm happy I was able to muscle my way through it all.

  • Problem in Batch Export Report

    Hi all,
    I have developed a report in PP module for Batch exports.
    Here iam providing the input as plant, material no & batch and the output will  be Orderwise material no, batch, mat desc, density and Quantity.
    While executing the report the output is coming exactly for the first order while for the second order the values are not fetching correctly.
    Pls suggest me.
    *& Report  ZPP_EXPORTBATCH
    REPORT  ZPP_EXPORTBATCH.
    TABLES: MSEG,MKPF,AUFK,AFPO. "
    TYPE-POOLS SLIS.
    DATA: IT_EVENTS TYPE SLIS_T_EVENT,
          WA_EVENTS TYPE SLIS_ALV_EVENT,
          IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
          X_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
          LIST_LAYOUT TYPE SLIS_LAYOUT_ALV,                     "#EC *
          GS_KEYINFO TYPE SLIS_KEYINFO_ALV,                     "#EC *
          W_PROG TYPE SY-REPID,
          P_RS_LINEINFO TYPE SLIS_LINEINFO.
    Internal Tables**********************************
    TYPES: TY_SCLASS TYPE STANDARD TABLE OF SCLASS.
    TYPES: TY_OBJECTDATA TYPE STANDARD TABLE OF CLOBJDAT.
    TYPES: BEGIN OF T_MSEG,
           BWART LIKE MSEG-BWART,
           MATNR LIKE MSEG-MATNR,
           MAKTX LIKE MAKT-MAKTX,
           CHARG LIKE MSEG-CHARG,
           MENGE LIKE MSEG-MENGE,
           ERFME LIKE MSEG-ERFME,
           AUFNR LIKE MSEG-AUFNR,
           AUSP1 LIKE CLOBJDAT-AUSP1,
           ERROR(30),
           END OF T_MSEG.
    TYPES: INT_MSEG_FINAL TYPE STANDARD TABLE OF T_MSEG .
    TYPES: BEGIN OF TY_MENGE1,
             MATNR TYPE MSEG-MATNR,
             CHARG TYPE MSEG-CHARG,
             MENGE TYPE MSEG-MENGE,
             ERFME TYPE MSEG-ERFME,
             MBLNR TYPE MSEG-MBLNR,
             ZEILE TYPE MSEG-ZEILE,
           END OF TY_MENGE1.
    TYPES: TY_MENGE TYPE STANDARD TABLE OF TY_MENGE1.
    DATA : LENGTH     TYPE     I,
    DIFFERENCE     TYPE     I,
    IT_CLASS     TYPE     TY_SCLASS,
    IT_OBJECTDATA     TYPE     TY_OBJECTDATA,
    WA_CLASS     TYPE     SCLASS,
    WA_OBJECTDATA     TYPE     CLOBJDAT,
    L_MATNR     TYPE     MATNR,
    INT_MSEG_FINAL     TYPE     INT_MSEG_FINAL,
    WA_MSEG_FINAL     TYPE     T_MSEG,
    WA_MSEG     TYPE     MSEG,
    WA_WEMNG     TYPE     AFPO-WEMNG,
    WA_PSMNG     TYPE     AFPO-PSMNG,
    WA_AMEIN     TYPE     AFPO-AMEIN,
    BAL_QTY     TYPE     AFPO-WEMNG,
    INT_MSEG_TEMP1     TYPE     INT_MSEG_FINAL,
    WA_CALCULATED1     TYPE     AFPO-WEMNG,
    IT_MENGE     TYPE     TY_MENGE,
    WA_MENGE1     TYPE     TY_MENGE1,
    WA_MAKTX     TYPE     MAKT-MAKTX,
    WA_HSDAT     TYPE     MCH1-HSDAT,
    WA_MAKTX_MAIN     TYPE     MAKT-MAKTX,
    MAIN_DEN     TYPE     STRING,
    DENSITY     TYPE     STRING,
    MDENSITY     TYPE     STRING,
    IDENSITY     TYPE     STRING.
    data : tqty like mseg-menge.
    data:INT_MSEG_TEMP2   LIKE MSEG OCCURS 0 WITH HEADER LINE.
    data:INT_MSEG_TEMP3   LIKE MSEG OCCURS 0 WITH HEADER LINE.
    **************Initialization********************************************
    INITIALIZATION.
    **************Input Parameters List*************************************
      SELECTION-SCREEN SKIP 3.
      SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-T01 . "#EC
          SELECT-OPTIONS : S_WERKS FOR MSEG-WERKS OBLIGATORY, "PLANT
                           S_MATNR FOR MSEG-MATNR OBLIGATORY, "MATERIAL NUMBER
                           S_CHARG FOR MSEG-CHARG,            "BATCH
                           S_BUDAT FOR MKPF-BUDAT.            "POSTING DATE
      SELECTION-SCREEN END OF BLOCK BLOCK1.
    START-OF-SELECTION.
      PERFORM READ_DATA.
      PERFORM SUB_PREPARE_FIELDCATALOG.
      PERFORM FILL_EVENTS_TABLE.
    END-OF-SELECTION.
      PERFORM DISPLAY_DATA_USING_GRID.
    *&      Form  READ_DATA
          text
    -->  p1        text
    <--  p2        text
    FORM READ_DATA .
    DATA :INT_AFPO LIKE AFPO OCCURS 0 WITH HEADER LINE.
    DATA :INT_MSEG        LIKE MSEG OCCURS 0 WITH HEADER LINE,
    INT_MSEG_TEMP   LIKE MSEG OCCURS 0 WITH HEADER LINE.
    SELECT SINGLE MAKTX
      INTO WA_MAKTX_MAIN
      FROM MAKT
      WHERE MATNR IN S_MATNR.
    DATA : WA_MENGE LIKE MSEG-MENGE.
    SELECT  SINGLE *
    FROM  AFPO
    INTO  INT_AFPO
    WHERE MATNR IN S_MATNR
    AND   CHARG IN S_CHARG
    AND   DWERK IN S_WERKS.
    MOVE INT_AFPO-WEMNG TO WA_WEMNG.
    MOVE INT_AFPO-PSMNG TO WA_PSMNG.
    MOVE INT_AFPO-AMEIN TO WA_AMEIN.
    SELECT *
    INTO TABLE INT_MSEG
    FROM  MSEG
    WHERE AUFNR = INT_AFPO-AUFNR
    AND  BWART IN ('261' , '262' )
    AND  WERKS IN S_WERKS.
    REFRESH INT_AFPO.
    int_mseg_temp3[] = int_mseg[].
    LOOP AT INT_MSEG.
      clear tqty.
        loop at int_mseg_temp3 WHERE MATNR = INT_MSEG-MATNR
                                 and charg = int_mseg-charg
                                 AND AUFNR = INT_MSEG-AUFNR
              if int_mseg_temp3-bwart = '261' .
                   tqty = tqty + int_mseg_temp3-menge.
              elseif int_mseg_temp3-bwart = '262'.
                   tqty = tqty - int_mseg_temp3-menge.
              endif.
         endloop.
        int_mseg-menge = tqty.
      SELECT  SINGLE *
      FROM  AFPO
      INTO  INT_AFPO
      WHERE MATNR = INT_MSEG-MATNR
      AND   CHARG = INT_MSEG-CHARG
      AND   DWERK IN S_WERKS.
    IF SY-SUBRC EQ 0 AND INT_AFPO-AUFNR <> ' '.
        SELECT * FROM MSEG
        INTO    TABLE INT_MSEG_TEMP
        WHERE  AUFNR = INT_AFPO-AUFNR
        AND    BWART IN ('261' , '262' )
        AND    WERKS IN S_WERKS.
        LOOP AT INT_MSEG_TEMP.
          WA_CALCULATED1 = ( INT_MSEG_TEMP-MENGE / INT_AFPO-WEMNG ) * INT_MSEG-MENGE.
          WA_MENGE1-MENGE = WA_CALCULATED1.
          WA_MENGE1-MATNR = INT_MSEG_TEMP-MATNR.
          WA_MENGE1-CHARG = INT_MSEG_TEMP-CHARG.
          WA_MENGE1-ERFME = INT_MSEG_TEMP-ERFME.
          WA_MENGE1-MBLNR = INT_MSEG_TEMP-MBLNR.
          WA_MENGE1-ZEILE = INT_MSEG_TEMP-ZEILE.
          APPEND WA_MENGE1 TO IT_MENGE.
          CLEAR: WA_CALCULATED1, WA_MENGE1.
        ENDLOOP.
        SORT IT_MENGE BY MBLNR ZEILE MATNR CHARG.
         ENDLOOP.
        CLEAR  INT_MSEG.
        MODIFY  TABLE INT_MSEG  FROM INT_MSEG_TEMP.
        LOOP AT INT_MSEG_TEMP.
          MOVE-CORRESPONDING INT_MSEG_TEMP TO INT_MSEG.
          READ TABLE IT_MENGE INTO WA_MENGE1
          WITH KEY MATNR = INT_MSEG_TEMP-MATNR
                   CHARG = INT_MSEG_TEMP-CHARG
                   MBLNR = INT_MSEG_TEMP-MBLNR
                   ZEILE = INT_MSEG_TEMP-ZEILE.
          INT_MSEG-MENGE = WA_MENGE1-MENGE.
          APPEND INT_MSEG.
          CLEAR  INT_MSEG.
    *Added for Changes given by anup ART:09MAR08
         CLEAR WA_MENGE1-MENGE.
    *End of for Changes given by anup ART:09MAR08
        ENDLOOP.
        REFRESH INT_MSEG_TEMP.
        CLEAR INT_AFPO.
      ELSE.
       MOVE:  INT_MSEG-MATNR TO   WA_MSEG_FINAL-MATNR,
        INT_MSEG-CHARG  TO WA_MSEG_FINAL-CHARG,
        INT_MSEG-MENGE  TO WA_MSEG_FINAL-MENGE,
        INT_MSEG-ERFME  TO WA_MSEG_FINAL-ERFME,
        INT_MSEG-BWART  TO WA_MSEG_FINAL-BWART .
        APPEND WA_MSEG_FINAL TO INT_MSEG_FINAL.
        CLEAR WA_MSEG_FINAL.
        CLEAR INT_AFPO.
      ENDIF.
    ENDLOOP.
    INT_MSEG_TEMP1[] = INT_MSEG_FINAL[].
    REFRESH INT_MSEG_FINAL.
    SORT INT_MSEG_TEMP1 BY MATNR CHARG.
    LOOP AT INT_MSEG_TEMP1 INTO WA_MSEG_FINAL.
      ON CHANGE OF WA_MSEG_FINAL-MATNR
      OR WA_MSEG_FINAL-CHARG.
        IF WA_MSEG_FINAL-BWART = '261'.
          WA_MENGE = WA_MENGE + WA_MSEG_FINAL-MENGE.
        ELSEIF WA_MSEG_FINAL-BWART = '262'.
          WA_MENGE = WA_MENGE - WA_MSEG_FINAL-MENGE.
        ENDIF.
        WA_MSEG_FINAL-MENGE = WA_MENGE.
        CLEAR WA_MENGE.
        APPEND WA_MSEG_FINAL TO INT_MSEG_FINAL.
        CLEAR WA_MSEG_FINAL.
      ENDON.
    ENDLOOP.
    LOOP AT INT_MSEG_FINAL INTO WA_MSEG_FINAL.
      SELECT SINGLE MAKTX
        INTO WA_MAKTX
        FROM MAKT
        WHERE MATNR = WA_MSEG_FINAL-MATNR.
      WA_MSEG_FINAL-MAKTX = WA_MAKTX.
      MODIFY INT_MSEG_FINAL FROM WA_MSEG_FINAL TRANSPORTING MAKTX.
      CLEAR WA_MAKTX.
    ****************CHGS BY MURALI.C FOR
    DATA: WA_OBJECT(50) TYPE C.
    LENGTH = STRLEN( WA_MSEG_FINAL-MATNR ).
    IF LENGTH LT 18.
    DIFFERENCE = 18 - LENGTH.
    DO DIFFERENCE TIMES.
    CONCATENATE WA_MSEG_FINAL-MATNR SPACE INTO L_MATNR.
    ENDDO.
    ENDIF.
    CONCATENATE L_MATNR WA_MSEG_FINAL-CHARG INTO WA_OBJECT RESPECTING
    BLANKS.
    CALL FUNCTION 'CLAF_CLASSIFICATION_OF_OBJECTS'
    EXPORTING
      CLASS                      = ' '
      CLASSTEXT                  = 'X'
    CLASSTYPE                  = '023'
      CLINT                      = 0
      FEATURES                   = 'X'
      LANGUAGE                   = SY-LANGU
    OBJECT                     = WA_OBJECT
    OBJECTTABLE                = 'MCH1'
      KEY_DATE                   = SY-DATUM
      INITIAL_CHARACT            = 'X'
      NO_VALUE_DESCRIPT          = NO_VALUE_DESCRIPT
      CHANGE_SERVICE_CLF         = 'X'
      INHERITED_CHAR             = ' '
      CHANGE_NUMBER              = ' '
    TABLES
    T_CLASS                    = IT_CLASS
    T_OBJECTDATA               = IT_OBJECTDATA
      I_SEL_CHARACTERISTIC       = I_SEL_CHARACTERISTIC
      T_NO_AUTH_CHARACT          = T_NO_AUTH_CHARACT
    EXCEPTIONS
    NO_CLASSIFICATION          = 1
    NO_CLASSTYPES              = 2
    INVALID_CLASS_TYPE         = 3
    OTHERS                     = 4
    IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    read TABLE IT_OBJECTDATA INTO wa_objectdata
    with KEY SMBEZ = 'Density'.
    if wa_objectdata-ausp1 <> '?'.
    perform density_calc using wa_objectdata-ausp1 changing idensity.
    WA_MSEG_FINAL-AUSP1 = idensity.
    else.
    WA_MSEG_FINAL-ERROR = 'classification value missing'.
    endif.
    MODIFY INT_MSEG_FINAL FROM WA_MSEG_FINAL TRANSPORTING AUSP1 ERROR.
    CLEAR :WA_MSEG_FINAL-MATNR,WA_MSEG_FINAL-CHARG,WA_MSEG_FINAL-AUSP1,WA_OBJECT,WA_OBJECTDATA-AUSP1.
    ENDLOOP.
    ENDFORM.                    " READ_DATA
    *&      Form  SUB_PREPARE_FIELDCATALOG
          text
    -->  p1        text
    <--  p2        text
    FORM SUB_PREPARE_FIELDCATALOG .
      X_FIELDCAT-FIELDNAME = 'MATNR'.
      X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
      X_FIELDCAT-SELTEXT_M = 'MATERIAL NUMBER'. "#EC NOTEXT
      X_FIELDCAT-JUST = 'C'.
      X_FIELDCAT-OUTPUTLEN = 10.
      X_FIELDCAT-KEY = 'X'.
      X_FIELDCAT-KEY_SEL = 'X'.
      APPEND X_FIELDCAT TO IT_FIELDCAT.
      CLEAR X_FIELDCAT.
      X_FIELDCAT-FIELDNAME = 'MAKTX'.
      X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
      X_FIELDCAT-SELTEXT_M = 'MATERIAL DESCRIPTION'. "#EC NOTEXT
      X_FIELDCAT-JUST = 'C'.
      X_FIELDCAT-OUTPUTLEN = 17.
      APPEND X_FIELDCAT TO IT_FIELDCAT.
      CLEAR X_FIELDCAT.
      X_FIELDCAT-FIELDNAME = 'CHARG'.
      X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
      X_FIELDCAT-SELTEXT_M = 'BATCH'. "#EC NOTEXT
      X_FIELDCAT-JUST = 'C'.
      X_FIELDCAT-OUTPUTLEN = 10.
      APPEND X_FIELDCAT TO IT_FIELDCAT.
      CLEAR X_FIELDCAT.
      X_FIELDCAT-FIELDNAME = 'AUSP1'.
      X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
      X_FIELDCAT-SELTEXT_M = 'DENSITY'. "#EC NOTEXT
      X_FIELDCAT-JUST = 'C'.
      X_FIELDCAT-OUTPUTLEN = 6.
      APPEND X_FIELDCAT TO IT_FIELDCAT.
      CLEAR X_FIELDCAT.
      X_FIELDCAT-FIELDNAME = 'MENGE'.
      X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
      X_FIELDCAT-SELTEXT_M = 'QUANTITY'. "#EC NOTEXT
      X_FIELDCAT-JUST = 'C'.
      X_FIELDCAT-OUTPUTLEN = 9.
      APPEND X_FIELDCAT TO IT_FIELDCAT.
      CLEAR X_FIELDCAT.
      X_FIELDCAT-FIELDNAME = 'ERFME'.
      X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
      X_FIELDCAT-SELTEXT_M = 'UOM'. "#EC NOTEXT
      X_FIELDCAT-JUST = 'C'.
      X_FIELDCAT-OUTPUTLEN = 9.
      APPEND X_FIELDCAT TO IT_FIELDCAT.
      CLEAR X_FIELDCAT.
    *X_FIELDCAT-FIELDNAME = 'EDATU1'.
    X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
    X_FIELDCAT-SELTEXT_M = 'CONFIRMED QUANTITY DATED'. "#EC NOTEXT
    X_FIELDCAT-JUST = 'C'.
    X_FIELDCAT-OUTPUTLEN = 9.
    APPEND X_FIELDCAT TO IT_FIELDCAT.
    CLEAR X_FIELDCAT.
    X_FIELDCAT-FIELDNAME = 'ETENR1'.
    X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
    X_FIELDCAT-SELTEXT_M = 'CONFIRM SL NO'. "#EC NOTEXT
    X_FIELDCAT-JUST = 'C'.
    X_FIELDCAT-OUTPUTLEN = 9.
    APPEND X_FIELDCAT TO IT_FIELDCAT.
    CLEAR X_FIELDCAT.
    X_FIELDCAT-FIELDNAME = 'LFIMG'.
    X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
    X_FIELDCAT-SELTEXT_M = 'DELIVERED QUANTITY'. "#EC NOTEXT
    X_FIELDCAT-JUST = 'C'.
    X_FIELDCAT-OUTPUTLEN = 18.
    APPEND X_FIELDCAT TO IT_FIELDCAT.
    CLEAR X_FIELDCAT.
    X_FIELDCAT-FIELDNAME = 'ERDAT'.
    X_FIELDCAT-TABNAME = 'INT_MSEG_FINAL'.
    X_FIELDCAT-SELTEXT_M = 'DELIVERED DATE'. "#EC NOTEXT
    X_FIELDCAT-JUST = 'C'.
    X_FIELDCAT-OUTPUTLEN = 18.
    APPEND X_FIELDCAT TO IT_FIELDCAT.
    CLEAR X_FIELDCAT.
    ENDFORM.                    " SUB_PREPARE_FIELDCATALOG
    *&      Form  FILL_EVENTS_TABLE
          text
    -->  p1        text
    <--  p2        text
    FORM FILL_EVENTS_TABLE .
       WA_EVENTS-NAME = 'TOP_OF_PAGE'.
       WA_EVENTS-FORM = 'PRINT_HEADING'.
       APPEND WA_EVENTS TO IT_EVENTS.
    ENDFORM.                    " FILL_EVENTS_TABLE
    FORM PRINT_HEADING. "#EC CALLED
      DATA IT_HEADINGS TYPE SLIS_T_LISTHEADER.
      DATA WA_HEADINGS LIKE LINE OF IT_HEADINGS.
      CLEAR WA_HEADINGS.
      WA_HEADINGS-TYP = 'H'.
      WA_HEADINGS-INFO = '                                          '.
      WA_HEADINGS-TYP = 'H'.
      WA_HEADINGS-INFO = ' BATCH EXPORT DETAILS REPORT '.
      APPEND WA_HEADINGS TO IT_HEADINGS.
      CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
        EXPORTING
          IT_LIST_COMMENTARY       = IT_HEADINGS
          I_LOGO                   =  'APARLOGO' .
    ENDFORM.                    "PRINT_HEADING
    *&      Form  DISPLAY_DATA_USING_GRID
          text
    -->  p1        text
    <--  p2        text
    FORM DISPLAY_DATA_USING_GRID .
       CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       EXPORTING
       I_BYPASSING_BUFFER                = 'X'
       I_BUFFER_ACTIVE                   = ' '
       I_CALLBACK_PROGRAM                = SY-CPROG
       IT_FIELDCAT                       = IT_FIELDCAT
       I_SAVE                            = 'A'
       IT_EVENTS                         = IT_EVENTS
       TABLES
       T_OUTTAB                          = INT_MSEG_FINAL
      IF SY-SUBRC <> 0. "#EC *
       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
    ENDFORM.                    " DISPLAY_DATA_USING_GRID
    *&      Form  density_calc
          text
         -->P_WA_OBJECTDATA_AUSP1  text
         <--P_IDENSITY  text
    FORM density_calc  USING    WA_OBJECTDATA_AUSP1
                       CHANGING DENSITY.
    data: den type float,density1(8).
    density1(8) = wa_objectdata-ausp1.
    call function 'CHAR_FLTP_CONVERSION'
    exporting
      DYFLD                    = ' '
      MASKN                    = ' '
      MAXDEC                   = '16'
      MAXEXP                   = '59+'
      MINEXP                   = '60-'
    string                   = density1
      MSGTYP_DECIM             = 'W'
    importing
      DECIM                    =
      EXPON                    =
    flstr                    = den
      IVALU                    =
    EXCEPTIONS
      EXPONENT_TOO_BIG         = 1
      EXPONENT_TOO_SMALL       = 2
      STRING_NOT_FLTP          = 3
      TOO_MANY_DECIM           = 4
      OTHERS                   = 5
    if sy-subrc <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    endif.
    if den gt 0.
    density = 1 / den.
    density = density(5).
    density = density / 10.
    den = strlen( density ).
    if den ge 6.
      density = density(6).
      clear: den.
      den = strlen( density ).
    elseif den lt 6.
       density = density.
       clear: den.
       den = strlen( density ).
    endif.
    else.
    density = '0.000'.
    endif.
    den = strlen( density ).
    data: den3(5) type c.
    if den gt 3.
      case den.
        when '6'.
                  clear: den3.
                  compute den3 = 10000 * ( density(6) - density(5) ).
                  if den3 between 6 and 9.
                    clear: den3.
                    compute den3(2) = 10000 * ( density(5) - density(4) ).
                    compute den3 = den3(1) + 1.
                    compute den3 = den3 / 1000.
                    compute density = density(4) + den3.
                  endif.
        when '5'.
                  clear: den3.
                  compute den3 = 1000 * ( density(5) - density(4) ).
                  if den3 between 6 and 9.
                    clear: den3.
                    compute den3(2) = 1000 * ( density(4) - density(3) ).
                    compute den3 = den3(1) + 1.
                    compute den3 = den3 / 100.
                    compute density = density(3) + den3.
                  endif.
      endcase.
    endif.
    density = density(5).
    ENDFORM.                    " density_calc

    Hello,
    I haven't checked the code but from the symptom you describe it could be possible that some fields used to calculate valeus are not getting cleared between calculations.  This could result in some values from order the first order one being used in the calculation for values in the second order.
    Regards,
    Steve.

  • Using BATCH-EXPORT on subclips vs MM to create independent media files

    I've been capturing full HDV tapes with the DV Start/Stop Detection turned on and everything has worked just fine - until now. I'm now encountering a problem w FCP "Searching for Media" on roughly 25% of my clips DURING capture, and in the process, losing about 5 seconds at the start of the clip. I've been having lots of problems w my G5 over the last couple months and it's been acting quite slow and I imagine this is related to that.
    So... after a full 2 days trying to get Media Manager to create independent media files from my subclips (after capturing a twenty minute chunk whole, then breaking it down), following the FCP manual volume II pg 42 to a tee... I concur w many others on this site that Media Manager *****! No matter what I did, it would not produce new files out of my subclips and instead kept giving me the same error: "Reconnect Media Failed. The clip such-and-such was unable to be reconnected to the trimmed file due to a mismatch of the media present in the file... yada yada." Yes, I shortened the end of the first subclip by a couple frames, and I also had another subclip to delete, and I tried going straight from the bin, then from the timeline, then after making all clips independent in the timeline... nothing!
    Then I discovered BATCH EXPORT.
    Using it, I exported my HDV subclips using Quicktime Movie, Self-Contained, HDV 30, audio and video. It processed 20 minutes of subclips in just a few minutes so I'm fairly confident that no real 'processing' occurred.
    Can someone verify for me though that this is a safe procedure and that I am not re-processing HDV files with more HDV nonsense? Before continuing, I would just like to know for sure that Batch Export produces exactly the same result with subclips then if I were to simply capture one clip at a time.
    Thanks a bunch,
    Chris

    I can confirm that it does not merge audio tracks. Track 1 and 2 remain the same. In fact everything appears as it would if I were to capture direct, I just want someone who knows better to validate this!
    Also, has anyone else experienced the slowdown during log & capture that I described, with the intermittent message "searching for media"?

  • Can you batch export in FCP X, can you batch export in FCP X

    I work for a business and am constantly working on projects that have multiple, separate projects within the same project. because of this I do all my editing during my business day and then when I leave for the day, I used to batch export the projects and the next morning I would come into work and be able to move onto the next thing. so far in FCP X I have not been able to find out how to do that. I know that in FCP 7 you could do it obviously, but I'm wondering...does FCP X have that same capability because I can't seem to find it and I don't really have the time to waste by exporting during the day.
    Thanks for your help,
    Scotty

    Hey Scotty,
    Andynick is correct about the batch export workaround.  The way I do it is this:
    1.     Go to the Project Library
    2.     Select the first project you want to export
    3.     Go to file>Send to Compressor. (I set a shortcut -Sift>Option>C from preferences, If you need help with that let me know.
    4.     Repeat this process for each project
    5.     Go to Compressor (it will already be open)
    6.     Now here's where it gets kind of anoying, You need to choose which batch you want to make your main one. Pull off the tab on top and drag that project into your prefered batch, then close the old tab.  Now you'll have two projects in your chosen batch.
    7.     repeat that process for the rest of the batches Compressor created.  When you're done you should only have one batch open with all of your projects in it.
    8.     Submit the batch and let Compressor do it's thang.
    Things to note:
    When you send a project to compressor, it will automatically choose your default settings and location.  If you want them to be different you'll have to do it mannually or change your defaults before you begin this process.
    FUN right! Hopefully Apple will fix this so you can at least select multiple projects in the Project Library to make it a bit easier.
    If anyone has a better workflow I am all ears!

Maybe you are looking for

  • Pls.help my iphone stuck in recovery mode and itunes wont recognize it..i tried the other options that posted here,,,pls tell me what to do..

    pls. help my iPhone stuck in recovery mode and iTunes wont recognize it..i tried the other options that posted here,,,pls tell me what to do..before it was just stuck in an apple logo but when i tried recovery mode to itunes then it stuck..

  • Pse 7 not responding

    I have PSE 7 and as of 2 days ago it has completely stopped working. When i open the organizer it freezes and when you try to click on anything it says the program is not responding. I ve rebooted etc and nothing works. If i pull up the editor it wor

  • Power4 vs Intel Woodcrest & Clovertown

    Does anyone know how the Power4 chip (currently in G5's) compares specs-wise, with Intels Woodcrest (dual-core) or Clovertown (quad-core). Thanks for the info! Content edited by an Apple Discussions Host

  • Exception while triggering an action in consumer portlet.

    Hi, This following exception is noticed while triggering an action from consumer portlet in WSRP. Same request is working fine is standalone producer side application. <env:Body> <env:Fault xmlns:v1="urn:oasis:names:tc:wsrp:v1:types"> <faultcode>v1:O

  • Messed up my library!!

    I'm a fool! Stupidly, I've messed up my photo heirachy. I decided to use Backup 3.01 (the .Mac application) and clicked on the iPhoto quick key. It backed up quite fast so I thought I'd check the size. It was only about a Gbt. When I pressed get info