Suche // Search:

Posts mit dem Label Save werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Save werden angezeigt. Alle Posts anzeigen

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

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

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