coolkaiserabc
Goto Top

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?

#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()

Content-ID: 271812

Url: https://administrator.de/contentid/271812

Ausgedruckt am: 24.11.2024 um 23:11 Uhr

colinardo
Lösung colinardo 12.05.2015, aktualisiert am 18.05.2015 um 09:12:19 Uhr
Goto Top
Hallo coolkaiserABC, Willkommen auf Administrator.de!
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()
Grüße Uwe
coolkaiserABC
coolkaiserABC 12.05.2015 aktualisiert um 16:40:00 Uhr
Goto Top
Hi Uwe

Aber was ich aus deinem Script herauslese benutzt du word2010? Ich benötige aber infopath2010...
Das infopath:
http://de.wikipedia.org/wiki/Microsoft_InfoPath
colinardo
Lösung colinardo 12.05.2015, aktualisiert am 18.05.2015 um 09:12:18 Uhr
Goto Top
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.

Du musst halt mal sagen was du mit "Formatierung beibehalten" meinst. Ich als Programmiere interpretiere damit den Plaintext-Codeinhalt einer XML-Datei.
coolkaiserABC
coolkaiserABC 12.05.2015 um 16:46:38 Uhr
Goto Top
ich hab mit infopath eine *.xsn Datei gemacht die in die xml datei feist eingeschrieben ist als sozusagen verlinkt, und wenn ich es mit infopath aufmache ist es wie ein Formular wo die ganzen <variablen> in einem Fled angezeigt das ich vorher definiert habe dadurch hab ich ein schönes Blatt das sich richtig geil "Formatiert" (sry ka wie ich sonst sagen soll ^^) ausdrucken lässt oder eben als pdf speicher nur ich hab ca 1500 Bestellungen und ich kann und will nicht jede Datei einzel durchklicken...
coolkaiserABC
coolkaiserABC 12.05.2015 um 16:51:54 Uhr
Goto Top
Oder anders gesagt die xsn ist wie ein leeres Formular und die xml benutz ich zum Ausfüllen des Formulares ^^
colinardo
Lösung colinardo 12.05.2015, aktualisiert am 18.05.2015 um 09:12:17 Uhr
Goto Top
Da lässt sich entweder direkt was mit C# innerhalb von InfoPath machen (Dazu muss dann aber die Automatisierungs-Option für InfoPath im Office-Setup aktiviert sein), oder direkt als komplette C# Anwendung. Da muss ich aber erst mal etwas einlesen.
Melde mich dazu die Tage nochmal.

Grüße Uwe
colinardo
Lösung colinardo 12.05.2015, aktualisiert am 13.05.2015 um 12:17:10 Uhr
Goto Top
So hier mal ein C# Code für eine native C# Konsolenapplikation:
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);
            }
        }
    }
}
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:
InfoPathExportPDF.exe "C:\Ordner"
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
coolkaiserABC
coolkaiserABC 13.05.2015 um 09:06:32 Uhr
Goto Top
WOW tausend Dank :O

Unglaublich was du dir für mich angetan hast :D
Ich bin dir echt extrem Dankbar
coolkaiserABC
coolkaiserABC 13.05.2015 aktualisiert um 10:11:43 Uhr
Goto Top
HI Uwe
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....

(wenn ich noch so aufdringilch sein darf
)

Oder liegt das an der Verzögerung ? Ich lad mir grad Visual Studio und sag dann Bescheid ^^ dauer ca 4 h -.- Dachte Microsoft hat schnelle Downloadleitungen...
colinardo
Lösung colinardo 13.05.2015, aktualisiert am 18.05.2015 um 09:12:14 Uhr
Goto Top
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.
Habe das hier nur mit einem simplen Formular mit einer Seite getestet.
coolkaiserABC
coolkaiserABC 13.05.2015 um 10:59:33 Uhr
Goto Top
Danke auf jeden fall

Könntest du es mir nochmal mit 5000 stadt 500 compilieren und hochladen?... Nur wenns leicht geht sonst nicht
colinardo
Lösung colinardo 13.05.2015 aktualisiert um 12:07:01 Uhr
Goto Top
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:
InfoPathExportPDF2_271812.zip
Du gibts dann die gewünschte Wartezeit einfach als zweiten Parameter mit an (in ms):
InfoPathExportPDF.exe "C:\Ordner" 5000
coolkaiserABC
coolkaiserABC 13.05.2015 um 11:24:53 Uhr
Goto Top
WOW Danke :D
coolkaiserABC
coolkaiserABC 13.05.2015 um 12:10:09 Uhr
Goto Top
So jetzt denke ich läuft es perfekt :D
Der Grund war das manche xml Datein so gross waren und ein export über 10 sec gedauert hat (hab es nochmal per hand ausprobiert) deshalb hab ich jetzt auf 25 sec gestellt und es läuft bis jetzt perfekt :D DANKE
colinardo
Lösung colinardo 13.05.2015, aktualisiert am 18.05.2015 um 09:12:09 Uhr
Goto Top
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 face-smile. 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.

Na dann hast du ja jetzt 10 Stunden Zeit Kaffee zu trinken :-P

Grüße Uwe
coolkaiserABC
coolkaiserABC 18.05.2015 um 09:12:01 Uhr
Goto Top
Hallo sry für die verspätete Antwort

Ja ich regle das so: Ich sortier nach Größe aus d.H. alle bis 2 KB lass ich mit 500 ms und die grösseren mit 25sec
Dann spar ich viiiiiiiiiiiiiel Zeit :D

