Suche // Search:

Posts mit dem Label Folder Level Script werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Folder Level Script werden angezeigt. Alle Posts anzeigen

21.07.2015

xmpMM-Entferner
//
xmpMM Remover

Heute gibt es eine Lösung abseits von LiveCycle Designer, die aber dennoch mit XFA-Technologie zu tun hat.
Aber der Reihe nach!

Acrobat DC verwendet neuerdings die Mozillas neue JavaScript-Engine SpiderMonkey 24.
Im Gegensatz zu der früheren Versionen unterstützt diese E4X (EcmaScript 4 XML) nicht mehr.
Adobe hat die E4X-Unterstützung zwar noch einmal nachgerüstet, aber ein Ende von E4X in Acrobat ist abzusehen.
Mit dem Ende von E4X werden alle JavaScript-Lösungen die E4X einsetzen nicht mehr unterstützt und benötigen daher eine Alternative.
Ein prominentes Beispiel wäre da der xmpMM-Entferner von UVSAR.
Mit diesem Tool kann man superleicht die Müllhalde von Metadaten, die z.B. InDesign gerne in PDF's hinterlässt, bereinigen.

Die neue Lösung basiert auch auch JavaScript, nutzt aber XFA-Technologie, um die Metadaten, die ja im XML-Format vorliegen, zu manipulieren.
Kurz gesagt: Wir wandeln mittels XMLData.parse() die Metadaten in ein XFA-Objekt um und können dann die Methoden für nodeList-Objekte wie remove() anwenden, um Elemente zu entfernen usw.


Today I present a solution apart from LiveCycle Designer which however uses XFA-Technology.
But let's take one thing at a time!

Acrobat DC newly uses Mozillas JavaScript engine SpiderMonkey 24.
In opposite to earlier version it doesn't support E4X (EcmaScript 4 XML) anymore.
Adobe were so kind it retrofit E4X support but this won't be for forever and the end of E4X support in Acrobat is conceivable.
This also means the end for all JavaScript solutions using E4X, so it's time to find alternatives.
A very popular Example is UVSAR's xmpMM Remover.
This nice tool enables you to remove easily the dump of needless metadata that for example InDesign adds to PDFs.

The new solution still bases on JavaScript but also uses XFA technology to manipulate the metadata that are just XML data.
In short: We convert the metadata into a XFA object using XMLData.parse() and then can use nodeList() methods like remove() to delete elements etc.


JavaScript
function removeMetadata (oDoc, aElements, aAttributes, bLog, bLang) {
 var oMetaData = XMLData.parse(oDoc.metadata, false),
  vRoot = oMetaData.nodes.namedItem("xmpmeta").nodes.namedItem("RDF").nodes.namedItem("Description"),
  vTemp = vRoot;
 
 if (bLog) {
  console.clear();
  console.show();
  console.println(bLang ? "Extrahiere aktuelle Metadaten." : "Extracting current metadata.");
 }
 
 for (var i = 0; i < vRoot.nodes.length; i += 1) {
  aElements.forEach(function (element) {
   if (element == vRoot.nodes.item(i).name) {
    vRoot.nodes.remove(vRoot.nodes.namedItem(element));
    if (bLog) {
     console.println((bLang ? "Entferne Element:\t" : "Removing Element:\t") + element);
    }
   }
  });
  
  aAttributes.forEach(function (element) {
   if (element == vRoot.nodes.item(i).name) {
    vRoot.nodes.remove(vRoot.nodes.namedItem(element));
    if (bLog) {
     console.println((bLang ? "Entferne Attribut:\t" : "Removing Attribute:\t") + element);
    }
   }   
  });
 }
 try {
  if (bLog) {
   console.println(bLang ? "Lade modifizierte Metadaten.\nSpeichern Sie das Dokument, um die Änderungen zu behalten." : "Loading modified metadata.\nSave the document to keep changes.");
  }
  oDoc.metadata = oMetaData.saveXML("pretty");
  app.execMenuItem("SaveAs");
 } catch (error) {
  app.alert(bLang ? "Sicherheitseinstellungen des Dokuments verhindern das Ändern der Metadaten." : "Security settings of the document prevent changes to metadata.");
 }
}

removeMetadata (this, ['DerivedFrom', 'History', 'PageInfo'], ['InstanceID', 'DocumentID', 'OriginalDocumentID', 'RenditionClass', 'DocChangeCount', 'CaptionWriter'], true, appLang);

xmpMM-Entferner - Folder Level Script

//
xmpMM Remover - folder level script
https://files.acrobat.com/a/preview/b3720e40-e862-49ae-853a-20e522c31565

