Zitat von visionmaster
Ich muss aus C# heraus eine PDF-Datei in eine Text-Datei konvertieren. Es soll eigentlich die gleiche Funktion sein, die im Dialog im ACROBAT-Reader als "Speichern unter..." zur Verfügung steht.
Wichtig wäre dabei auch, dass die Ausgabedatei die gleiche Struktur hat, die ACROBAT erzeugt.
Ob das mit dem letzten Punkt so klappt kann ich nicht sagen, aber wir haben vor paar Jahren für die reine Textextraktion die Tesseract OCR Engine genutzt. Lief relativ gut und auch performant. Vielleicht ja nen Lösungsansatz...
Man kann zwar auch versuchen den Adobe Reader anzusprechen und zu automatisieren, aber das war immer problematisch und auch alles Andere als stabil.
Zitat von Abt
Zitat von vieledinge
Alles, was länger als 30 Zeilen ist sollte man überdenken
Mit welchem Sinn? Der Sinn von Trennung in Methoden ist Verantwortlichkeit.
Da stimme ich Dir durchaus zu.
Die 30 Zeilen sind kein Dogma. Die Praxis zeigt aber, dass es ab einer gewissen Codeblockgröße durchaus sinnvoll sein kann, da hinterher nochmal drüber nachzudenken, was man da tut und ob man das eventuell nochmal aufteilen sollte. Und wenn die Antwort "Nein" lautet, dann ist es auch gut.
Paar Punkte, die mir spontan auffallen:
Größe der Codeblöcke: Kurzer, kompakter Code ist besser verständlich. Alles, was länger als 30 Zeilen ist sollte man überdenken, ob man da nicht Teile davon sinnvoll in separate Functions oder Klassen auslagern kann.
Geschachtelte Schleifen: Würde ich versuchen zu vermeiden. Auch hier: Blöcke in Functions auslagern.
do while: Mag ich nicht (Persönliche Hassliebe). Konditionen am Ende der Schleife finde ich einfach bescheiden lesbar.
Ausgaben sinnvoll zusammenfassen, um kompakten Code zu erhalten. Die drei Varianten machen alle das Gleiche. Man muss halt ggfs. schauen, für welche Plattform(en) man entwickelt:
Console.WriteLine();
Console.WriteLine("Der eingegebene Wert muss eine Zahl sein!");
Console.WriteLine();
Console.WriteLine("\r\nDer eingegebene Wert muss eine Zahl sein!\r\n");
Console.WriteLine($"{Environment.NewLine}Der eingegebene Wert muss eine Zahl sein!{Environment.NewLine}");
Hallo zusammen,
für nen Inhouse-Projekt bräuchte ich ne Komponente, um erhaltene Rechnungs-PDFs zu prüfen, ob es sich um elektronische Rechnungen nach ZugFerd-/XRechnungs-Standard handelt und um danach die eingebetteten XML-Rechnungdsdaten zu extrahieren. Kann zwar theoretisch auch das vorhandene DMS, ich brauche aber bestimmte Infos für die korrekte Prozesseinsteuerung, BEVOR ich das Zeug ins DMS werfe.
Was ganz interessant aussieht ist https://konik.io, muss ich aber noch testen.
Gibts noch Tipps zu anderen, schlanken Tools, die man sich mal anschauen sollte?
Ansonsten findet man so einige Suiten wie PDFlib, die eher in Richtung eierlegende Wollmilchsau gehen und hier eher die Variante "mit der Wurst nach dem Schinken geworfen" wären.
VG Uwe
Zitat von Abt
Blöderweise liegen im ERP-Verzeichnis div. weitere DLLs (MS, 3rdParty), die so auch von den DMS-DLLs benötigt werden. Aber natürlich andere Versionsstände und irgendwas beißt sich da und das ERP zickt rum, wenn ich da die neueren Versionen nutzen will.
Verschiedene Versionen beißen sich immer, sofern Du Dich in einer App Domain befindest. Da hilft auch ein anderer Ordner nicht.
Das war vielleicht bisschen unglücklich ausgedrückt: Ich selbst nutze in meinen Komponenten indirekt nur eine Version der DLLs (die, die von der DMS-Software benötigt werden). Da ich aber dem ERP-System meine DLL nicht an einem beliebigen Ort zur Verfügung stellen kann, sondern die blöderweise zwingend im ERP-Verzeichnis liegen muss, habe ich das Dateikonflikt-Problem.
Habe ich ne Möglichkeit die Verweis-Komponenten der DLL in der Runtime-Umgebung in einem anderen Verzeichnis unterzuschieben? Also so, dass meine DLL immer noch im ERP-Verzeichnis liegt, alle zugehörigen Verweis-DLLs aber z.Bsp. in nem Unterverzeichnis \DMS?
Oder kann ich der DLL auch ne app.config unterschieben?
Es gibt auch dll.configs, wobei die ursprünglich einen anderen Zweck haben.
Könnte sein, dass aber assembly bindings ebenfalls unterstützt werden.
Ok, also mal testen.
Hallo zusammen,
ich stecke bisschen in der DLL-Klemme....
Ich baue eine Funktionserweiterung als DLL für eine Serverkomponente unseres ERP-Systems. Meine DLL muss zwingend in das dortige Programmverzeichnis, damit die von den ERP-Komponenten richtig angesprochen wird. Das kann ich leider nicht ändern.
In meinem Projekt nutze ich wiederum andere DLLs (DMS, Dokumentenmanagementsystem)
Blöderweise liegen im ERP-Verzeichnis div. weitere DLLs (MS, 3rdParty), die so auch von den DMS-DLLs benötigt werden. Aber natürlich andere Versionsstände und irgendwas beißt sich da und das ERP zickt rum, wenn ich da die neueren Versionen nutzen will.
Habe ich ne Möglichkeit die Verweis-Komponenten der DLL in der Runtime-Umgebung in einem anderen Verzeichnis unterzuschieben? Also so, dass meine DLL immer noch im ERP-Verzeichnis liegt, alle zugehörigen Verweis-DLLs aber z.Bsp. in nem Unterverzeichnis \DMS?
https://mycsharp.de/forum/threads/119961/programm-dll-s-in-anderen-ordner-legen?page=1 habe ich schon gefunden, aber das bezieht sich ja auf Standalone-Projekte. Oder kann ich der DLL auch ne app.config unterschieben?
Jemand ne Idee?
Schöne Adventszeit!
Zitat von Abt
Das Control, siehe Docs, bietet Dir von Haus aus nur einen Click-Event an.
Schade. Manchmal überliest man ja was...
Nur als Hinweis: VSTO ist schon seit über 10 Jahren abgekündigt und alles moderne geht nur noch über die JavaScript Schnittstellen.
Dort hast Du auch mehr UI Möglichkeiten, als es in VSTO jemals gab.
Soweit bekannt. Es gibt da aber interne Abhängigkeiten und Vorgaben. Irgendwann gibts dann halt mal ein größeres Migrationsprojekt...
Hallo zusammen,
Eigenes Office-Plugin (VSTO, Office 2016) mit div. Ribbons.
Ich nutze in den Ribbons RibbonSplitButtons mit untergeordneten RibbonButtons. Funktioniert soweit alles super. Allerdings klicken manchmal Anwender auf den RibbonSplitButton und wundern sich, dass erst mal nichts passiert. Weil die eigentlichen Funktionsaufrufe alle an den untergeordneten RibbonButtons hängen. Das ist so prinzipiell gewollt.
Bekomme ich den RibbonSplitButton irgendwie per Code aufgeklappt? Das könnte man ja dann ins dortige Clieck-Event packen.
Google war leider wenig hilfreich.
Danke für die Hinweise.
Refit sieht auch interessant aus. Werde ich mir mal näher ansehen.
Hallo zusammen,
ich darf/muss gegen einen REST-Service arbeiten. Soweit mit dem net-eigenen HttpClient für GET und POST kein Problem. Allerdings muss ich nun Updates für Objekte zwingend mit PATCH aufrufen. Knackpunkt: Ich bin ans net-4.8-Framework gebunden (Plugin fürs ERP). Und das kann noch kein PATCH. Andere Frameworkvarianten kann ich dem Ganzen auch nicht beistellen.
Nun gibts da ja offensichtlich div. 3rd-Party-Lösungen, die das Dilemma lösen können. Flurl scheint ganz gut zu passen und damit werde ich mal testen. Gibts noch Alternativempfehlungen?
Danke, das sieht sehr interessant aus.
Hallo zusammen,
ich möchte Attachments aus einer eMail auslesen und weiterverarbeiten. Klappt auch soweit alles prinzipiell.
Mein Problem: Enthält die eMail neben "echten" Dateianhängen auch eingebettete Objekte (z.Bsp. diese nette seuche der eingebetteten Firmenlogos in der Signatur), so bekomme ich die alle als Attachment aufgelistet. Mich interessieren aber nur die "echten" Dateianhänge.
Unterscheiden wollte ich das via
oAttachment.Type == Outlook.OlAttachmentType.olByValue
aber das scheint nicht der richtige Ansatz zu sein. Wie könnte ich dem beikommen? Attachment.Position auswerten? Dabei auch dann den Mailbody-Typ (RTF/Nicht-RTF) beachten?
Hat jemand nen hilfreichen Tipp? Danke schon mal.
Ach ja, Settings gabs ja auch noch...
Manchmal sieht man echt den Wald vor lauter Bäumen nicht. Danke.
Hallo zusammen,
ich baue an einem Outlook-Plugin (VSTO) und bräuchte ne Möglichkeit div. Einstellungen global für den Nutzer/Client zu speichern. Nun gibt es ja bei MailItems die Möglichkeit diese über UserProperties zu erweitern. Genau sowas bräuchte ich, aber für die Application. Gibts da was? Wahrscheinlich habe ich nur die falschen Suchbegriffe....
Danke für sachdienliche Hinweise.
Danke, das waren die richtigen Hinweise und die haben geholfen.
Hallo,
ich lese XML-dateien (bekomme ich gestellt und kann sie nicht beeinflussen) via XML.Linq / XElement. Klappt soweit auch prima. Mit einem Datenelement habe ich aber noch Probleme. Hier ein Auszug:
<item [B]pos="1" itemType="LENS" sideStr="R"[/B]>
Weitere eingeschlossene Elemente ...
</item>
Mein Problem: Wie komme ich an die zusätzlichen Werte im eröffnenden Item-Tag ran? Mir fehlen da schon die passenden Suchworte.
Nochmals danke, hab den Fehler gefunden.
Die spezifische applikation, wodas ActiveX genutzt werden soll, hat scheinbar einen integrierten Lademechanismus, der dann greift wenn das ActiveX im Serververzeichnis liegt. Da das ActiveX kein klassisches Control ist, was mit regsvr32 registriert werden kann, scheitert das dann. Sobald ich ds Ganze aus dem Verzeichnis raus nehme und woanders hin lege greift der Mechanismus nicht, die vorhandene Registrierung wird genommen, und alles ist gut.
Nettes undokumentiertes Feature. Aber ich weiss wenigstens wem ich da gelegentlich mal massiv in den Hintern treten muss....
Danke, das kannte ich noch nicht. Werde ich mal drauf loslassen.
Nachtrag: Die DLL enthält auch "normale" COM-Klassen. Auf dem betroffenen System lassen sich auch diese nicht via CreateObject ansprechen, was sonst immer problemlos möglich ist.
Hallo,
ich knabbere hier seit einiger Zeit an einem Problem, wo ich nicht so recht weiter komme.
Ich habe ein ActiveX-Control in C# geschrieben, genaugenommen mehrere Controls die zusammen in einer DLL stecken. Das Ganze ist so nicht neu, sondern hat schon 2-3 Jährchen auf dem Buckel und ist auch schon auf einigen hundert Rechnern bei unseren Kunden im Einsatz.
Jetzt habe ich einen Kunden, bei dem ich einen lustigen Effekt habe, den ich mir nicht so recht erklären kann, von Lösungsansätzen ganz zu schweigen.
Das Control basiert auf net 4.0 und wird folgendermaßen registriert:
RegAsm.exe ocx.dll /tlb:ocx.tlb /codebase
So, wie bei den anderen Kunden auch....
Bei dem Problemfall lässt sich die DLL auch problemlos registrieren (ComRegister und ComUnregister werden nachweislich gerufen), ich kann die OCX aber nicht in der Zielapplikation einbinden. Es kommt nur eine allgemeine Fehlermeldung (ActiveX-Objekt konnte nicht erzeugt werden, allgemeiner Fehler 4).
Passendes net-Framework incl. aller Updates ist drauf.
Hat jemand ne Idee wo man da noch suchen könnte?
so funktioniert das m.E. nicht. Prepare() wandelt das SQL-Stmt in ein Ausdrucksbaum um, also eine kompilierte interne Anweisungsfolge die dann die Ausführungseinheit des Servers abarbeitet.
Stimmt, das war ja eigentlich auch der Sinn von Prepare(), dass der Optmizer nicht jedes mal den Ausführungsplan neu erstellen muss.
Diese bekommt die Parameterliste dann bei Execute mit, es gibt also kein SQL-String bei dem die Parameter durch Werte etc ersetzt werden. Am besten Du machst das wie der SQl-Profiler: gib den SQL-String aus und darunter die konkreten Werte der Parameter als Liste.
Ja, sowas in der Art werde ich dann wohl machen.
Danke.
verwendetes Datenbanksystem: MS SQL 2008R2
Hallo allerseits,
ich grafe in C# via System.Data.SqlClient auf SQL-Server zu. Für den Aufbau der SQL-Anweisungen nutze ich PreparedStatements. Klappt auch alles wunderbar.
Nun hätte ich gern für Debugzwecke die SQL-Anweisungen in meinem Debuglog mitprotokolliert. Und zwar die fertig preparierten Anweisungen incl. Parametern. SQLCommand.CommandText kann zwar auch lesend zugegriffen werden, liefert mir aber auch nach Command.Prepare() das SQL-Statement mit den Parameterplatzhaltern, so wie ich es übergeben habe.
Komme ich überhaupt an die dann auszuführende SQL-Anweisung heran oder verbirgt das der SqlClient vor mir?
Ideen?
LG Uwe
Fürs Archiv: Scheint ein Bug im Outlook-COM-Wrapper zu sein:
Der dort am Ende genannte Workaround (e.Data.GetData("RenPrivateMessages") in DragEnter) hat das Problem behoben.
An welcher stelle greifst du den auf die DaD objekte zu??
Stimmt.....
Den Code habe ich von hier:
Drag and Drop von Outlook to C# Applikation
Die müssten ja eig in "EventArgs e" enthalten sein und die elemente aus e können sich nicht kommulativ verhalten.
Ich müsste also e.Data casten?
Hallo,
ich hole via Drag&Drop und folgendem Code Contact-Items aus Outlook.
Grundlegend klappt das auch, allerdings werden bei mehrfachem Drag&Drop die Objekte quasi additiv geliefert, auch wenn ich jeweils nur ein Objekt ziehe.
Sobald ich mein Programm beende und neu starte geht alles wieder von vorne los.
Muss ich das Drop-Event noch irgendwie quittieren oder die Selection zurücksetzen?
private void grpOutlookKontakte_DragDrop(object sender, DragEventArgs e)
{
Microsoft.Office.Interop.Outlook.Application olApp = new Microsoft.Office.Interop.Outlook.Application();
MessageBox.Show(Convert.ToString(olApp.ActiveExplorer().Selection.Count));
for (int i = 1; i <= olApp.ActiveExplorer().Selection.Count; i++)
{
Object olObject = olApp.ActiveExplorer().Selection[i];
if (olObject is Microsoft.Office.Interop.Outlook.ContactItem)
{
this.olCItem = (olObject as Microsoft.Office.Interop.Outlook.ContactItem);
ContactItem oContactItem = new ContactItem(this.olCItem);
FillContactForm_OutlookContact(oContactItem);
}
else
{
MessageBox.Show("Unzulässiger Objekttyp!", "Outlook-Objektprüfung", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
Hast du einfach mal ausprobiert die SetValue-Methode zu überschreiben? Klingt irgendwie genau nach dem was du brauchst.
Nee. Vorhin hab ich erst mal Feierabend gemacht 😉
Die Variante mit dem Überschreiben werde ich am Wochenende mal in Ruhe testen.
.SetValue wäre evtl. ein Ansatz, aber so ganz verstehe ich das nicht. Wieso hatt eine Cell-Methode einen RowIndex-Parameter?
Momentan hänge ich mich mit einer Krückenlösung an CellValueChanged, das hat aber den gleichen Nachteil wie CellValidating: Es wird nur beim manuellen Wechseln der Zelle gefeuert.
Ich suche nach einer Möglichkeit auch eine Benachrichtigung zu bekommen, wenn der Wert per Code geändert wird.
Hallo zusammen,
ich habe eine DateGridView mit von DataGridViewTextBoxCell abgeleiteten Zellen.
Die Zellen sollen sich quasi selbst um bestimmte Aktionen (quasi als Validierung) kümmern. dazu müsste ich in der Zelle mitbekommen, wenn sich deren Wert ändert.
Optimum wäre wohl das Überschreiben von .Value, aber das geht nicht.
Events, an die man sich hängen könnte, hat DataGridViewTextBoxCell auch nicht.
Ideen?
Momentan fiele mir nur ein meine eigene Methode für die Wertzuweisung zu schreiben, die dann an .Value weiterreicht.
Darfs auch ne Objekt-DB sein?
Schau Dir mal db4o an. Im net-Umfeld habe ich damit noch nichts gemacht, allerdings schon größere Datenmengen im Java-Umfeld verwurstet.
Manchmal muss man seinen geschriebenen Kram nur ein paar mal lesen und sacken lassen...
PreviewKeyDown ist ds gesuchte Event.
Hallo zusammen,
ich habe ein DataGridView, bei dem ich beim Verlassen des EditionControls das Drücken der Tab-Taste abfangen bzw. darauf reagieren muss.
Nur wo bekomme ich das Event her?
Das KeyDown-Event des DataGridView liefert mir das nicht, was insofern noch logisch für mich ist da ja zu diesem Zeitpunkt das EditingControl mit seinem eigenen EventHandler noch aktiv ist.
Das KeyDown-Event des EditingControls liefert mir wunderbar alle Events, aber nur wenn dabei der EditingMode nicht verlassen wird. Drücke ich eine Taste, die zum Verlassen des Controls führt (UP/DOWN/TAB bzw. LEFT/RIGHT am Anfang/Ende des Control-Inhaltes), dann wird das KeyDown-Event nicht gefeuert.
Ideen?
CellEndEdit bzw. CellLeave des DGV nützen mir nichts, ich brauche das Event vorher.
LG Uwe