Herzlichen Dank Nochmal dafür
coolkaiserABC
coolkaiserABC 18.05.2015 um 12:50:43 Uhr
Goto Top
Hallo....

kannst du mir in dem Programm einen höheren Wert zulassen??
Ich hab jetzt nachgesehen bei ein paar vorlagen dauert das "mit der hand" schon 2min15 sec und ich kann nicht mehr als 32 sec bei der exe eintragen ....
colinardo
Lösung colinardo 18.05.2015 aktualisiert um 14:27:18 Uhr
Goto Top
Zitat von @coolkaiserABC:
kannst du mir in dem Programm einen höheren Wert zulassen??
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
coolkaiserABC
coolkaiserABC 18.05.2015 um 13:57:26 Uhr
Goto Top
Spende is unterweg Danke nochmal :D
colinardo
Lösung colinardo 18.05.2015 aktualisiert um 14:27:16 Uhr
Goto Top
Zitat von @coolkaiserABC:
Spende is unterweg Danke nochmal :D
Ich danke dir ebenfalls face-smile!
coolkaiserABC
coolkaiserABC 18.05.2015 um 14:21:08 Uhr
Goto Top
Darf ich noch ein letztes mal stören? dann geb ich wirklich ruhe ist es möglich xml Daten noch größe zu sortieren? weil ich mir ein script geschrieben habe in dem ich die Zeiten so knapp wie möglich berechnet habe und dich würde gern automatisiert daten die zb bis 2KB sind in den ordner "2KB" verschieben dann 5kb usw. also das ich 5 Ordner habe. Dann das Tool das das colinardo für mich geschrieben hat 5 mal starten (das weiss ich wie ich das mache) und dann wenn möglich die xml Daten löschen und nur die PDF wieder in den Ordner ^^ DANKE wieder für jeden hilfreichen tipp :D
colinardo
colinardo 18.05.2015 aktualisiert um 18:02:41 Uhr
Goto Top
Ich kann dir das Tool so anpassen das von jeder XML-Datei die Größe ausgelesen wird und entsprechend der Timeout gesetzt wird. Dann kannst du die Files alle im selben Ordner lassen.

Dazu bräuchte ich aber dann deine "Größe : Zeit" Liste.
coolkaiserABC
coolkaiserABC 26.05.2015 um 07:23:26 Uhr
Goto Top
Hallo sry ich bin krank geworden und war seither nicht online...

Und die Zeiten weiss ich noch nicht genau da ich nicht alle durchprobiert habe....
coolkaiserABC
coolkaiserABC 28.05.2015 um 11:41:38 Uhr
Goto Top
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] so würde ich auch die Ordner benenne) und dann die exe für jeden Ordner separat ausführen lassen (ist ja mit einem Script nicht schwer) und dann wenn es möglich ist nur die PDF wieder zurück und alle xml in den Unterteilten Ordner löschen.

Damit ich nur das Script ausführe und alles erledigt bekomm.

Ist das so möglich oder denk ich jetzt zu kompliziert?
colinardo
colinardo 28.05.2015 aktualisiert um 13:23:41 Uhr
Goto Top
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 face-wink, aber jedem das seine...
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 hatface-smile, damit ist ein vorsortieren und verschieben vollkommen überflüssig.
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 $_}
}
Hier kannst du ja dann z.B. einen festen Sleep-Wert definieren und ihn dann mit dem aktuellen Staffelungswert multiplizieren um so den endgültigen Sleepwert für die Übergabe an die EXE zu erhalten.
Ist das so möglich oder denk ich jetzt zu kompliziert?
Möglich ist alles ...

Grüße Uwe
coolkaiserABC
coolkaiserABC 28.05.2015 aktualisiert um 14:29:16 Uhr
Goto Top
Hi (:

Sry aber das ist mir jetzt ein bisschen zu hoch ^^

Was sind "CMDLets" oder "group-object" ?

Hier kannst du ja dann z.B. einen festen Sleep-Wert definieren und ihn dann mit dem aktuellen Staffelungswert multiplizieren um so den endgültigen Sleepwert für die Übergabe an die EXE zu erhalten.
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.....

also mann kann nicht sagen (größe * 1000 = Zeit) oder meinst du das anders?
colinardo
colinardo 28.05.2015 aktualisiert um 14:41:10 Uhr
Goto Top
Zitat von @coolkaiserABC:
Was sind "CMDLets" oder "group-object" ?
Na Powershell Begriffe und Kommandos face-smile
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.
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 face-sad
Du sollst dabei ja auch was lernen und nicht nur copy n' pasten.
coolkaiserABC
coolkaiserABC 28.05.2015 um 15:37:54 Uhr
Goto Top
Ja stimmt ich hab noch nie wirklich mit Powershell gearbeitet .. eher mit der CMD
Ein bisschen kenn ich mich mit C aus (also ich könnte zb einen Taschenrechner schreiben)

Nein das mit dem Vorbeten sollte nicht so sein... du hast recht ich will ja auch lernen nur ich tut mir noch ein bisschen schwer (weil ich Powersehll im allgemeinen noch nicht ganz durschaut habe)... ich hoffe du bist mir nicht böse
colinardo
colinardo 28.05.2015 um 15:42:38 Uhr
Goto Top
Zitat von @coolkaiserABC:

Ja stimmt ich hab noch nie wirklich mit Powershell gearbeitet ..
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.
coolkaiserABC
coolkaiserABC 29.05.2015 um 10:43:21 Uhr
Goto Top
Nein kenn ich mich nicht ^^ ich hab gegooglt und dachte mit Powershell muss es möglich sein deshalb bin ich darauf gekommen...