28.06.2015

Formulare mit neuem Namen in bestimmtes Verzeichnis speichern
//
Save forms with new name in specified directory

Vor langer Zeit hab ich mal ein Beispiel veröffentlicht, um zu zeigen, wie man Formulare mit neuem Dateinamen in gewünschte Verzeichnisse speichert.
Auch wenn das Beispiel schon gut funktionierte, war mir der Aufbau immer noch etwas zu kompliziert, daher habe ich eine neue Version entworfen.
Das Beispiel zeigt 4 Möglichkeiten ein Formular zu speichern.

Long ago I've posted a sample to demonstrate how you can save forms with new file names in desired directories.
Weell, even if the sample was working I always felt a bit unsatisfied with its structure so I I've designed a new version.
It show 4 methods to save a form.

Folder Level Script – JavaScript
var lcbSaveAs = app.trustedFunction( function (vDoc, vPath) {      
    app.beginPriv();
   vDoc.saveAs({cPath: vPath});
    app.endPriv();
});

Funktion zum Speichern mittels Folder Level Script
//
Function to save through folder level script
function lcbSave (vDoc, vPath, vCurrentName, vDefaultName) { 
 if (vCurrentName === vDefaultName) {
  try {
   event.target.lcbSaveAs(vDoc, vPath);
   xfa.host.messageBox("File was saved under:\r\r" + vPath.toUpperCase(), "File Saved", 3, 0);
         xfa.form.execInitialize();
  } catch (error) {
   xfa.host.messageBox(error.toString().replace("RaiseError: ", "") + "\r\rEnsure the destination folder exists and there isn't already a file with the same file name in that folder!\n\n" + error, "Failed to save file", 0, 0);
  }
 } else {
  app.execMenuItem("SaveAs");
 }
}

Skript zum Erstellen des Zielpfads in einem Unterordner (nur eine der Möglichkeiten)
//
Script to create save path in sub folder (just one of the methodes)
var vSlash = "/",
 vNewName = Topic1.Variables.FormName.rawValue,
 vNewPath = Topic1.Variables.CurrentPath.rawValue,
 vSubfolder = Topic1.Variables.Subfolder.rawValue,
 vCurrentName = event.target.documentFileName,
 vCurrentPath = event.target.path,
 vDefaultName = vDefaultFileName.value,
 vSeparator = Topic1.Variables.Separator.boundItem(Topic1.Variables.Separator.getDisplayItem(Topic1.Variables.Separator.selectedIndex)),
 vDate = util.printd("ddmmyyyy", new Date());
 
