[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Metadaten per Skript eintragen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Metadaten per Skript eintragen

da zoate
Beiträge gesamt: 34

21. Nov 2014, 15:09
Beitrag # 1 von 16
Bewertung:
(6912 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,
ich habe ein Skript, um die Metadaten automatisch einzutragen. Die Einträge in die einzelnen Felder werden über Absatzformate identifiziert. Das funktioniert auch alles wie es soll, bis auf die Tatsache, dass die Einträge in die Felder "Autoren" und "Keywords" in Anführungszeichen eingeschlossen werden - was nicht sein soll. Kann mir jemand weiterhelfen, um diese Anführungszeichen zu verhindern?

Vielen Dank
da zoate
Win7, ID6

Hier das Sript (meine Skripting-Kenntnisse sind auf das Adaptieren bestehender Skripte beschränkt, die dem, was ich suche, möglichst nahe kommen, also ist der Code sicher nicht optimal):

Code
# targetengine session { 
var myDoc = app.activeDocument;
var docTitleText = "";
var docAuthorText = "";
var docDescripionText = "";
var docKeywordsText = "";

app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.findWhat = '.+';
found = app.activeDocument.findGrep(true);

for (j = found.length - 1; j >= 0; j--) {
var foundText = found[j].contents;
if (found[j].texts[0].appliedParagraphStyle.name == "Title") {
docTitleText = found[j].contents;
} else if (found[j].texts[0].appliedParagraphStyle.name == "Authors") {
docAuthorsText = found[j].contents;
} else if (found[j].texts[0].appliedParagraphStyle.name == "Authors after 2-line title") {
docAuthorsText = found[j].contents;
} else if (found[j].texts[0].appliedParagraphStyle.name == "Abstract") {
docDescriptionText = found[j].contents;

} else if (found[j].texts[0].appliedParagraphStyle.name == "Keywords") {
docKeywordsText = found[j].contents;
}
}

with(myDoc.metadataPreferences) {
author = docAuthorsText;
documentTitle = docTitleText;
description = docDescriptionText;
keywords = [docKeywordsText];
}

};


----

Edit: Bitte benutzen Sie den CODE Button unter dem Eingabefenster. Danke, gs.

(Dieser Beitrag wurde von Gerald Singelmann am 21. Nov 2014, 15:26 geändert)
X

Metadaten per Skript eintragen

Kai Rübsamen
Beiträge gesamt: 4684

21. Nov 2014, 19:37
Beitrag # 2 von 16
Beitrag ID: #534270
Bewertung:
(6852 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!

Du hast eine Variable 'docAuthorText'. Unten heißt das Teil aber plötzlich 'docAuthorsText'. 'docDescripionText' und 'docDescriptionText' meint auch nicht dasselbe. Der Eintrag mit dem Format 'Authors' dürfte eigentlich bei dir nicht ankommen, da der Inhalt der Variablen mit 'Authors after 2-line title' überschrieben wird.

Deine Anführungszeichen kommen evtl., weil die Fundstelle wahrscheinlich als ein String und nicht als Array von Strings gefunden wird. Wenn du am Schluss eckige Klammern setzt, ist das zwar auch ein Array von Strings, aber nur mit einem String.

Ich schafffe es gerade hier, dass ich keine Anführungszeichen erhalte, wenn die Keywords jeweils in einem eigenen Absatz stehen ODER nacheinander mit Komma und Leerzeichen geschrieben werden. Als Trennzeichen in den Metazeichen wird mir allerdings ein Semikolon und kein Komma gesetzt?!

Bau doch bitte ein Beispiel, damit man sieht, wie deine Metadaten auf der Dokumentseite abgegriffen werden müssen.


als Antwort auf: [#534268]
(Dieser Beitrag wurde von Kai Rübsamen am 21. Nov 2014, 19:47 geändert)

Anhang:
Bildschirmfoto 2014-11-21 um 19.41.59.png (14.9 KB)   Bildschirmfoto 2014-11-21 um 19.46.31.png (38.2 KB)

Metadaten per Skript eintragen

Kai Rübsamen
Beiträge gesamt: 4684

21. Nov 2014, 20:42
Beitrag # 3 von 16
Beitrag ID: #534272
Bewertung:
(6824 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Nachtrag:

Die Keywords verlangen einen Array of Strings. Das habe ich mittlerweile im Griff.

Wenn es nur einen Treffer für Autor gibt, das auch.

Lautet der Treffer aber:
Code
"Hans, Martin, Kai" 


landen die Anführungszeichen im Dialog. Prüfe ich das ganze im ESKT, finden sich dort keine Anführungszeichen.

Code
with ( app.activeDocument.metadataPreferences ) {  
author = "Hans, Martin, Kai";
}


Dann habe ich versucht nur einen Namen aufzunehmen und den zweiten später zu ergänzen. Auch das funktioniert nicht.

Mache ich da etwas falsch oder ist das ein bug?


als Antwort auf: [#534270]
(Dieser Beitrag wurde von Kai Rübsamen am 21. Nov 2014, 20:43 geändert)

Metadaten per Skript eintragen

da zoate
Beiträge gesamt: 34

21. Nov 2014, 21:44
Beitrag # 4 von 16
Beitrag ID: #534273
Bewertung:
(6788 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zuerst danke an Gerald Singelmann, dass er mich auf den Code-Button aufmerksam gemacht hat.

Kai, danke für die Bemühungen.
Zuerst entschuldige ich mich dafür, die vorletzte Version des Skripts einkopiert zu haben, den docAuthor/AuthorsText Fehler hatte ich schon ausgemerzt (den anderen aber nach wie vor übersehen) und hab dann aber trotzdem die unkorrigierte Version erwischt. Am Ergebnis ändert das aber nichts.
Weiters kann es in einem Dokument nur entweder das Absatzformat "Author" oder "Author after 2-line title" geben.
Die Keywords sind auch im Dokument durch ; getrennt, das sollte auch in den Metadaten so sein, muss aber nicht.

Anbei sollte ein Beispieldokument mit den entsprechenden Formaten und den mittels des untenstehenden Skripts befüllten Metadatensein - leider ist seit Mittag das Internet in der Region stark beeinträchtigt und das Hochladen klappt nicht. Werde versuchen, es so bald wie möglich nachzuliefern, falls es dann noch nötig sein sollte. Mitgliedschaft bezahlen habe ich immerhin geschafft.

Vielleicht geht es so:

DOKUMENT:

Titel des Artikels [Absatzformat "Title"]

Anton Erstautor, Bernhard Zweitautor & Dietmar Viertautor ["Authors"]

Abstract Id et explitatio. Oditem qui dus mos num eosandaerum ["Abstract"]

Keywords Keyword 1; Keyword 2; Keyword 3; Keyword 4 ["Keywords"]


METADATEN:

Titel des Artikels

"Anton Erstautor, Bernhard Zweitautor & Dietmar Viertautor"

Abstract Id et explitatio. Oditem qui dus mos num eosandaerum

"Keywords Keyword 1; Keyword 2; Keyword 3; Keyword 4"




Die Anführungszeichen sind auch mit dem korrigierten Skript noch vorhanden.

da zoate

Code
#targetengine session 
{
var myDoc = app.activeDocument;
var docTitleText="";
var docAuthorsText="";
var docDescriptionText="";
var docKeywordsText="";

app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.findWhat = '.+';
found = app.activeDocument.findGrep (true);

for (j = found.length-1; j >=0 ; j--)
{
var foundText = found[j].contents;
if(found[j].texts[0].appliedParagraphStyle.name=="Title")
{
docTitleText=found[j].contents;
}

else if(found[j].texts[0].appliedParagraphStyle.name=="Authors")
{
docAuthorsText=found[j].contents;
}

else if(found[j].texts[0].appliedParagraphStyle.name=="Authors after 2-line title")
{
docAuthorsText=found[j].contents;
}

else if(found[j].texts[0].appliedParagraphStyle.name=="Abstract")
{
docDescriptionText=found[j].contents;

}
else if(found[j].texts[0].appliedParagraphStyle.name=="Keywords")
{
docKeywordsText=found[j].contents;
}
}

with (myDoc.metadataPreferences){
author = docAuthorsText;
documentTitle = docTitleText;
description = docDescriptionText;
keywords = [docKeywordsText];
}

};



als Antwort auf: [#534272]
(Dieser Beitrag wurde von da zoate am 21. Nov 2014, 21:56 geändert)

Metadaten per Skript eintragen

Kai Rübsamen
Beiträge gesamt: 4684

21. Nov 2014, 22:57
Beitrag # 5 von 16
Beitrag ID: #534276
Bewertung:
(6749 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ob Komma oder Semikolon kann ich nicht beeinflussen ;-)

Jedenfalls sollten die Anführungszeichen mit beigefügter Version schon mal weg sein. Beim Autor hab ich leider keine Idee mehr: Sobald das Komma im Text erscheint, kommen auch die Anführungszeichen dazu.

Code
var curDoc = app.activeDocument;  
var docTitleText;
var docAuthorsText;
var docDescriptionText;
var docKeywordsTextString;

app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.findWhat = ".+";
var found = curDoc.findGrep();
app.findGrepPreferences = app.changeGrepPreferences = null;

for ( var j = 0; j < found.length; j++ ) {
var foundText = found[j];
if ( foundText.appliedParagraphStyle.name == "Title" ) {
docTitleText = foundText.contents;
} else if ( foundText.appliedParagraphStyle.name == "Authors" ) {
docAuthorsText = foundText.contents;
} else if ( foundText.appliedParagraphStyle.name == "Authors after 2-line title" ) {
docAuthorsText = foundText.contents;
} else if ( foundText.appliedParagraphStyle.name == "Abstract" ) {
docDescriptionText = foundText.contents;
} else if (found[j].texts[0].appliedParagraphStyle.name == "Keywords") {
docKeywordsTextString = foundText.contents;
}
}

var docKeywordsTextArray = docKeywordsTextString.split( "; " );

with ( curDoc.metadataPreferences ) {
author = docAuthorsText;
documentTitle = docTitleText;
description = docDescriptionText;
keywords = docKeywordsTextArray;
}


Es ist übrigens so, dass hier eine GREP-Suche nicht wirklich Sinn macht, da du erst alle Absätze suchst und sie dann in einer Schleife abarbeitest. Das könnte man auch gleich machen, falls notwendig.


als Antwort auf: [#534273]
(Dieser Beitrag wurde von Kai Rübsamen am 21. Nov 2014, 23:03 geändert)

Metadaten per Skript eintragen

Kai Rübsamen
Beiträge gesamt: 4684

21. Nov 2014, 23:19
Beitrag # 6 von 16
Beitrag ID: #534277
Bewertung:
(6736 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Einen hab ich noch:

Trag mal händisch beim Autor "Anton Erstautor, Bernhard Zweitautor" in den Metadaten ein und lass folgende Zeile laufen:

Code
alert(app.activeDocument.metadataPreferences.author); 


Was fällt auf?


als Antwort auf: [#534276]

Metadaten per Skript eintragen

drerol74
Beiträge gesamt: 507

22. Nov 2014, 02:32
Beitrag # 7 von 16
Beitrag ID: #534280
Bewertung:
(6665 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

so wie ich das sehe, braucht es die Anführungszeichen, wenn man einen String mit Beistrich oder Strichpunkt als EINEN Eintrag speichern will.

Ich denke das einfachste wäre wenn du den Eintrag nachträglich mit einer Funktion bereinigst, siehe folgendes Beispiel:

Code
var _doc = app.activeDocument, 
_author = "Anton Erstautor, Bernhard Zweitautor & Dietmar Drittautor";

_doc.metadataPreferences.author = _author;



/* +++++++++++++++++++++++++++++++++++++ */

_author = _doc.metadataPreferences.author;
__clearXMPCreatorValue(_author);

function __clearXMPCreatorValue (_inputValue) {

var _doc = app.activeDocument,
_namespace = "http://purl.org/dc/elements/1.1/",
_nodeName = "dc:creator",
_nodeValueArray = _inputValue.split(/[,;&]/),
_nodeValue,
i,j;

if(_nodeValueArray.length <= 1) { return; }

for(i=0; i<_nodeValueArray.length; i++) {
j = i+1;
_nodeValue = _nodeValueArray[i].replace("^\\s+","","").replace("\\s+$","","");
_doc.metadataPreferences.setProperty(_namespace,_nodeName+"["+j+"]", _nodeValue);
}
}

/* +++++++++++++++++++++++++++++++++++++ */


Ansonsten müsste man vorher erst ein entsprechendes Container-Element erzeugen.

Schöne Grüße
Roland


als Antwort auf: [#534273]

Metadaten per Skript eintragen

WernerPerplies
Beiträge gesamt: 2762

22. Nov 2014, 06:33
Beitrag # 8 von 16
Beitrag ID: #534281
Bewertung:
(6613 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich habe die Diskussion hier nur recht oberflächlich verfolgt, aber mir scheint es, das der Feldeintrag den Regeln der Syntax eines CSV-Feldes folgt und durchen einen CSV-Parser interpretiert wird.
Hier gilt in etwa:

Code
Feld,Feld,Feld,Feld,Feld[Zeilenende] 

Wenn alle Felder rein numerisch oder nur Strings sind.

Bei einer Mischung gilt:
Code
numerisch,"String","String",numerisch,"String"[Zeilenende] 


Sonderfall:
Felder enthalten Feldtrenner oder Zeilenende:
Zitat "Feldinhalt, Feldinhalt", Feld, Feld, "Feldinhalt[Zeilenende]Feldinhalt"[Zeilenende]


weiterer Sonderfall - Feld enthält Stringdelimiter:
Zitat "Feldinhalt""FeldInhalt"[Zeilenende]


Der Feldtrenner kann prinziell prinzipiell beliebig sein:
ursprünglich Komma -> comma separated value
Heute meistens Semikolon. Tabulatur

InDesign kann übrigens mit vielen verbreiteten Varianten nicht umgehen.

Wenn man ein wenig im Netz sucht, kann man reguläre Ausdrücke finden, die viele verbreitete CSV-Formate einwandfrei aufbereiten können.

HTH


als Antwort auf: [#534280]

Metadaten per Skript eintragen

Kai Rübsamen
Beiträge gesamt: 4684

22. Nov 2014, 10:14
Beitrag # 9 von 16
Beitrag ID: #534282
Bewertung:
(6543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,

ich hatte gestern Abend 'setProperty' auch schon im amerik. Adobe Forum gesehen. Habe aber keine Ahnung, was die Methode genau macht. Bisher habe ich immer nur den 'properties' etwas zugewiesen.

Ich konnte jedenfalls gestern Abend die Anführungszeichen nicht auslesen und damit auch nicht löschen.

Mit deiner Variante funktioniert es. Sehr cool. Kannst du bitte mal erklären, was in der Funktion passiert? Warum brauche ich z.B. den namespace u. creator?


als Antwort auf: [#534280]
(Dieser Beitrag wurde von Kai Rübsamen am 22. Nov 2014, 10:18 geändert)

Metadaten per Skript eintragen

da zoate
Beiträge gesamt: 34

22. Nov 2014, 10:16
Beitrag # 10 von 16
Beitrag ID: #534283
Bewertung:
(6538 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vielen Dank an alle, die sich meines Problems angenommen haben.
Durch die Kombination der Skripte von Kai und Roland entspricht das Ergebnis meinen Vorstellungen, die Anführungszeichen sind in beiden Feldern weg. Ich werde noch versuchen, das Skript zu optimieren. Dass die GREP-Suche und/oder Schleife irgendwie keine gute Idee ist, ist mir gestern noch aufgefallen, als ich das Skript an einem längeren Dokument ausprobiert habe.

da zoate


als Antwort auf: [#534281]

Metadaten per Skript eintragen

Kai Rübsamen
Beiträge gesamt: 4684

22. Nov 2014, 10:21
Beitrag # 11 von 16
Beitrag ID: #534285
Bewertung:
(6528 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Wo stehen denn deine Daten, die ausgelesen werden sollen? Du könntest z.B. einem Rahmen ein Objektformat vergeben oder dem Rahmen selbst einen Namen und dann nur diesen (oder mehrere) durchlaufen. Das wäre sicherlich viel schneller.


als Antwort auf: [#534283]

Metadaten per Skript eintragen

da zoate
Beiträge gesamt: 34

22. Nov 2014, 10:40
Beitrag # 12 von 16
Beitrag ID: #534286
Bewertung:
(6491 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke für den Tipp. Alle relevanten Daten stehen tatsächlich in einem eigenen Textrahmen mit einem bestimmten Objektformat. Ich werde das in diese Richtung weiter verfolgen.

Beste Grüße
da zoate


als Antwort auf: [#534285]

Metadaten per Skript eintragen

drerol74
Beiträge gesamt: 507

22. Nov 2014, 13:35
Beitrag # 13 von 16
Beitrag ID: #534287
Bewertung:
(6415 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai

Antwort auf: Kannst du bitte mal erklären, was in der Funktion passiert? Warum brauche ich z.B. den namespace u. creator?


Ich denke, verständlicher wird es, wenn man sich die XMP-Struktur der Metadaten ansieht. (siehe Anhang)

»_doc.metadataPreferences.author = _author« weist dem ersten Element des Containers »dc:creators« den gesamten String »Anton Erstautor, Bernhard Zweitautor & Dietmar Drittautor« zu. Um auch die Trenner (, oder ;) darstellen zu können, baucht es eben die einschließenden »"«, die InDesign einfügt.

»setProperty« macht im Prinzip das Gleiche wie die direkte Zuweisung über »author«, nur ist man mit »setProperty« wesentlich flexibler. Nachteil: Ich muss den Namespace (entspricht einem übergeordneten Knoten in der Struktur) und den genauen Pfad (z.B. dc:creator[1]) wissen, wo ich meinen Eintrag ablegen möchte.

Mit »setProperty« kann ich so den String entsprechend den Trennern (die Werner oben auch beschrieben hat) auf mehrere Elemente aufteilen. Damit fallen die »Anführungszeichen« dann weg.

Marijan Tompa beschreibt das in seinem Blog-Beitrag sehr schön: http://indisnip.wordpress.com/...o-indesign-file-xmp/

Schöne Grüße
Roland


als Antwort auf: [#534282]
Anhang:
01_ohne_Eintrag.jpg (98.2 KB)   02_Eintrag_mit_Anfuehrungszeichen.jpg (103 KB)   03_Eintrag_aufgeteilt_in_drei_Elemente.jpg (105 KB)

Metadaten per Skript eintragen

Kai Rübsamen
Beiträge gesamt: 4684

22. Nov 2014, 17:35
Beitrag # 14 von 16
Beitrag ID: #534293
Bewertung:
(6350 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,

ich hab es im Ansatz verstanden. Danke.

Den Artikel von Marijan hatte ich im Zusammenhang mit "Daten im Dokument speichern" schon mal gelesen und dann ganz schnell wieder beiseite gelegt ;-)

Gibt es denn eine Möglichkeit den Trenner zu beieinflussen? Visuell werden die Elemente ja jetzt mit einem Semikolon dargestellt. Ginge auch ein Komma?

Vorausgesetzt ich bin hier überhaupt im richtigen Reiter, wurde das in früheren Version – zumindest optisch – etwas besser dargestellt. Siehe Screen.


als Antwort auf: [#534287]
(Dieser Beitrag wurde von Kai Rübsamen am 22. Nov 2014, 17:48 geändert)

Anhang:
Bildschirmfoto 2014-11-22 um 17.45.57.png (47.1 KB)

Metadaten per Skript eintragen

Kai Rübsamen
Beiträge gesamt: 4684

22. Nov 2014, 18:04
Beitrag # 15 von 16
Beitrag ID: #534295
Bewertung:
(6340 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier noch mein aktueller Stand. Mir fällt auf, dass bei den Dateiinformationen zwischen dem ";" und dem nächsten Eintrag ein Leerzeichen ist, dass im neuen Metadaten-Dialog in CC 2014 fehlt. Sieht nicht schön aus, ist aber wohl auch kein Problem (siehe Screen).

In dem Zusammenhang auch interessant:
Könnte man direkt auch die Kennung > ISBN-Nr. mitgeben und viell. sogar Metadaten ergänzen, die InDesign nicht mit rausschreibt, wo man aber vorher schon das "dc-Element" kennt?

Code
var curDoc = app.activeDocument; 
var metaContentTframe = curDoc.textFrames.itemByName( "meinTextrahmen" );
var allParas = metaContentTframe.paragraphs;
var metaPrefs = curDoc.metadataPreferences;

for ( var i = 0; i < allParas.length; i++ ) {
var curPara = allParas[i];

if ( curPara.appliedParagraphStyle.name == "Title" ) {
metaPrefs.documentTitle = curPara.contents.replace( /\r/g , "" );
}
else if ( curPara.appliedParagraphStyle.name == "Authors" || curPara.appliedParagraphStyle.name == "Authors after 2-line title" ) {
var metaPrefsAuthor = metaPrefs.author = curPara.contents.replace( /\r/g , "" );
__clearXMPCreatorValue( metaPrefsAuthor );
}
else if ( curPara.appliedParagraphStyle.name == "Abstract" ) {
metaPrefs.description = curPara.contents.replace( /\r/g , "" );
}
else if ( curPara.appliedParagraphStyle.name == "Keywords" ) {
var kwArray = curPara.contents.replace( /\r/g , "" ).split( "; " );
metaPrefs.keywords = kwArray;
}
}


function __clearXMPCreatorValue ( _inputValue ) {

var _doc = app.activeDocument,
_namespace = "http://purl.org/dc/elements/1.1/",
_nodeName = "dc:creator",
_nodeValueArray = _inputValue.split(/[,;&]/),
_nodeValue,
i,j;

if ( _nodeValueArray.length <= 1 ) { return; }

for ( i = 0; i<_nodeValueArray.length; i++ ) {
j = i+1;
_nodeValue = _nodeValueArray[i].replace( "^\\s+","","" ).replace( "\\s+$","","" );
_doc.metadataPreferences.setProperty( _namespace, _nodeName+"["+j+"]", _nodeValue );
}
}



als Antwort auf: [#534293]
(Dieser Beitrag wurde von Kai Rübsamen am 22. Nov 2014, 18:04 geändert)

Anhang:
Bildschirmfoto 2014-11-22 um 17.58.59.png (89.5 KB)
X