hilfdirselbst.ch
Facebook Twitter gamper-media
"Funktioniert nicht" ist keine hinreichende Fehlerbeschreibung.
Anonym
Beiträge: 22827
29. Jan 2003, 14:41
Beitrag #1 von 10
Bewertung:
(7117 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Hallo Leute,
weiss jemand , wie ich globale Funktion für die JavaScript-Konsole in Acrobat schreibe, um sie dann auf alle im Acrobat geöffneten Formulare anzuwenden. Jetzt funktioniert sie nur für die aktuell geöffnete/fokusierte Seite.

Danke für die Hilfe

Garydux

function sMeinTool2()
{
var dDoc = event.target;

console.println("Daten aller Felder eines Dokuments :");


for(var i=0; i<this.numFields; i++)
{

name=this.getNthFieldName(i);
f=this.getField(name);



console.println("//////////////////////////////////////////////////");
console.println("Feldname:"+f.name+" (Seite " +f.page+ ")");
console.println("value:"+f.value);
console.println("value as String:"+f.valueAsString);
console.println("userName:"+f.userName);
if((f.type=="combobox")|(f.type=="listbox")|(f.type=="checkbox")|(f.type=="radiobutton"))
{
for(var j=1; j<f.exportValues.length+1;j++)
{
console.println("Exportwert Nr"+j+":"+f.exportValues[j-1]);
}
}

}
} Top
 
X
Markus Walker  M 
Beiträge: 494
30. Jan 2003, 08:31
Beitrag #2 von 10
Beitrag ID: #23140
Bewertung:
(7092 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Mit dem Property app.activeDocs kann bestimmt werden, welche Dokumente offen sind, sofern diese das disclose Property auf true gesetzt haben (siehe hierzu die Readme-Datei des 5.0.5-Updates!).
als Antwort auf: [#23019] Top
 
Anonym
Beiträge: 22827
30. Jan 2003, 12:05
Beitrag #3 von 10
Beitrag ID: #23197
Bewertung:
(7094 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Vielen Dank Markus, deine Antwort hat mich jetzt weitergebracht. Nur habe noch eine Frage , wie kann ich es anstellen, dass alle Dokument die im Acrobat geöffnet werden die Property : disclose , den Wert "true" bekommen? Welche Möglichkeiten gibt es?

Gruss Garydux


als Antwort auf: [#23019] Top
 
Anonym
Beiträge: 22827
30. Jan 2003, 22:08
Beitrag #4 von 10
Beitrag ID: #23305
Bewertung:
(7092 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Es sollte übrigens disclosed (nicht disclose) heissen.

Die Antwort zur Frage ist in der «Acrobat JavaScript Object Specification» seit der Version 5.05 beschrieben: «&#8230;if the target document has disclosed set to true in a document level JavaScript&#8230;»
Also stellt sich die Frage, wie dieses Script in alle gewünschten PDF rein kommt.
Bei wenigen Dateien geschieht dies am einfachsten händisch. Es muss ja bloss die Zeile «this.disclosed = true;» als Doc-Level-Script eingegeben werden.
Bei vielen Dateien kann dies mit einer Batch-Sequenz erstellt werden:
http://forum.planetpdf.com/...px.dll/read?35868, 34
als Antwort auf: [#23019] Top
 
Markus Walker  M 
Beiträge: 494
30. Jan 2003, 22:13
Beitrag #5 von 10
Beitrag ID: #23306
Bewertung:
(7092 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Oops, da vergass ich mich anzumelden...
Der obige Link sollte wie folgt heissen (dann braucht es keine Anmeldung):
http://forum.planetpdf.com/archive/35868.htm
als Antwort auf: [#23019]
(Dieser Beitrag wurde von Markus Walker am 30. Jan 2003, 22:15 geändert)
Top
 
Anonym
Beiträge: 22827
31. Jan 2003, 09:35
Beitrag #6 von 10
Beitrag ID: #23332
Bewertung:
(7092 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Danke Markus, ich habe auch schon die Beschreibung für die FDF-Datei gefunden gehabt aber, nicht in dieser Form. Direkt von Adobe, und dort war es zeimlich ungenau, mit komischen Zeichen. Danke nochmals. Jetzt noch die letzte Frage bitte ;-). Ich versuche jetzt auch den Titel , also den Dateinamen des Dokuments oben in der Funktion rauszulesen, aber meine Versuche führen zu nichts. Nach der Dokumentation von Adobe denke ich so soll es sein, habe auch versucht die URL auszugeben(this.url) klapt aber nicht bekomme 'undifined' zurück

function sWriteReportPDF()
{
var dDoc = event.target;

var aMedia=[420,595];
var rep = new Report(aMedia);

rep.size=0.9;
rep.color=color.blue;
rep.writeText("Titel des Dokuments :"+this.info.Title);
als Antwort auf: [#23019] Top
 
Markus Walker  M 
Beiträge: 494
31. Jan 2003, 13:08
Beitrag #7 von 10
Beitrag ID: #23371
Bewertung:
(7092 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


...FDF-Datei gefunden gehabt aber, nicht in dieser Form. Direkt von Adobe, und dort war es zeimlich ungenau, mit komischen Zeichen...
Welche Dokumentation? Link?


...den Titel , also den Dateinamen des Dokuments ...
Was jetzt? Der Dateiname ist klar und wird durch auslesen des Property «path» oder «URL» aus dem Doc-Object ermittelt. Der letzte Teil daraus ist der Dateinahme und wird in meinen Augen am elegantesten durch folgende Zeile ermittelt:
filename = path.split("/").pop()
Die beiden Properties URL (gibts erst seit Version 5) und path haben grosse Ähnlichkeiten und sind identisch, wenn ein PDF über das Browser-Plugin betrachtet wird.

Der Titel ist Teil der Meta-Daten und kann über das info Property des Doc-Objects erfahren werden. Wenn der Ersteller des PDFs keinen solche Eintrag machte (was recht häufig vorkommt!), ist dieser logischerweise undefined.

Zum Code kann ich kaum etwas sagen, da nicht bekannt ist, durch welchen event er getriggert wird. Dies beeinflusst was event.target beinhaltet und worauf this zeigt. (siehe «Acrobat JavaScript Object Specification»)
als Antwort auf: [#23019]
(Dieser Beitrag wurde von Markus Walker am 31. Jan 2003, 13:09 geändert)
Top
 
Anonym
Beiträge: 22827
4. Feb 2003, 09:03
Beitrag #8 von 10
Beitrag ID: #23623
Bewertung:
(7092 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Danke Markus, hast mir echt geholfen, meine Funktion funktioniert. Ich habe sie zu den Werkzeugen hinzugefügt und sie arbeitet für alle geöffneten Formulare,wenn die natürlich Property disclosed auf true haben. Jetzt möchte ich aber das ganze noch optimieren und eine Stapelsequenz definieren um viele Dokumente auf einmal zu überprüfen. Den im Akrobat lassen sich höchstens 20 Dokumente aufmachen. Geht das, dass ich schon die vorhandene Funktion einfach auf die noch nicht geöffneten Dateien aufrufe. Wenn ich es tue bekomme ich eine Exception in der Konsole mit folgender Meldung:

uncaught exception:Batch :Exec:273: Report.open Acrobat-Erhebungsfehler: ===> Acrobat kann diese Datei nicht öffnen, da ein gebundenes Dialogfeld geöffnet ist.

Die Funktion ist im Globalen js-Script definiert:
und einfach so wie die Methode heisst in der Sequenz aufgerufen:

sWriteReportPDF2();

ist das OK so? meiner Meinung ja aber es funktioniert nicht wie gesagt.Habe auch folgendes ausprobiert:

var obj=event.target;
obj.sWriteReportPDF2();

Kannst du mir bitte einen Tip geben?

MfG Gary



function sWriteReportPDF2()
{
var dDoc = event.target;

var aMedia=[420,595];
var rep = new Report(aMedia);
filename = this.path.split("/").pop();
rep.size=0.9;
rep.color=color.green;
rep.writeText("Dateiname des Dokuments :"+filename);
rep.color=color.blue;
rep.writeText("Daten aller 'mehrdeutigen' Felder eines Dokuments, die gleiche Exportwerte haben :");
rep.writeText("'value' und 'value as String' sagen aus ob das Feld ");
rep.writeText("ausgewaelt/angeklickt wurde. Wenn ja erscheint ein Exportwert, ");
rep.writeText("sonst erscheint 'off' ");

for(var i=0; i<this.numFields; i++)
{

name=this.getNthFieldName(i);
f=this.getField(name);

if((f.type=="combobox")|(f.type=="listbox")|(f.type=="checkbox")|(f.type=="radiobutton"))
{
if(sindExportWerteVerschieden(f.exportValues)==false)
{
rep.color=color.black;
rep.writeText("______________________________________________");
rep.writeText("Feldname:"+f.name+" (Seite " +f.page+ ")");
rep.writeText("Eingegebene Wert in einem Feld:"+f.value);
rep.writeText("Kurze Beschreibung:"+f.userName);

for(var j=1; j<f.exportValues.length+1;j++)
{
rep.color=color.red;
rep.writeText("Exportwert Nr "+j+":"+f.exportValues[j-1]);
}
}
}

}

var docRep = rep.open("ReportDocument.pdf");
docRep.info.Title="Bericht zu aktuellem Formular";
docRep.info.Subject="Zusammenfassung der unzureichend definierten Felder";

return;
}
als Antwort auf: [#23019] Top
 
Markus Walker  M 
Beiträge: 494
4. Feb 2003, 16:32
Beitrag #9 von 10
Beitrag ID: #23687
Bewertung:
(7092 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Hallo Gary Anonym

«gebundenes Dialogfeld» als Übersetzung von «modal dialog» finde ich interessant, aber das nur am Rande.

Die Lösung zu diesem Problem ist auf der Acrobat-CD im Verzeichnis «Batch» zu finden. Dort sind verschiedene Beispiel-Sequenzen und ein PDF-Dokument mit den zugehörigen Erklärungen abgelegt. Das letzte Beispiel im Dokument behandelt die Problematik der Repot-Ausgabe aus einem Batch. Also: RTFM!
Wenn's danach noch unklar ist, schauen wir weiter.

«Die Funktion ist im Globalen js-Script definiert...»
Ich habe das Gefühl, dass hier die Bezeichnung «Global» nicht korrekt verwendet wird. Ich nehme mal an, dass es sich um ein sogenanntes Document-Level-Script handelt, womit die Funktion nur innerhalb des entsprechenden Dokuments definiert ist. Global kann eine Funktion sein, welche in einem Folder-Level-Script (also extern der PDF-Datei) definiert wird oder wenn die Funktion einer globalen Variabeln zugewiesen wird.
Also überlege Dir genau, wann die Funktion vom JavaScript-Interpreter gelesen wird, was ihr scope ist und wie lange sie definiert bleibt.

Über die Anwendung von «event.target» kann immer noch nicht viel gesagt werden, da nicht klar ist, welcher event nun zum Start der Funktion führen soll.
Übrigens ist die Rückfrage nach der ungenauen Dokumentation (siehe oben) auch noch offen.

Viel Spass beim lesen und natürlich warten wir gespannt auf Deine Rückmeldungen.
als Antwort auf: [#23019] Top
 
Anonym
Beiträge: 22827
4. Feb 2003, 17:12
Beitrag #10 von 10
Beitrag ID: #23695
Bewertung:
(7095 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

JavaScript & Acrobat


Hallo Markus , nochmals danke. Hier der Link zur nicht ganz eindeutigen FDF-Beschreibung von früher : http://www.actino.de/...d_0201.pdf(Pdf-Seite 5)

Und zum "globalen" Script, ich meinte ich definiere meine Funktionen in einer "muster.js" -Datei und kopiere sie in das Verzeichnis:
D:\Programme\adobe\acrobat 5.0\Acrobat\Javascripts
Die Funktionen binde ich in die Acrobatoberfläche (app.addSubMenu...und so weiter) Die Funktionen werden somit mit dem Start des Acrobats geladen.

Gruss Gary

Codeauszug aus muste.js:


WGVTool_V1AddMenuItem();

function WGVTool_V1AddMenuItem()
{



var sUmnEnableIfDocOpen = "event.rc = event.target != null";
var bDeu = (app.language== "DEU")

var sWGVformulareTool =(bDeu) ? "Meine-Tools" : "Make WGV-Report for formular";
app.addSubMenu({ cName: "sWGVformulareTool", cUser:sWGVformulareTool, cParent: "Tools"});

var sWriteReportPDF =(bDeu) ? "WGV-Prüfprotokol erstellen(aktuelle Seite)" : "writing all fields with same exportdata in pdf-file(page) ";
app.addMenuItem({ cName:"sWriteReportPDF", cUser:sWriteReportPDF, cParent:"sWGVformulareTool",
cEnable: sUmnEnableIfDocOpen,
cExec:"sWriteReportPDF();"});
var sWriteReportPDFforAllpages =(bDeu) ? "WGV-Prüfprotokol erstellen(für alle geöfneten Formulare, siehe Hilfe) " : "writing all fields with same exportdata in pdf-file(all open pages) ";
app.addMenuItem({ cName:"sWriteReportPDFforAllpages", cUser:sWriteReportPDFforAllpages, cParent:"sWGVformulareTool",
cEnable: sUmnEnableIfDocOpen,
cExec:"sWriteReportPDFforAllpages();"});

...
als Antwort auf: [#23019] Top
 
X