if (vCurrentName === vDefaultName) {
 if (vNewName !== null && vNewPath !== null) {
  vNewPath += vSubfolder;
  vNewPath += vSlash;
  vNewPath += vNewName.replace(/[\s\!\?\<\>\'\"\*\/\\\=\?\^\`\{\}\|\~]+/g, vSeparator);
  vNewPath += vSeparator;
  vNewPath += vDate;
  vNewPath += ".pdf";
  console.println(vNewPath);
 } else {
  vNewPath = vCurrentPath;
 }
}
this.rawValue = vNewPath;


Beispiel – Zip-Datei mit Formular, Folder Level Script und Unterordner
//
Example – Zip file containing form, folder level script and sub folders
https://documentcloud.adobe.com/link/track?uri=urn%3Aaaid%3Ascds%3AUS%3Ab00d4d56-9bd9-4500-99d4-b233387bfe92

26.07.2011

Dateien auf Verwendungsrechte hin überprüfen
//
Check files for Usage Rights

Wenn man viel mit Formularen arbeitet, die in Acobe Reader nutzbar sein sollen, muss man Acrobat die "Zusätzlichen Funktionen" (Verwendungsrechte in Adobe Reader) hinzufügen.
Blöd nur, dass man später nicht mehr sehen kann, bei welchen Formular das evtl. schon gemacht wurde.
In Acrobat bekommt man das nur raus, wenn ich nochmal versucht die Verwendungsrechte hinzuzufügen und eine Fehlermeldung erhält.
Das ist nervig, da man sich erst einmal durch das Menü hangeln muss, um den passenden Menüpunkt aufzurufen.

Klar, man könnte einen Adobe Reader parallel zu Acrobat installieren, da sieht man ja sofort, ob das Formular auch gespeichert werden kann.
Aber, Adobe rät strikt von einer Parallelinstallation beider Programme auf einem System ab, und die wissen schon warum.

Darum hab ich mir ein kleines Folder Level Script erstellt, dass einen neuen Menüpunkt im Menü "Datei" und unter "Werkzeuge" > "Zusatzprogramme" anlegt.
Hiermit kann man abfragen, ob schon Verwendungsrechte vorhanden sind und ggf. welche hinzufügen.


If you work a lot with forms which also should be usable in Adobe Reader, you have to apply the "Additional Features" (Usage Rights in Adobe Reader) with Acrobat.
Too bad that you later cannot see which form already has been Reader-enabled.
In Acrobat you only can try to apply the Usage Rights again, which then returns an error message.
That's annoying, as you have to navigate through several sub menus to call the specific menu item.

Obviously you could install Adobe Reader parallel to Acrobat, where you easily can see if the form is saveable.
But, Adobe strict advises againt a parallel installation of both application on the same system, and who else better knows why.

So, for this purpose I wrote a small folder level script, which adds a new menu item in the "File" menu and under "Tools" > "Add-on Tools".
With it you easily can check you file for Usage Rights and also apply them if neccessary.


Fehlermeldung wenn Datei schon Verwendungrechte hat
//
Error message if file already has Usage Rights

Menüpunkte zum Prüfen der Verwendungsrechte
//
Menu Items to check the Usage Rights


Meldung, wenn Datei schon Verwendungsrechte hat
//
Message if file already has Uasge Rights

Meldung, wenn Verwendungrechte noch hinzugefügt werden können
//
Message if Usage Rights can be applied




Folder Level Script
https://files.acrobat.com/a/preview/127a4ddd-a177-4a06-a2af-0f6fe9bef4ad


29.11.2010

Ausnahmeregelungen für Gesicherten Modus von Adobe Reader X erstellen
//
Create custom policies for Protected Mode of Adobe Reader X

So, Adobe hat's vollbracht und die neue Version 10 (alias X) von Acrobat und Reader veröffentlicht.
Einher gehen etliche Verbesserungen, vorallem die Sicherheit betreffend.

Der kostenlose Adobe Reader, der immerhin schon über 650 Millionen Mal geladen wurde, wurde ganz besonders verbessert.
Der sogenannte "Geschütze Modus" lässt den Prozess des Readers in einer Sandbox laufen, sodass PDF-Dateien ohne Weiteres keinen Zugriff mehr auf das Dateisystem bekommen, und somit auch bösartige Inhalte wie eingebetteter Shell-Code keinen Schaden mehr anrichten können.
Ich kann nur jedem empfehlen den Reader immer im Geschützen Modus zu verwenden!

Aber das Ganze hat auch Nebenwirkungen, die sich auf Workflows auswirken können, die auf Folder-Level-Skripte basieren, denn auch diese werden wirkungsvoll durch die Sandbox geblockt.

Ich hatte in einem früheren Beispiel mal beschrieben, wie sich XFA-Formulare mit einem Folder-Level-Skript in bestimmte Verzeichnisse speichern lassen.
Dies ist so ein Workflow, der nicht mehr funktioniert, wenn der "Geschützte Modus" aktiv ist.

Wenn Sie das Formular im Reader X mit aktiviertem Geschützem Modus testen, werden Sie nur einen Ausnahmefehler in der Konsole sehen.

NotAllowedError: Sicherheitseinstellungen verhindern den Zugriff auf diese Eigenschaft oder Methode.

Um diesen Workflow wieder gängig zu bekommen ohne auf die Sicherheit des Geschützen Modus zu verzichten, gibt es die Möglichkeit Ausnahmeregelungen in einer Whitelist für den Geschützen Modus zu definieren.

Die Einrichtung dieser Whitelist erfolgt in 2 Schritten.
Zuerst müssen Sie in der Registry einen neuen DWORD-Wert anlegen, damit Reader X überhaupt die Erlaubnis hat, die Whitelist zu verwenden.
Danach definieren Sie die Ausnahmeregelungen in der Whitelist selbst.

Well, Adobe has done it and released the generation 10 (alias X) of Acrobat and Reader. This generations brings a lot of enhancements.

Especially the free Adobe Reader, that already has been downloaded over 650 million times, was improved.
The so called "Protected Mode" runs the Reader process in a sandbox, so PDF files do not get access to the file system.
As a result malicious contents as embedded shell codes cannot harm the system.
I only can advise to use Reader always with the Protected Mode activated.

But, the also will have side effects to workflows that are working with folder level scripts, cause those script will also be blocked by the sandbox mechnism.

I an earlier example I had described, how to use folder level scripts to save XFA-forms into specific directories.
This is such a workflow that won't work with the "Protected Mode" activated.

If you use this example in Reader X with the Protected Mode activated, you will only see an exception in the console.

NotAllowedError: Security settings prevent access to this property or method.

To make it work again without deactivating the security of the Protected Mode, you can describe policies for the Protected Mode in a white list.

The setup of the white list has two steps.
You first have to create a new DWORD value in the registry to allow Reader X the usage of a whitelist.
Then you define the policies in the white list.

Ausnahmefehler in Reader X // Exception in Reader X



Schritt für Schritt // Step  by Step

Öffnen Sie den Registrierungs-Editor und suchen Sie den Verzeichniseintrag:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Adobe\Acrobat Reader\10.0\FeatureLockDown

Erstellen Sie hier einen neuen DWORD-Wert namens bUseWhitelistConfigFile und weisen Sie diesem den Wert 1 zu.

Open the registry editor and look for the entry:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Adobe\Acrobat Reader\10.0\FeatureLockDown

Create a new DWORD-value named bUseWhitelistConfigFile with the value 1.



Öffnen Sie den Programmorder von Adobe Reader X z.B. unter C:\Programme (x86)\Adobe\Reader 10.0\Reader\.
In dem Ordner muss sich die AcroRdr32.exe befinden, andernfalls funktioniert die Whitelist nicht!
Erstellen Sie hier eine Textdatei namens ProtectedModeWhitelistConfig.txt.


Open the program folder of Adobe Reader X under C:\Program Files (x86)\Adobe\Reader 10.0\Reader\ for example.
The folder has to contain the AcroRdr32.exe otherwise the white list won't work!
Create a new text file and name it ProtectedModeWhitelistConfig.txt.


Whitelist im Programmordner // White list in the program folder



Öffnen Sie die Textdatei, um die Ausnahmeregelungen zu definieren.
Insgesamt gibt es 8 Regelarten, von denen für diesen Workflow nur eine interessant ist. 
Die anderen sind vor allem für Entwickler von Plug-Ins interessant, weshalb ich darauf nicht weiter eingehe.


Es können beliebig viele Regelungen eingetragen werden, aber immer nur eine pro Zeile.
Kommentare werden in eigene Zeile geschrieben und mit einem Semikolon am Zeilenanfang auskommentiert.
Sie können Platzhalter für die Regelungen verwenden.
* für beliebig viele Zeichen  – jeweils nur eins in Reihe erlaubt
? für ein bestimmtes Zeichen – mehrere in Reihe erlaubt
Desweiteren können Sie Umgebungsvariablen wie z.B. %user%, %temp% oder %systemroot% verwenden, um die relativen Pfade zu den Systemordner aufzulösen.

Beispielregelungen:

; Laufwerk c:\ freigeben
FILES_ALLOW_ANY = c:\*

; Ordner mit dem Namen "LCB" freigeben – unabhängig davon wo der Ordner gespeichert ist
FILES_ALLOW_ANY = *\LCB\*

; Ordner des angemeldeten Benutzers freigeben – wie z.B. C:\Benutzer\Benutzername\
FILES_ALLOW_ANY = %homedrive%%homepath%\*

; PDF-Dateien beginnend mit "LCB_SaveAs" erlauben – wie z.B. LCB_SaveAs_Beispiel.pdf
FILES_ALLOW_ANY = *\LCB_SaveAs*.pdf

; PDF-Dateien generell erlauben (Nicht empfohlen!)
FILES_ALLOW_ANY = *.pdf


Open the text file to define the policies.
There are 8 rule types available, but only one is interesting for this workflow.
The others are more interesting for developers of plug-ins, so I won't use them here.

You can define as many rule as you like, but only one per line.
Comments have to be written in separate lines and are commented out be a semi-colon at the beginning of the line.
You can use wildcards for your policies.
* for several characters – only one in series allowed
? for one charecter – several in series allowed
Also, you can use enviroment variables such as %user%%temp% oder %systemroot%, to resolve the relative path to the system folders.

Example policies:

; Unblock drive c:\
FILES_ALLOW_ANY = c:\*

; Unblock the folder named "LCB" – no matter where the folder is stored 
FILES_ALLOW_ANY = *\LCB\*

; Unblock folder of current logged in user – like c:\user\username
FILES_ALLOW_ANY = %homedrive%%homepath%\*

; Unblock PDF files beginning with "LCB_SaveAs" – such as LCB_SaveAs_Example.pdf
FILES_ALLOW_ANY = *\LCB_SaveAs*.pdf

; Unblock all PDF files (not recommended!)
FILES_ALLOW_ANY = *.pdf


Eine Ausnahmeregelung in der Whitelist
//
A policy in the white list



Registrierungsdatei – zum Aktivieren der Whitelist für Adobe Reader X
//
Registry file – for activation of white list usage in Adobe Reader X
https://acrobat.com/#d=ssEHVn-3XANi7bbF9eZEVQ

Beispiel – Whitelist
//
Sample – white list
https://acrobat.com/#d=Z1HrB*ocHqklQX*w1bfiXg

12.07.2010

Eigenen Installer für Formulare und Folder Level Skripte erstellen
//
Create own installer for forms and folder level scripts


Sicherheit ist wichtig, bringt aber auch Probleme mit sich. Wenn Sie mit Formularen und Skripten arbeiten, merken Sie schnell, dass sie bei Acrobat oder Reader die interessantesten Funktionen meist nur aus vertrauenswürdigen Umgebungen heraus ausführen dürfen.
Dafür müssen Sie die Skripte zum Teil in sogenannte Folder Level Scripts auslagern, die dann auf dem jeweiligen PC erst mal installiert werden müssen.
Das klappt in eigenem Büro meist noch ohne großen Aufwand.
Aber was, wenn sie ihre Dateien an Kunden verteilen, die von sowas keine Ahnung haben oder denen das zu aufwendig ist.

Ganz klar, bauen sie einen Setup, der das alles erledigt.
Dafür empfiehlt sich zum Beispiel die Freeware Inno Setup.
Durch diverse Zusatzprogramme ist es ein mächtiges Tool, mit dem sie sehr umfangreiche Installer mit professionellen Touch erstellen können.

Diese Methode bietet einigen Vorteile.
So können Sie beliebig viele Dateien unterschiedlichsten Typs mit nur einer Setup-Datei verteilen, die Benutzer brauchen lediglich den Setup einmal ausführen, um alles an seinem Platz zu haben und über die Deinstallationsroutine können sie auch alles auf einmal wieder entfernen.

Dieses Beispiel zeigt ihnen einen Installer, der prüft, ob ein Adobe Reader oder Acrobat installiert ist, dann den Pfad zu deren JavaScript-Ordner erstellt und ein Folder Level Script sowie einige XFA-Formulare installiert.
Der Installer ist zudem zweisprachig ausgelegt (deutsch und englisch) und mit eigenem Layout versehen.
Und das alles braucht weniger als 150 Zeilen Code.


Security is neccessary but causes other problems. Ic you work with forms and scripts you will learn that Acrobat or Reader allow the usage of interessting functions such as "saveAs" only from trusted enviromments.
Therefore you have to writhe part of your scripts into so called folder level scripts which have to be installed on each induvidual computer first.
In a office this maybe not the problem.
But what if your distribute your forms to customers who don't know how to install those files or don't want?

You will have to build a setup that will do this automatically.
Therefore the freeware Inno Setup is advisable.
With a lot of extensions available it's a powerful tool to create comprehensive installers with a professional touch.

This method offers several advantages.
You can distribute any number of files with different file types at once with only one setup-file.
Also, the users only need to execute the setup once to have everything in the right place and with the uninstall routine they also can remove all at once.

This example shows an installer that checks if there is an Adobe Reader or Acrobat installed.
If so it generates the path to the JavaScrips folder and installs a Folder Level Script and some XFA forms.
Also, the installer is multiligual (german and english) and has its own layout.
All done with less that 150 lines of code.

LCB Sample Installer:

1: Sprache auswählen // Select language










2: Installer prüft ob Acrobat/Reader installiert ist // Installer checks if Acrobat/Reader is installed







3: Installationsassistent startet // Install wizard runs















4: Aufgaben des Setups auswählen // Select task for the setup















5: Installation wird durchgeführt // Installation proceeds















6: Setup abschließen // Complete setup















7: Installierte Dateien im Programme-Menü // Installed files in the program menu


















8: Installiertes Folder Level Script // Installed folder level script















Inno Setup Code:
; LCB Installer Script
  #define MyAppName "LCB"
  #define MyAppVerName "1.0"


[Setup]
  AppId={{536B756A-54AA-4C37-8ADA-0C942B8327E7}
  AppName={#MyAppName}
  AppVerName={#MyAppName} {#MyAppVerName}
  VersionInfoVersion={#MyAppVerName}
  AppPublisher=Your Name Here
  AppComments=
  AppPublisherURL=
  AppSupportURL=
  AppUpdatesURL=
  AppCopyright=
  DefaultDirName={pf}\{#MyAppName}
  DisableDirPage=yes
  DefaultGroupName={#MyAppName}
  DisableProgramGroupPage=yes
  InfoAfterFile=SourceFiles\LCB_ReadMe.rtf
  OutputDir=FinalFiles
  OutputBaseFilename={#MyAppName}_Sample_Installer_{#MyAppVerName}
  Compression=lzma
  SolidCompression=yes
  SetupIconFile=SourceFiles\LCB_Icon.ico
  UninstallDisplayIcon=SourceFiles\LCB_Uninstall_Icon.ico
  UninstallDisplayName={#MyAppName} {#MyAppVerName}
  WizardImageFile=SourceFiles\LCB_Wizard_164x314.bmp
  WizardSmallImageFile=SourceFiles\LCB_Wizard_55x55.bmp


[Languages]
  Name: en; MessagesFile: compiler:Default.isl
  Name: de; MessagesFile: compiler:Languages\German.isl


[Files]
  Source: SourceFiles\ISSkin.dll; DestDir: {app}; Flags: dontcopy
  Source: SourceFiles\Styles\Office2007.cjstyles; DestDir: {tmp}; Flags: dontcopy
  Source: SourceFiles\LCB_SaveAs.js; DestDir: {code:ReturnPath}; Flags: ignoreversion
  Source: SourceFiles\LCB\*; DestDir: {app}\LCB\; Flags: ignoreversion recursesubdirs createallsubdirs
  Source: SourceFiles\LCB_ReadMe.rtf; DestDir: {app}; Flags: ignoreversion
  Source: SourceFiles\LCB_Licence.rtf; DestDir: {app}; Flags: ignoreversion
  Source: SourceFiles\LCB_Icon.ico; DestDir: {app}; Flags: ignoreversion
  Source: SourceFiles\LCB_Uninstall_Icon.ico; DestDir: {app}; Flags: ignoreversion


[Icons]
  Name: {group}\LCB SaveAs Sample; Filename: {app}\LCB\LCB_SaveAs.pdf; WorkingDir: {app}; IconFilename: {app}\LCB_Icon.ico
  Name: {group}\LCB Control View Sample; Filename: {app}\LCB\LCB_Control_View.pdf; WorkingDir: {app}; IconFilename: {app}\LCB_Icon.ico
  Name: {group}\LCB Stacked Bar Chart Sample; Filename: {app}\LCB\LCB_FormCalc_Charts_StackedBarChart.pdf; WorkingDir: {app}; IconFilename: {app}\LCB_Icon.ico
  Name: {group}\Uninstall LCB; Filename: {uninstallexe}; IconFilename: {app}\LCB_Icon.ico
  Name: {userdesktop}\LCB; Filename: {app}\LCB\LCB_SaveAs.pdf; WorkingDir: {app}; Tasks: desktopicon1; IconFilename: {app}\LCB_Icon.ico; Comment: Open LCB_SaveAs Sample
  Name: {userdesktop}\LCB; Filename: {app}\LCB\LCB_Control_View.pdf; WorkingDir: {app}; Tasks: desktopicon2; IconFilename: {app}\LCB_Icon.ico; Comment: Open Control View Sample
  Name: {userdesktop}\LCB; Filename: {app}\LCB\LCB_FormCalc_Charts_StackedBarChart.pdf; WorkingDir: {app}; Tasks: desktopicon3; IconFilename: {app}\LCB_Icon.ico; Comment: Open Stacked Bar Chart Sample


[Tasks]
  Name: desktopicon1; Description: Create shortcut on Desktop for SaveAs Sample; Flags: unchecked
  Name: desktopicon2; Description: Create shortcut on Desktop for Control View Sample; Flags: unchecked
  Name: desktopicon3; Description: Create shortcut on Desktop for Stacked Bar Chart Sample; Flags: unchecked


[Run]
  Filename: {app}\LCB\LCB_SaveAs.pdf; Verb: open; Description: Open LCB SaveAs Sample; Flags: postinstall shellexec unchecked
  Filename: {app}\LCB\LCB_Control_View.pdf; Verb: open; Description: Open LCB Control View Sample; Flags: postinstall shellexec unchecked
  Filename: {app}\LCB\LCB_FormCalc_Charts_StackedBarChart.pdf; Verb: open; Description: Open LCB Stacked Bar Chart Sample; Flags: postinstall shellexec unchecked


[CustomMessages]
  de.msgbox_1 =Setup hat einen geeigneten PDF-Viewer (Adobe Reader/Acrobat) auf Ihren Computer gefunden und kann nun fortgesetzt werden.%n
  de.msgbox_2 =%nGefundener PDF-Viewer: %n
  en.msgbox_1 =Setup found PDF-Viewer (Adobe Reader/Acrobat) on your computer and can be continued now.%n
  en.msgbox_2 =%nFound PDF-Viewer: %n
  de.msgbox_Error_1 =Fehler aufgetreten:%nEs wurde kein Adobe Reader bzw. Adobe Acrobat auf Ihrem Computer gefunden.%n%n
  de.msgbox_Error_2 =Sie müssen mindestens einen Adobe Reader 8.1 oder Adobe Acrobat 8 installiert haben,%num diesen Installer benutzen zu können.%n%n
  de.msgbox_Error_3 =Setup wird nun beendet.
  en.msgbox_Error_1 =An error occured:%nNo Adobe Reader or Adobe Acrobat could be found on your computer.%n%n
  en.msgbox_Error_2 =Install at least Adobe Reader 8.1 or Adobe Acrobat 8 first,%nbefore you use this Installer.%n%n
  en.msgbox_Error_3 =Setup will be aborted now.


[Code]
  procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
  external 'LoadSkin@files:isskin.dll stdcall';
  procedure UnloadSkin();
  external 'UnloadSkin@files:isskin.dll stdcall';
  function ShowWindow(hWnd: Integer; uType: Integer): Integer;
  external 'ShowWindow@user32.dll stdcall';
  function InitializeSetup(): Boolean;
  begin
   ExtractTemporaryFile('Office2007.cjstyles');
   LoadSkin(ExpandConstant('{tmp}\Office2007.cjstyles'), 'NormalSilver.ini');
   Result := True;
  end;


  procedure DeinitializeSetup();
  begin
   ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
   UnloadSkin();
  end;


  function CheckAdobeViewer(): String;
    var
    AdobeReaderVersion,AdobeAcrobatVersion,Version :  String;
    begin
    Result:='no';


  if  (RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe', '', AdobeReaderVersion))
    then
      begin
        GetVersionNumbersString( AdobeReaderVersion , Version);
        Result := 'Adobe Reader Version: ' + Version;
      end
  else
    if (RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe', '', AdobeAcrobatVersion))
      then
        begin
          GetVersionNumbersString( AdobeAcrobatVersion ,Version);
          Result := 'Adobe Acrobat Version: ' + Version;
        end
  else
    begin
      MsgBox(ExpandConstant('{cm:msgbox_Error_1}') + ExpandConstant('{cm:msgbox_Error_2}') + ExpandConstant('{cm:msgbox_Error_3}'),MBError,mb_ok);
        begin
          Abort;
        end
    end
  end;


  function CheckAdobePath(): String;
    var
    FilePath: String;
    begin
      FilePath := '';
      if (RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe','', FilePath))
        then
          begin
            result := ExtractFileDir(FilePath) + '\JavaScripts\';
          end


  if (RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe','', FilePath))
    then
      begin
        result := ExtractFileDir(FilePath) + '\JavaScripts\';
      end
  end;


  function  ReturnPath (Get:String):String;
    begin
      result := CheckAdobePath;
    end;


  procedure InitializeWizard();
  begin MsgBox(ExpandConstant('{cm:msgbox_1}') + ExpandConstant('{cm:msgbox_2}') + CheckAdobeViewer,MBinformation,mb_ok);
  end;



Dieses Script und auch einen fertigen Setup können Sie hier herunterladen.
Die Dateiendung des Setups müssen sie nach dem Download in *.EXE ändern!
Läuft unter Windows XP / Vista / 7 - 32Bit & 64Bit.

You can download this script and a working setup here.
After downloading the setup you need to change the file extension to *.EXE!
Runs under Windows XP / Vista / 7 - 32Bit & 64Bit.


Bespiel Inno Setup *.iss-Datei // Example Inno Setup *.iss file:

Beispiel Setup.exe // Example Setup.exe




Inno Setup und viele Erweierungen bekommen Sie unter folgenden URLs:


You can get Inno Setup and a lot of extenstion under the following URLs:


Inno Setup Download:
http://www.jrsoftware.org/isinfo.php

Inno Setup Erweiterungen // Inno Setup Extensions (3rd Party):
http://www.jrsoftware.org/is3rdparty.php

30.11.2009

Formulare in bestimmte Verzeichnisse speichern und nach Inhalt aus Formularfeld benennen
//
Save forms to specific directories and named after form field data

Dies Thema hat mich selbst eine lange Zeit beschäftigt.
Wie speichert man ein Formular in ein bestimmtes Vereichnis und wie benennt man es dann auch gleich noch nach einem Feldinhalt aus dem Formular selbst?

Programme wie MS Word können Letzteres ja, nicht so der Adobe Acrobat oder Reader.

Also muss JavaScript wieder her.
Damit klappt's, aber auch nur unter Verwendung von Folder Level Skripten, da die Sicherheitseinstellungen von Acrobat und Reader es ansonsten verbieten.
Eine einfache Variante des Ganzen könnte etwa so aussehen.
Ein Folder Level Script sowie ein Button und Formularfeld im Formular interagieren miteinander.

This issue took a long time for me to clear up.
How can I control the save directory of a form and how do I also rename the form after some data of the form itself?

Applications such as MS Word are able to do the latter, but Adobe Acrobat or Reader don't.

So you need JavaScript to realize this task.
But, because of Acrobat's and Reader's security restrictions this is only possible with folder level scripts.
A simple version can look like this.
The folder level script and also a button and field in the form interact with each other.


Beispiel-Formular – Speicherung in durch Skript angegebene Verzeichnisse
//
Sample form – Saving into directories specified through scripting


Beispiel-Ordner – Speicherung in einer der 4 Unterodner mittels JavaScript möglich
//
Sample folders – Saving directly into one of the 4 subfolder via JavaScript



Folder Level Script – JavaScript

var LCB_SaveAs = app.trustedFunction(function(doc) 
{         
    app.beginPriv();
  var LCB_SaveAsTarget = SaveAsTarget;
  doc.saveAs({cPath: LCB_SaveAsTarget});
    app.endPriv();
});


JavaScript zur Erstellung des Zielpfads
//
JavaScript to create save path 
// Variables we use in the filename taken from fields somewhere in the form
var Var1 = xfa.resolveNode("form1.#subform.cDepartment").rawValue;
var Var2 = xfa.resolveNode("form1.#subform.cName").rawValue;

// Create a time stamp for the new file
var TimeStamp = util.printd("ddmmyyyy", new Date());

// This functions checks the current file name. If it is not the correct file name we don't save the file under a new file name
if (event.target.documentFileName === "LCB_SaveAs_V2.pdf") 
 {
 // Name of a sub directory
 // To save in the same directory enter ""
 // To save in a named subfolder enter "Foldername/" (don't forget the trailing slash!)
 var Directory = Var1 + "/";
 // Concatenate the variables to a file name
 var NewFileName = "LCB_SaveAs_V2" + "_";
 NewFileName += Var2 + "_";
 NewFileName += TimeStamp;
 NewFileName += ".pdf";
 // Replace all characters that are not allowed to be used in a save path – this it to avoid an raise error
 NewFileName = NewFileName.replace(/[\s\!\?\<\>\'\"\*\/\\\=\?\^\`\{\}\|\~]+/g, "_");
 // Concatenate save path with new file name for this form and show it into this field
 this.rawValue = event.target.path.replace(event.target.documentFileName, "") + Directory + NewFileName;
 }
else
 {
 this.rawValue = event.target.path;
 }

JavaScript für Speichern-Button
//
JavaScript for Save Button


if (event.target.documentFileName === "LCB_SaveAs_V2.pdf")
  {
  //A variable for the Folder Level Script
  SaveAsTarget = xfa.resolveNode("form1.#pageSet.Page1.FileParameters.TargetSubDirectory").rawValue; 
  try
   {
   event.target.LCB_SaveAs(event.target);
  
   // Show message to inform the user, where the new file was saved.
   xfa.host.messageBox("File has beed saved under:\r\r" + SaveAsTarget, "File Saved", 3, 0);
   xfa.form.execInitialize();
   }
  catch(e)
   {
   xfa.host.messageBox(e.toString().replace("RaiseError: ","") + "\r\rEnsure the destination folder exists and there isn't already a file with the same file name in that folder!", "Failed to save file", 0, 0);   }
  }
else
  {
  // Open the 'Save As' dialog to let the user choose the target and filename.
  app.execMenuItem("SaveAs");
  }

Das Beispielformular geht noch weiter rein in die Materie und wird sie sicher interessieren.
Sie können z.B. in verschiedene Unterverzeichnisse speicher, je nach dem, welchen Wert Sie aus einer Dropdown-Liste ausgewählt haben.


The example form is much more detailed and will surely find your interest.
For example, you can save the form into one of several sub directories, depending on the selections you made in a drop down list.
Aktualisierung - Eine neuere Version ist hier verfügbar
//
Update - A newer version is available here
http://thelivecycle.blogspot.de/2015/06/save-with-new-name-in-specified.html