Vielen Dank für Deine Arbeit.
Eine sehr gute Übersicht. Die List nehme ich gerne mit!
Vielen Dank für Deine Arbeit.
Eine sehr gute Übersicht. Die List nehme ich gerne mit!
Welches PDF-Format? .pdf
Gibts da Unterschiede? Ich schaue mal was sich herausfinden lässt. Edit: Ich finde da keine Infos in den Dateieigenschaften vom PDF. Habe was gefunden. PDF-Version: 1.4 (Acrobat5.x)
In Nitro kann ich als "Standard PDF" und "Flattened PDF" speichern.
Es handelt sich dabei um die Bezahlversion. Schnittstelle schaue ich ebenfalls was ich finde. Edit: Scheint nur eine Java Schnittstelle zu haben :/ Bei Batch-OCR, OCR& bearbeiten gehts ja nur um Mehrere aufs Mal konverteieren denke ich.
Die Funktionen stehen hier weiter unten. Habe zum Glück noch die Einmal-Bezahl-Lebenslang-Update-Version erwischt damals.
Am Ende kann es aber auch ein anderes Programm sein. Es geht eigentlich nur um das zusammenfügen bei Nitro.
Alina Nochmal zu Deinem Lösungsvorschlag. Die .exe fügt die beiden PDF im gleichen Ordner zusammen richtig?
Also müsste ich noch schauen die richtigen zwei PDF jeweils automatisiert in den gleichen Ordner zu bekommen?
Es gibt die Möglichkeit ein Filesystem zu monitoren z.b. mit dieser UDF.
Danke, das klingt toll. Da muss ich mich einlesen. Denke aber das könnte mit meinen momentanen Autoit-skills schwierig werden.
Was die Exe-Datei betrifft, so kann ich Dir Entwarnung geben.
Ok, dann werde ich es mal testen. Danke.
so wie ich das lese brauchst du eigentlich 2 voneinander getrennte Lösungen
Thx auch Dir. Ich werde versuchen in die Richtung zu gehen.
Was mir noch eingefallen ist: Ich kann aus dem ersten Programm heraus Drucken, ein .pdf oder ein .xls File erstellen.
Vielleicht wäre der erste Schritt aus einem Excel heraus einfacher zu realisieren. Am Ende müsste es einfach ein PDF sein.
Edit:
Ich bin davon ausgegangen das Swiffer das zusammenfügen nicht gewerblich machen möchte.
Ich möchte ehrlich sein. Es ist für unseren Familienbetrieb um nach der Rechnungserstellung den dazu passenden QR-Code im erstellten PDF zu hinterlegen. Also wenn wir es genau nehmen ist es gewerblich. Leider bietet unser liebgewonnenes Warenwirtschaftsprogramm keine solche Funktion an.
Falls ich die cpdf.exe brauchen kann und da noch etwas bezahlen sollte wird das selbstverständlich nachgeholt. Keine Frage und Danke für den Hinweis.
Moin Alina
Vielen Dank für Deine schnelle Antwort und Deine Bemühungen
Ich denke das ist was ich suche. Ich krieg mich aber nicht überwunden auf die .exe doppel zu klicken. Da löst bei mir der "Alarmreflex" aus. Ist nicht persönlich. Du bist ja schon lange aktiv im Forum daher sollte das sicher in Ordnung gehen aber könnte ich das auch nachträglich kompilieren und mir erst den Inhalt ansehen?
Es reicht auch erst morgen. Kein Stress. Mein Bett ruft eh schon lange nach mir.
Edit. Absolut traumhaft wäre: Ordner 1 überwachen ob PDF neu gespeichert wird. Wenn PDF gespeichert schaue letzte 4 ziffern vom Dateinamen (5000). Suche in Ordner 2 nach PDF Inhalt 5000. Füge PDF aus Ordner 2 in PDF aus Ordner 1 ein und speichere dieses in Ordner 3 mit 5000+.
Guten Abend zusammen
Ich möchte mich als erstes nochmal für die wirklich tolle Hilfe bei meinem letzten Problem bedanken!
Die einfach mal kurz geschriebene Putty-UDF von AspirinJunkie beeindruckt mich heute noch und ist fast täglich in Gebrauch.
Jetzt habe ich eine andere wiederkehrende Sache die ich automatisieren möchte.
Ich suche eine automatisierte Lösung um ein PDF in ein anderes PDF einzuzufügen und das neue danach abzuspeichern.
Soweit vermutlich relativ einfach realisierbar mit PDFCreator und alternativen. OS: Windows 10
Das ganze ist aber abhängig davon welche Nummer das erstellte PDF hat. Ausserdem muss ich über die Windows Suche herausfinden welches PDF hinzugefügt werden muss da die Nummer nur im PDF steht, der Name vom PDF jedoch anders ist.
Zur Zeit nutze ich Nitro PDF Pro welches ich auch gerne weiter verwenden würde. Es besitzt die Option PDF zusammenzuführen.
Beispiel. Zur Zeit sieht der Ablauf so aus:
5000.pdf fertig erstellt (nicht mit Nitro PDF PRO), soeben erstelltes PDF mit Nitro öffnen, Explorer/Ordner mit vielen PDF öffnen, in der Suche 5000 eingeben, File ABC.pdf wird gefunden, File öffnen und in Nitro zusammenfügen, Speichern unter 5000+.pdf.
5001.pdf fertig erstellt (nicht mit Nitro PDF PRO), soeben erstelltes PDF mit Nitro öffnen, Explorer/Ordner in der Suche 5001 eingeben, File EFG.pdf wird gefunden, File öffnen und in Nitro zusammenfügen, Speichern unter 5001+.pdf.
usw. tatütata, hurra!
Eigentlich schnell erledigt aber die Aufgaben stehen vermutlich längere Zeit immer wieder an.
Daher wäre eine Automatisierung echt top. Geht das möglicherweise per Autoit oder ist das PDF-Format das zweite Java?
Vielen Dank für Eure Inputs und Liebe Grüsse
Swiffer
Das geht ja sehr schnell mit den Daten abfragen. Super!
Es kommt zwar eine Meldung von Cloudflare ich sei blockiert, die Preise werden jedoch trotzdem abgerufen und der "normale" Seitenaufruf funktioniert auch noch.
Ich habe 18$iDelay jetzt mal auf 600 gesetzt in der Hoffnung weniger Gefahr zu laufen eine IP-Sperre zu erhalten. Vor allem beim testen.
Frage(n):
Ich habe 151 in _NavigateTo('https://richner.teamonline.ch/search/?q=f%FCllventil') geändert.
Die Seite öffnet, das File wird erstellt aber es sind keine Preise enthalten. Es gibt keine Fehlermeldung.
Muss ich sonst noch etwas ändern, wenn ich die Daten von einer anderen Richner-Seite abrufen möchte?
Nochmals vielen Dank für Dein Engagement! Es eilt wie immer nicht.
Hallo SOLVE-SMART
Vielen Dank für Deine Bemühungen!!! Dein Vorschlag sieht echt toll aus
Das ganze ist komplexer als ich es mir vorgestellt hatte. Hoffe Du hattest nicht zu viel Aufwand.
Freue mich schon sehr es ausgiebig zu testen und gebe Dir dann gerne eine Rückmeldung.
Ich wünsche einen erholsamen Sonntag.
Grüsse Swiffer
Hallo Fuffi778
Ich bin auch Anfänger aber vielleicht hilft Dir das weiter:
Hallo!
Ein kleiner Erfahrungswert mit den Netzlaufwerke: Das verwenden von Laufwerksbuchstaben ist schon sehr sehr alt und eigentlich braucht man diese seit 20 Jahren nicht mehr. Ich weiß, viele verwenden diese aus Gewohnheit, aber es würde auch ein Shortcut auf \\server\freigabe reichen.
Was weniger bekannt ist: es gibt einen technischen Unterschied: Wird beim Start von Windows bzw. der Benutzeranmeldung ein Netzlaufwerk mit einem Buchstaben verwendet wird auch versucht diesen zu verbinden. Wenn das nicht gleich funktioniert, z.B.: Notebook das nicht im (W)Lan ist, was ja bei Windows öfter vorkommt als man glaubt, dauert die Anmeldung deutlich länger und im schlechtesten Fall hat man im Explorer beim Buchstaben ein rotes X daübergelegt (konnte nicht verbunden werden). Programme die möglichweise im Autostart sind und auf den Buchstaben verweisen (auch Links in Execl, Word,...) brauchen dann ewig bis sie dann in ein Timeout laufen. Ganz schlimm ist es mit Outlook und PST-Datein die auf einen Share liegen: So manches Outlook gackt dann ab...
Verwendet man nur UNC-Pfade passiert die Prüfung erst wenn der Link auch verwendet wird. Das ist deutlich schneller und konfortabler und diese "alt"-Problem (stammen von Windows 3.11 !!) gibt es dann nicht oder nicht in der Form.
Wie gesagt, ist ein Erfahrungswert aber ich versteht wenn man lieb gewonnen Handhabungen nicht her geben möchte.
lg
Racer
Peter S. Taler Ich schreibe zu dem Thema INI hier weiter wenn es recht ist.
Es ist gut zu wissen mit der INI-Datei eine entsprechend konfigurierte .exe noch ändern zu können bzw. Einstellungen vorzunehmen.
Danke für diesen Hinweis.
Vermutlich werde ich es eher selten brauchen, da ich meistens mit der au.3 arbeite.
Also auf zur Praxis: *Händereib*
Ich habe eine Test.au3, Test.exe und eine Test.ini auf dem Desktop erstellt.
In der Test. exe ist Dein Code hinterlegt: (geht INI auch mit au.3? Tippe auf ja)
Const $programm_name = 'Test' ; der name des Programms
Global $start_dir ; Start Directory des Programms
; --- Pfaden Anfang ----
if stringlen(@ScriptDir) <= 3 Then
$Start_dir = Stringleft (@ScriptDir, 2)
Else
$Start_dir = @ScriptDir
EndIf
MsgBox (0, "Start Dir", $Start_dir)
Const $ini_pfad = $start_dir &'\' & $programm_name & '.ini'
;------ Pfaden Ende
; Pfaden muss sein, da dder Befehl @ScriptDir z.B. bei F -> F:\ also mit dem schrägen liefert bei F:\test -> eben den schrägen
; nicht liefert.Damit würden Pfadzusammensetzungen unterschiedlich ausfallen. Eine Autoit Ungereimtheit, die man mal beseitigen
; könnte.
; Ini Read Anfang
Global $_trenner = (iniRead ($ini_pfad, "10", "trenner", "IniFehler")) ; einlesen des Trenners
MsgBox (0, "Trenner", $_trenner)
; Ini Read Ende
Alles anzeigen
Was schreibe ich denn jetzt in die INI?
$_trenner = ;sowieCsvTrenner = ; bringt: "Ini Fehler".
Edit: Ich muss mal $_trenner = ";" versuchen.
Peter S. Taler Das werde ich. Ist nur gerade etwas stressig auf der Arbeit. Hoffe spätestens am WE. Mir erschliesst sich zur Zeit nur ein Vorteil von .ini wenn .au3 schon zur .exe wurde. Ansonsten kann es doch auch mit $Variabel im Script gelöst werden oder?
SOLVE-SMART Hehe, Lieferanten Seite down. Ups! Das mit Cloudflare haben die erst kürzlich geändert glaube ich. Es ist noch nicht so lange her, da musste ich jedes Mal ein Capture lösen beim öffnen der Seite. Es bleibt spannend.
Bist du dir sicher das du wirklich diese drei Werte zusammenlegen und als "Artikelnummer" ausgegeben haben möchtest?
Ja. Ich habe es nochmal mit dem "Quellcode" gleich oberhalb versucht und es stimmt mit den hinterlegten Artikelnummern im System überein. Der Import funktioniert bestens so.
Ein trennen nach Farbe und Variante wäre eine Option, müsste allerdings erst im System umgestellt werden. Aber es geht nach dem Import eh mit der Herstellernummer weiter.
brauchst du bei deiner CSV, zum Import, als erste Zeile die Spaltenbezeichner? Also Artikelnummer;Verkaufspreis
Das wäre super. Genau wie im Code oben, nur ein mal.
Ich würde Dir dringend empfehlen, dich mit *.ini Dateien in Autoit zu beschäftigen.
Dort kannst Du dann z.B. Trenner festlegen, Spaltenköpfe usw. Dann musst Du nicht bei jeder Änderung an den Source.
Klingt interessant. Werde ich die Tage gerne mal machen. Sieht für mich aber erstmal noch nicht sooo einfach aus
Falls es bei dem WebDriver Ansatz bleibt oder erstmal dieser genutzt wird, muss man ggf. sowieso an den Code heran, wenn sich auf der Webseite was ändert.
Hier wäre ich Dir sehr um einige ";Diese Funktion macht gerade das" verbunden.
Dann könnte ich das ja vielleicht selber anpassen sollte es mal nötig werden und noch etwas lernen dabei.
Ich bin schon sehr auf den Aufbau gespannt. Aber wie gesagt kein Stress es eilt wirklich nicht.
Ich wünsche eine gute Nacht und einen ebensolchen Wochenstart.
Grüsse Swiffer
Danke Peter S. Taler . Habe es so geändert.
Peter S. Taler Wir werden in Zukunft versuchen auf CSV zu bestehen. Als Kleinbetrieb haben wir einfach nicht so viel Hebel.
SOLVE-SMART Wie hast Du denn die Screenshot-Gif erstellt?
Edit:
Ich habe jetzt mal ein .txt erstellt, die Endung in csv. geändert und ein wenig mit dem Import getestet.
Wichtig wäre noch zu erwähnen das möglichst der Preis exkl. MwSt. verwendet wird.
Mit folgender Gliederung habe ich die besten Ergebnisse erhalten:
Artikelnummer, Verkaufspreis (das wäre Artikelnummer, Farbe, Typ in einem, ohne Abstand)
#include <Array.au3>
#include <Inet.au3>
; HTML-Quelltext der Seite einlesen:
$sHTML = FileRead("https://richner.teamonline.ch/waschtische-bidets-badezimmermoebel/einbau--einlegewaschtische-stahl/.html")
; HTML-String in HTML-Objekt parsen (Doku: https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmldocument)
$oHtmlDoc = ObjCreate("HTMLFILE")
$oHtmlDoc.open()
$oHtmlDoc.write($sHTML)
$oHtmlDoc.close()
While $oHtmlDoc.readyState <> "complete"
Sleep(10)
WEnd
; Alle div-Elemente auslesen - genauer suchen wir nur die mit der Klasse "product-wrapper" - dazu aber später
Local $oNodeList = $oHtmlDoc.GetElementsByTagName('div')
; Variablen, welche bei der Auswertung verwendet werden - inklusive dem Ergebnisarray $aProdukte
Local $aProdukte[$oNodeList.length][5], $sClass, $iCount = 0, $aTmp
; Die gefundenen div-Elemente einzeln durchgehen
For $oDiv In $oNodeList
; Klassenattribut des aktuellen Elementes auslesen:
$sClass = $oDiv.GetAttribute("className")
; nur wenn es ein product-wrapper-Element ist weitermachen - sonst zum nächsten Element gehen
If Not StringInStr($sClass, "product-wrapper") Then ContinueLoop
; Alle Subelemente des product-wrapper element durchgehen (dort stehen dann unsere Produktinfos)
For $oElem In $oDiv.All
$sClass = $oElem.GetAttribute("className")
Select
; Produktnamen auslesen:
Case StringInStr($sClass, "product-name")
$aProdukte[$iCount][0] = $oElem.InnerText
; Zusatzbezeichnung auslesen:
Case StringInStr($sClass, "product-add-name")
$aProdukte[$iCount][1] = $oElem.InnerText
; Artikelnummer auslesen:
Case StringInStr($sClass, "product-itemnumber-desc")
$aTmp = StringRegExp($oElem.InnerText, 'Artikel-Nr\.:\h*(\d+)', 3)
If Not @error Then $aProdukte[$iCount][2] = $aTmp[0]
; Preis auslesen:
Case StringInStr($sClass, "product-price-amount")
$aProdukte[$iCount][3] = Number(StringRegExpReplace($oElem.InnerText, '[^\d\.]+', ''))
; Währung auslesen:
Case StringInStr($sClass, "product-price-currency")
$aProdukte[$iCount][4] = $oElem.InnerText
EndSelect
Next
$iCount += 1
Next
Redim $aProdukte[$iCount][5]
_ArrayDisplay($aProdukte, "Produkte", "", 64, "|", "Artikel|Ausführung|Artikelnummer|Preis|Währung")
Alles anzeigen
Das Fenster öffnet sich zwar aber es werden keine Werte eingetragen.
Da war meine Vorahnung als ich es eingerichtet habe wohl richtig. Es wird mal nützlich sein eine Ersatz Backup-SD-Karte in Griffnähe zu haben. Wechseln und es läuft wieder. *Selber auf die Schulter klopf*
Ich habe an beiden Pi synchron die Updates per ssh gemacht. Erst in /etc/apt/sources.list und d/*.list auf bullseye umgestellt. Danach:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get autoremove
sudo apt-get autoclean
sudo reboot
Nach dem Update, bis vor dem Reboot war alles gut.
Bullseye drauf, Wireguard läuft, per ssh ansprechbar und der Ping ok.
Nach dem sudo reboot ist keine Verbindung mehr möglich. Ssh geht nicht, der Ping kommt mit meiner IP zurück und die Fritze erkennt kein Pi4. Die Status LED leuchtet rot und der LAN Anschluss konstant grün/orange.
Was ich schon versucht habe:
- Neues Lan Kabel, anderer Anschluss an der Fritze.
- Neustart der Fritze und vom Pi. Fritze erkennt jetzt Pi aber ohne IP-Vergabe.
- ssh Datei per Cardreader auf die SD-Karte kopiert (war weg)
Habe ich etwas übersehen oder hat sich da vermutlich durch Update und Neustart das System zerschossen?
Jemand eine Idee was ich noch versuchen könnte? Die SD von nach dem Update habe ich ja noch.
Sonst muss ich mal in aller Ruhe schauen ob ich das nochmal so hinbekomme mit einer Neuinstallation siehe Netzwerklegende.
Edit:
Also es wird davon abgeraten ein In-Place-Upgrade durchzuführen und es kann Probleme geben.
Daher ist der Fall für mich klar. 10 behalten oder clean install auf 11.
Grüsse Swiffer
SOLVE-SMART Moin und Danke für Deinen Einsatz. Es eilt also wirklich nicht. Schlaf ist wichtig
Ich habe jetzt schon ein schlechtes Gewissen Deine / Eure Zeit so beansprucht zu haben.
Ich kann im beim Import in meinem Programm zuweisen welches Feld vom .csv in welches Feld im Programm kommt.
Das müsste also nicht mal übereinstimmen. Trotzdem wärs natürlich besser von Anfang an richtig.
Leider muss ich jetzt offline und kann erst Nachmittags / Abends wieder schreiben.
Gerne kann ich Dir dann Screenshots der Situation hochladen oder alternativ das Programm senden, dass Du Dir selber kurz ein Bild machen kannst.
Grüsse Swiffer
Gut, dass Du nochmal fragst.
Ja die Ausführung bräuchte ich dann auch. Und bei der Farbe gibt es auch noch Unterschiede.
Also in etwa so: 234057(Artikel) xxx(Farbe) 242(Ausführung)
Deshalb bevorzuge ich die Herstellernummer. Aber bei den meisten der Artikel die ich viel brauche reicht die Artikelnummer und ggf. noch die Farbe.
Die Normale geht auch. Ich habe bei mir im System beide Nummern hinterlegt.
Vielen Dank für Eure Antworten und Bemühungen!
Die Artikel sind im Rechnungsprogramm schon hinterlegt. Ich kann vom Lieferanten eine Liste anfordern. Bekomme dann meist ein Excel File mit 200k Artikeln und muss die benötigten irgendwie raus filtern. Das wäre ja an sich kein Problem aber ich möchte die nicht jede Woche belästigen ich sollte dann mal wieder die aktuelle Liste mit den gerade aktuellen Preisen haben. Ich werde mal eine Liste der benötigten Artikel erstellen. Ja, ich bin aus der Schweiz.
Ich habe angefragt und bekomme auch eine .xlsx Liste. Aber die ist in paar Tagen wieder nicht mehr aktuell, zumindest der Preis.
Es sieht echt danach aus. Ändern bei Euren Lieferanten die Preise nicht so oft? Sonst steht Ihr ja vor einem ähnlichen Problem.
Wieder mal gezaubert. Werde ich morgen gerne testen.
Edit: SOLVE-SMART
Auf ein paar Wochen komm es nicht an. Das könnte ich gut warten.
Ich brauche die Artikelnummer um die Preise eindeutig zuordnen zu können. Am besten die "Artikel-Nr des Herstellers". Die Normale geht aber auch.
Bis jetzt habe ich es erst mit Excel versucht aber ja, CSV kann das Programm auch importieren. Ich benutze Firefox.
Vielleicht sollte ich dem Lieferanten erst mal noch eine Nachricht schreiben ob er etwas wie eine Schnittstelle anbietet?
Oder ein File das online abrufbar ist? (CSV)
Moin zusammen,
Ich arbeite in einem kleinen Familienbetrieb der sich auf Heizung und Sanitär (Gas, Wasser, Scheisse) spezialisiert hat.
Beim Laminat/PVC Thema letztens konnte ich leider nicht viel beitragen, vielleicht ja ein anderes Mal.
Bei mir geht es heute um unser Rechnungsprogramm und die (leidigen)Tagespreise unserer Lieferanten.
Zur Zeit öffne ich den Onlinekatalog (nicht Shop), suche den aktuellen Preis, übertrage ihn in unser Rechnungsprogramm und speichere den aktualisierten Artikel. Bis zum nächsten Mal, auf Wiedersehen.
Jetzt überlege ich mir etwas mit Autoit zu realisieren bzw. zu automatisieren. Es handelt sich um etwa 200 Artikel die oft gebraucht werden. Der Rest wäre leicht per Hand machbar.
Glaskugelalarm: Ich schuster mir jetzt in tagelanger Arbeit etwas zusammen, mit Send () und Sleep () poste es hier und dann kommt in paar Minuten ein sowas von besseres script.
Es ist erleuchtend aber zugleich auch frustrierend. Deshalb frage ich diesmal lieber zuerst.
Ihr braucht mehr Angaben? Klar! Aber bevor ich jetzt zu tief ins Detail gehe. Wie seht Ihr das? Wäre es mit relativ geringem Aufwand machbar oder vermutlich doch eher zu aufwändig.
Natürlich vorausgesetzt es verstösst nicht gegen: Automatisierung von Webseiten
Das Rechnungsprogramm verfügt über .xlsx .csv .txt Importmöglichkeiten falls dies etwas nützen sollte.
Der Import könnte ja theoretisch gut von Hand gehen wenn die .xlsx Liste der Artikel aktuell wäre.
Besten Dank und einen schönen Nachmittag.
Grüsse Swiffer
warum muss was anderes ran? Du kannst deinen gesetzten Timer auch neu setzen TimerInit() und dann erneut per TimerDiff() abfragen.
Stimmt. TimerInit() in den jeweiligen Func
Wobei sich mir die Frage stellt, wofür die ganze Konstruktion überhaupt gut sein soll?
Für nichts. Ich gehe ein wenig die Befehle in der Hilfe durch und bastel spontan etwas zusammen dazu
Jetzt bin ich bei For...In...Next. So langsam sind da zuviele Array und String für mich -.-