Mit Powershell xml Dateien über Infopath in PDF speicher und Name behalten
Hallo liebe Administratoren
Ich würde gern mit eine Powershell einen Ordner durchgehen lassen und alle xml Datein als PDF speicher aber das soll über infopath 2010 gehen damit sie die Formatierung beibehält und den Dateinamen sollen sie behalten also anstatt Bestellung2015-01-12.xml soll es dann Bestellung2015-01-12.pdf werden.
geht das ?
Ich hab ein Script gefunden mit dem man Word Dokument automatisiert ausrucken kann. Kann man das vlt als Vorlage nehmen und ein bisschen abwandeln?
Ich würde gern mit eine Powershell einen Ordner durchgehen lassen und alle xml Datein als PDF speicher aber das soll über infopath 2010 gehen damit sie die Formatierung beibehält und den Dateinamen sollen sie behalten also anstatt Bestellung2015-01-12.xml soll es dann Bestellung2015-01-12.pdf werden.
geht das ?
Ich hab ein Script gefunden mit dem man Word Dokument automatisiert ausrucken kann. Kann man das vlt als Vorlage nehmen und ein bisschen abwandeln?
#Source: http:{{comment_single_line_double_slash:0}}
$wd = new-object -com word.application
$wd.visible = 1
$files = gci f:\abc\*.docx
foreach($i in $files){
$doc = $wd.documents.open($i.fullname)
$doc.printout()
$doc.close()
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 271812
Url: https://administrator.de/contentid/271812
Ausgedruckt am: 24.11.2024 um 23:11 Uhr
30 Kommentare
Neuester Kommentar
Hallo coolkaiserABC, Willkommen auf Administrator.de!
Das lässt sich machen ...guckst du hier
(Pfad in Zeile 8 an deine Bedürfnisse anpassen)
Grüße Uwe
damit sie die Formatierung beibehält
Ich gehe mal davon aus das du damit die Absatzstruktur und Einrückungen meinst.Das lässt sich machen ...guckst du hier
(Pfad in Zeile 8 an deine Bedürfnisse anpassen)
# Word Objekt erzeugen
$objWord = New-Object -Com Word.Application
# Sichtbar ausführen (für Debug-Zwecke)
$objWord.Visible = -1
# Meldungen abschalten
$objWord.DisplayAlerts = 0
# Für jedes XML File im Ordner 'C:\temp\xml'
gci 'C:\temp\xml\*.xml' | %{
# XML-Datei im Text-Modus öffnen
$doc = $objWord.Documents.Open($_.Fullname,$false,$true,$false,"","",$true,"","",4)
# Pfad für das PDF festlegen
[ref]$savepath = $_.DirectoryName + "\" + $_.BaseName + ".pdf"
# Dokument als PDF speichern
$doc.SaveAs($savepath,[ref]17)
# Dokument schließen
$doc.Close([ref]0)
}
# Benachrichtigungen wieder einschalten und Word schließen
$objWord.DisplayAlerts = -1
$objWord.Quit()
Zitat von @coolkaiserABC:
Aber was ich aus deinem Script herauslese benutzt du word2010? Ich benötige aber infopath2010...
Kommt doch aufs gleiche drauf raus ... Word kann ja auch nach PDF konvertieren.Aber was ich aus deinem Script herauslese benutzt du word2010? Ich benötige aber infopath2010...
Du musst halt mal sagen was du mit "Formatierung beibehalten" meinst. Ich als Programmiere interpretiere damit den Plaintext-Codeinhalt einer XML-Datei.
So hier mal ein C# Code für eine native C# Konsolenapplikation:
Zum erfolgreichen kompilieren werden noch folgende Referenzen im C#-Projekt benötigt:
Der Code generiert eine Konsolenanwendung der man dann als ersten Parameter den Pfad zu den XML-Dateien angibt. Er wandelt dann die XML-Dateien in PDFs.
Beispiel:
Hier noch die EXE falls du keinen C# Compiler wie z.B. Visual Studio da hast.
InfoPathExportPDF_271812.zip (Es werden Office 2010 / Infopath und .NET 4 benötigt)
Hinweise:
Eventuell muss die Wartezeit in Zeile 30 an dein System angepasst werden, da die Export-Funktion hier nicht auf Beendigung des Vorgangs wartet. Habe auf die schnelle keine andere Möglichkeit gefunden.
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Zum erfolgreichen kompilieren werden noch folgende Referenzen im C#-Projekt benötigt:
- COM-Bibliothek: Microsoft InfoPath 3.0 Type Library
- Referenz zu C:\Program Files\Microsoft Office\OFFICE14\Microsoft.Office.Interop.InfoPath.Xml.dll
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Microsoft.Office.Interop.InfoPath;
using Microsoft.Office.Interop.InfoPath.Xml;
namespace InfoPathExportPDF
{
class Program
{
static void Main(string args)
{
if (args.Length == 1)
{
if(!Directory.Exists(args)){
Console.WriteLine("Der Pfad existiert nicht");
Environment.Exit(1);
}
Application app = new Microsoft.Office.Interop.InfoPath.Application();
XDocumentsCollection myXDocs = app.XDocuments;
foreach (string f in Directory.GetFiles(args, "*.xml"))
{
try
{
XDocument myXDoc = myXDocs.Open(f, (int)XdDocumentVersionMode.xdFailOnVersionOlder);
string pdfpath = Path.GetDirectoryName(f) + "\\" + Path.GetFileNameWithoutExtension(f) + ".pdf";
Console.WriteLine("Speichere: " + pdfpath);
myXDoc.View.Export(pdfpath, "PDF");
System.Threading.Thread.Sleep(1000);
myXDocs.Close(0);
}
catch (System.Exception ex) {
Console.WriteLine("ERROR: " + ex.Message);
Environment.Exit(1);
}
}
app.Quit(false);
Environment.Exit(0);
}else{
Console.WriteLine("Fehler! Sie haben keinen Pfad als ersten Parameter angegeben!");
Environment.Exit(1);
}
}
}
}
Beispiel:
InfoPathExportPDF.exe "C:\Ordner"
InfoPathExportPDF_271812.zip (Es werden Office 2010 / Infopath und .NET 4 benötigt)
Hinweise:
Eventuell muss die Wartezeit in Zeile 30 an dein System angepasst werden, da die Export-Funktion hier nicht auf Beendigung des Vorgangs wartet. Habe auf die schnelle keine andere Möglichkeit gefunden.
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Zitat von @coolkaiserABC:
Ist es noch möglich das Infopath sie schliesst nachdem der export erledigt ist ? denn nach 11 Elementen ist bei mir
Feierabend ^^ und er schreibt das Infopath zu oft geöffnet wurde....
Das Schließen macht das Script out of the box nach jedem einzelnen Export, vermutlich ist die Verzögerung bei dir einfach zu niedrig.Ist es noch möglich das Infopath sie schliesst nachdem der export erledigt ist ? denn nach 11 Elementen ist bei mir
Feierabend ^^ und er schreibt das Infopath zu oft geöffnet wurde....
Habe das hier nur mit einem simplen Formular mit einer Seite getestet.
Zitat von @coolkaiserABC:
Könntest du es mir nochmal mit 5000 stadt 500 compilieren und hochladen?... Nur wenns leicht geht sonst nicht
Hier habe ich dir eine Variante mit der Wartezeit als zweiten Parameter gebaut:Könntest du es mir nochmal mit 5000 stadt 500 compilieren und hochladen?... Nur wenns leicht geht sonst nicht
InfoPathExportPDF2_271812.zip
Du gibts dann die gewünschte Wartezeit einfach als zweiten Parameter mit an (in ms):
InfoPathExportPDF.exe "C:\Ordner" 5000
Zitat von @coolkaiserABC:
deshalb hab ich jetzt auf 25 sec gestellt und es läuft bis jetzt perfekt :D DANKE
Heftig, aber freut mich für dich . Ist leider ein schwaches Zeichen das MS die Funktion nicht warten lässt bis das PDF exportiert wurde. Aber da MS InfoPath ja nun schon seit einiger Zeit abgekündigt hat, wird da wohl auch nichts mehr dran geändert werden.deshalb hab ich jetzt auf 25 sec gestellt und es läuft bis jetzt perfekt :D DANKE
Na dann hast du ja jetzt 10 Stunden Zeit Kaffee zu trinken :-P
Grüße Uwe
War als Int16 deklariert, deshalb. Hab den zweiten Link geupdated.
Über eine Spende würde ich mich trotzdem noch freuen ...Spende. Danke!
Grüße Uwe
Über eine Spende würde ich mich trotzdem noch freuen ...Spende. Danke!
Grüße Uwe
Ich danke dir ebenfalls !
Zitat von @coolkaiserABC:
Naja ich hab mir das ganze jetzt nochmal durch den Kopf gehen lassen und da ich auf einen Terminal Server Arbeite und in naher
Zukunft einen mir mehr Power bekomme denk ich nicht das es gut ist wenn wir die Zeiten fest ins Programm schreiben... Mir
wäre es lieber wenn ich das mit einem Powershell Script mache damit ich es in Zukunft anpassen kann.
Ich würde in Zukunft eher über ein abschweifen von InfoPath nachdenken , aber jedem das seine...Naja ich hab mir das ganze jetzt nochmal durch den Kopf gehen lassen und da ich auf einen Terminal Server Arbeite und in naher
Zukunft einen mir mehr Power bekomme denk ich nicht das es gut ist wenn wir die Zeiten fest ins Programm schreiben... Mir
wäre es lieber wenn ich das mit einem Powershell Script mache damit ich es in Zukunft anpassen kann.
So stell ich mir das vor:
Ich ziehe alle xml Dateien in einen Ordner (ordner d:\test) dann würde ich die Daten alle nach Größe Sortieren (im
5kb Schritten bis 60kb [5kb,10kb,15kb usw]
Kann man so machen, aber zu kompliziert gedacht wo man doch mit Powershell so schöne CMDLets wie group-object hat, damit ist ein vorsortieren und verschieben vollkommen überflüssig.Ich ziehe alle xml Dateien in einen Ordner (ordner d:\test) dann würde ich die Daten alle nach Größe Sortieren (im
5kb Schritten bis 60kb [5kb,10kb,15kb usw]
Beispiel wie so was aussehen kann:
# Dateien nach 5kb Staffelung gruppieren
$filegroups = gci "C:\Bestellungen\*.xml" | group {[math]::Floor(($_.Length / 5kb))} | sort {[int32]$_.Name}
$filegroups | %{
write-host "Dateien mit Größe $([int32]$_.Name * 5) kb" -Fore Green
$_.Group | %{ write-host $_}
}
Ist das so möglich oder denk ich jetzt zu kompliziert?
Möglich ist alles ...Grüße Uwe
Na Powershell Begriffe und Kommandos
Hört sich so an als hättest du noch nie was von Powershell gehört ...
Du kannst ja auch mit einem Switch() oder einem if() die Größe prüfen und den Sleepwert entsprechend festlegen, das bleibt ja dir überlassen. Wo ist also jetzt das Problem ??
Oder muss ich dir jetzt schon wieder jede einzelne Zeile vorbeten ? Ich habe dir ja im letzten Post schon ein fast fertiges Grundgerüst gepostet
Hätte jetzt eigentlich schon erwartet das du den minimalen Rest auch noch schaffst
Du sollst dabei ja auch was lernen und nicht nur copy n' pasten.
Hört sich so an als hättest du noch nie was von Powershell gehört ...
Wenn ich das richtig versteh müsste der Zeitwert ja immer gleich sein das ist er aber nicht ich hab jetzt schon gemessen:
5kb= 3.800ms
10kb=9.000ms
20kb=22.000ms
30kb=58.000ms
weiter bin ich noch nicht.....
War ja nur ein Beispiel wenn es sich linear verhalten hätte.5kb= 3.800ms
10kb=9.000ms
20kb=22.000ms
30kb=58.000ms
weiter bin ich noch nicht.....
Du kannst ja auch mit einem Switch() oder einem if() die Größe prüfen und den Sleepwert entsprechend festlegen, das bleibt ja dir überlassen. Wo ist also jetzt das Problem ??
Oder muss ich dir jetzt schon wieder jede einzelne Zeile vorbeten ? Ich habe dir ja im letzten Post schon ein fast fertiges Grundgerüst gepostet
Hätte jetzt eigentlich schon erwartet das du den minimalen Rest auch noch schaffst
Du sollst dabei ja auch was lernen und nicht nur copy n' pasten.
Gut zu wissen.
(weil ich Powersehll im allgemeinen noch nicht ganz durschaut habe)... ich hoffe du bist mir nicht böse
Quatsch aber ich dachte halt weil du immer Powershell ins Spiel bringst, dass du dich damit zumindest grundlegend auskennst.