37414
Goto Top

Tif-Dateien mit mehreren Frames drehen

Hallo,

wir erhalten seit kurzer Zeit Faxe in digitaler Form.
Diese kommen in unserem Outlook im Tif-Format an.

Dabei ist es so, dass ein Fax mit mehreren Seiten dann in mehreren Frames in der Datei gespeichert ist.

Wir öffnen zur Zeit diese Fax-Dateien (Tif) mit dem Programm "IrfanView", was grds. hervorragend funktioniert.
Gedruckt werden die Faxe dann mit dem Programm "FreePDF" in den Posteingang unseres neuen Programms.

Nun ist es manchmal so, dass ein Fax mit mehreren Seiten (in mehreren Frames) so erscheint, dass alle Seiten auf dem Kopf stehen.
Bei "IrfanView" kann man zwar die Seiten (auch solche, die sich in Frames befinden) mit "L" od. "R" drehen...
Allerdings muss man die Datei nach jeder einzelnen gedrehten Seite abspeichern, schließen und diese Datei dann neu öffnen, um die nächste Seite drehen und speichern zu können.
Das ist natürlich mega aufwendig...

Hat jemand von Euch eine Idee, wie man das Problem etwas eleganter und einfacher, bzw. benutzerfreundlicher lösen kann?
Hier wären wir sicher auch für ein anderes Programm offen (also außer "IrfanView").

Freue mich auf Eure Antworten.

LG
imebro

Content-Key: 304068

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

Printed on: April 25, 2024 at 15:04 o'clock

Member: Dilbert-MD
Dilbert-MD May 10, 2016 at 08:54:34 (UTC)
Goto Top
Moin,

ich würde eher in die Richtung gehen, dass der Fax-Server, der die Faxe annimmt und als Datei speichert, schon von sich aus PDF-Dateien erstellt. Bei TIFF ist es auch deutlich einfacher, diese zu manipulieren.

Außerdem solltest Du prüfen inwieweit eine derartige "Bearbeitung" der Dateien in Eurem Bereich / für diese Gruppe an Faxen zulässig sind.

Wenn Euer fax-server Euch gleich eine PDF zustellt kann man die Seiten Bei Bedarf im Betrachter drehen oder falls eine "Bearbeitung" und erneute Speicherung mit geänderten Inhalte zulässig ist können PDF's z.B. mit PDF-ExChange oder anderen PDF-Editoren bearbeitet werden. Notfalls mit einer alten Version vom Adobe Acrobat.

Gruß
Holger
Mitglied: 37414
37414 May 10, 2016 at 09:32:09 (UTC)
Goto Top
Hallo und danke.

Leider können die Dateien nur per Tiff am Fax-Server ankommen, da sie später in unserem Programm auch im Tiff-Format benötigt werden.

Wenn ich mit dem "normalen" Acrobat Reader eine solche Datei (die ja dann als Outlook-Email-Anhang rein kommt) öffnen will, erhalte ich die Meldung, dass Acrobat diese Datei nicht öffnen kann, da sie falsch oder nicht konvertiert wurde.

LG
imebro
Member: colinardo
Solution colinardo May 10, 2016 updated at 14:12:39 (UTC)
Goto Top
Hallo imebro,
würde dir ein Powershell-Skript reichen? Dann hätte ich da z.B. was:

Auf die schnelle mal zusammengeskriptet:
param(
    [parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$imagepath
)
Add-Type -AssemblyName System.Drawing
$newpath = "$([System.IO.Path]::GetDirectoryName($imagepath))\$([System.IO.Path]::GetFileNameWithoutExtension($imagepath))_180.tif"  

try{
    $encFlag = [System.Drawing.Imaging.Encoder]::SaveFlag
    $codec = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | ?{$_.MimeType -eq 'image/tiff'}  
    $encParam = new-object System.Drawing.Imaging.EncoderParameters (1)

    $img = [System.Drawing.Image]::FromFile($imagepath)
    $dim = New-Object System.Drawing.Imaging.FrameDimension($img.FrameDimensionsList.Guid)
    $max = $img.GetFrameCount([System.Drawing.Imaging.FrameDimension]::Page) -1

    0..$max | %{
        $tmp = $img.Clone()
        $tmp.SelectActiveFrame($dim,$_) | out-null
        $tmp.RotateFlip([System.Drawing.RotateFlipType]::Rotate180FlipNone) | out-null
    
        if ($_ -eq 0){
            $encParam.Param = New-Object System.Drawing.Imaging.EncoderParameter ($encFlag,[System.Drawing.Imaging.EncoderValue]::MultiFrame.value__)
            $tmp.Save($newpath,$codec,$encParam) | out-null
            $newimg = $tmp
        }else{
            $encParam.Param = New-Object System.Drawing.Imaging.EncoderParameter ($encFlag,[System.Drawing.Imaging.EncoderValue]::FrameDimensionPage.value__)
            $newimg.SaveAdd($tmp,$encParam) | out-null
        }
        if ($_ -eq $max){
            $encParam.Param = New-Object System.Drawing.Imaging.EncoderParameter ($encFlag,[System.Drawing.Imaging.EncoderValue]::Flush.value__)
            $newimg.SaveAdd($encParam) | out-null
            $newimg.Dispose()
        }
    }
    write-host "Tiff wurde um 180° gedreht und wurde hier gespeichert: '$newpath'" -F Green  
}catch{
    throw $_.Exception.Message
}finally{
    $tmp.Dispose()
    $img.Dispose()
    [System.GC]::Collect()
}
Aufrufen kannst du das Skript in einer Batch z.B. so:
powershell -Executionpolicy ByPass -File "C:\Pfad\tiff-rotate.ps1" "C:\PfadZumFax\bildXYZ.tif"
Die Seiten des TIffs werden dann alle um 180 Grad rotiert und das resultierende Tif mit der Erweiterung _180.tif im Verzeichnis des Quelltiffs abgespeichert.

Viel Spaß damit.
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

p.s. Apropos TIFF da hatte ich hier auch schon mal was zum Zusammenfügen von Bildern in ein Multipage-Tiff gepostet - ist zwar jetzt hier nicht relevant, aber für den ein oder anderen in diesem Zusammenhang vielleicht hilfreich: Multi-Page Tiff mit Powershell erstellen
Mitglied: 37414
37414 May 10, 2016 updated at 11:28:16 (UTC)
Goto Top
@ colinardo:

Wow... das wär ja prima, wenn es damit funktioniert.

Nochmal zum Verständnis der übliche Vorgang:
Das Fax kommt in einem Outlook-Verzeichnis (MV) bei uns an.
Es liegt dort quasi als Anhang einer Email und zwar im Tif-Format.
Von dort aus öffnen wir das Fax (Tif) nun per Doppelklick.
Automatisch öffnet sich "IrfanView".
Nun drucken wir in "IrfanView" das Tif per "FreePDF-Drucker" in ein Verzeichnis auf dem Server (S:\Archiv\MV).
Dort liegt es nun - ebenfalls als Tif - und kann über unser Programm angesehen werden.

Gibt es eine Möglichkeit, mit Deinem Script diesen Vorgang nachzuahmen (also inkl. 180-Grad-Drehung)?
Also direkt vom Email-Anhang aus in das Serververzeichnis?

Wenn ja... was müßte ich am Script ändern?

Danke und Gruss,
imebro
Member: colinardo
colinardo May 10, 2016 updated at 11:38:43 (UTC)
Goto Top
Du kannst direkt in Outlook ein Makro einbinden das die TIF-Anhänge z.B. aller Mails eines Verzeichnisses / oder die Markierten Mails durchläuft alle Attachments auf TIFF-Dateien durchforstet und diese extrahiert und an das Skript weitergibt.
Alternativ kann man auch das PS Skript diese Aufgabe mit übernehmen lassen.

Wenn du Interesse hast skripte ich dir das, jedoch nicht mehr kostenlos. Bei Interesse PM
Bitte habe Verständnis dafür, ist ja nun mal eine Anpassung an einen persönlichen Workflow.

Grüße Uwe
Mitglied: 37414
37414 May 10, 2016 updated at 13:46:48 (UTC)
Goto Top
OK...

ich habe jetzt zunächst mal einen Test mit dem obigen Script gemacht.
Dazu den Code in der Powershell eingetragen und das Script dann "tiff-drehen.ps1" genannt.
In der Batch habe ich dann die Pfade so angepaßt, dass jeweils mein Desktop als Ziel eingetragen wurde (der Name der PS wurde auch angepaßt).
Dann habe ich einen Email-Anhang (Tif) auf dem Desktop abgespeichert und diesen "FAX.tif" genannt. Auch das habe ich in der Batch am Ende des 2. Pfades so angegeben. Diese Tif-Datei beinhaltet 2 Seiten.

Hier der Batchcode:

@echo off

powershell -Executionpolicy ByPass -File "C:\Users\Username\Desktop\tiff-drehen.ps1" "C:\Users\Username\Desktop\FAX.tif"  

Leider passierte nichts... außer dass sich kurz ein schwarzes Fenster öffnete... man dort kurz grüne Schrift sah... und das war´s.
Die Datei "Fax.tif" besteht weiterhin, wie vorher und eine neue Datei "Fax_180.tif" gibt es nicht auf meinem Desktop.

Was läuft falsch?

LG
imebro
Member: colinardo
colinardo May 10, 2016 updated at 14:29:03 (UTC)
Goto Top
In Zeile 5 fehlte ein Backslash, sorry ist oben korrigiert.

p.s.
Durch den kleinen Fehler dürfte sich das Fax jetzt bei dir jetzt vermutlich im Ordner
C:\Users\Username
mit dem Namen "DesktopFAX_180.tif" befinden

das nur zur Info


Ansonsten läuft die Umwandlung aller meiner Test-Multipage TIFFs hier einwandfrei.

Das grüne was du siehst ist die Erfolgsmeldung mit Ausgabe des Pfades der neuen Datei. Wenn du sie komplett sehen willst kannst du ganz unten im Skript eine Pause einbauen
read-host "Enter drücken um fortzufahren"
Oder das Skript mal direkt in der PS-Konsole mit übergabe der Datei als Parameter ausführen.
Mitglied: 37414
37414 May 11, 2016 at 07:11:28 (UTC)
Goto Top
OK, hat jetzt funktioniert.

Wie könnte ich die Batch denn nun erweitern, um die Datei "fax_180.tif" nun direkt auf einem Drucker auszudrucken?
Es ist ein Drucker, der vom Programm "FreePDF" erstellt wurde, um Tiff´s zu drucken. Er hat den Namen "FreePDF - Tiff-Drucker".

Mit dem Befehl "print" habe ich es versucht. Aber da der "FreePDF - Tiff-Drucker" nicht der Standarddrucker ist, hat das wohl nicht funktioniert.
Allerdings wurde auch nichts auf dem Standarddrucker (normaler Papierdrucker) ausgedruckt.

Was muss ich ändern?

LG
imebro
Member: colinardo
colinardo May 11, 2016 updated at 07:17:06 (UTC)
Goto Top
Zum Drucken auf bestimmte Drucker habe ich hier schon mal ausführliche PS-Skripte gepostet man muss ja nicht alles doppelt und dreifach posten face-wink (das zweite geht auch mit deinen Tiffs)
PDF via Powershell drucken - Reader nach druck schließen
Mitglied: 37414
37414 May 11, 2016 at 07:32:16 (UTC)
Goto Top
Danke für den Link...

Dann müßte ich ja zunächst nochmal eine zusätzliche PS-Datei erstellen (Deine 2. Variante).
Ist es nicht möglich, einfach meine vorhandene Batch mit dem Printvorgang zu erweitern?

LG
imebro
Member: colinardo
colinardo May 11, 2016 at 07:44:37 (UTC)
Goto Top
Zitat von @37414:
Dann müßte ich ja zunächst nochmal eine zusätzliche PS-Datei erstellen (Deine 2. Variante).
Nein, kannst du in das obige integrieren.
Mitglied: 37414
37414 May 11, 2016 at 07:45:17 (UTC)
Goto Top
Im Moment sieht meine Batch so aus:

@echo off

powershell -Executionpolicy ByPass -File "C:\Users\User\Desktop\tiff-drehen.ps1" "C:\Users\User\Desktop\Fax.tif"  

for /r . %%R in (Fax_180.tif) do (
start /B „Drucken“ „P:\Hilfreiche Programme\Irfan View\IrfanView\i_view32.exe“ /t %%R
ping 127.0.0.1 -n 15
)

del "C:\Users\User\Desktop\Fax.tif"  
del "C:\Users\User\Desktop\Fax_180.tif"  

echo Das Fax wurde in den Posteingang gedruckt!
pause >nul

Aber er kann wohl nichts mit dem "Drucken" anfangen...
Außerdem müßte ich ja von der Batch aus zunächst das PS-Script abarbeiten und dann wieder zurück zur Batch, um den Druckbefehl abarbeiten... und anschließend die beiden Tif-Dateien löschen zu können.

Ich möchte möglichst wenige Dateien haben und so fände ich es einfacher.

LG
imebro
Member: colinardo
colinardo May 11, 2016 updated at 07:48:18 (UTC)
Goto Top
start /B „Drucken“
Haha , der war gut face-big-smile siehe meine PS Skripte zum Drucken dann brauchst du nicht mixen face-wink
Mitglied: 37414
37414 May 11, 2016 updated at 08:32:05 (UTC)
Goto Top
Sorry, ich hatte Deine Antwort "Nein, kannst du in das obige integrieren." erst gelesen, nachdem ich geschrieben hatte face-smile

Also den Code

$printer = 'HP Laserjet 1320'  
# store original printer
$originalPrinter = gwmi Win32_Printer -Filter "Default='true'"  
# Set Default Printer
[void](gwmi Win32_Printer -Filter "Name='$printer'").SetDefaultPrinter()  

gci "C:\Ordner\*.pdf" | %{  
    $pdfApp = (start-process $_ -Verb "print" -PassThru).ProcessName  
    sleep(3)
    while($true){del $_ -Force -EV err -EA SilentlyContinue; If($err){sleep(1)}else{break}}
}
get-process $pdfApp -ErrorAction SilentlyContinue | Stop-Process

#restore original default printer
#[void]$originalPrinter.SetDefaultPrinter()

...einfach in mein vorhandenes PS-Script unten anhängen?

Bei "gci" müßte ich dann den Pfad zum Desktop und zur dortigen "Fax_180.tif" eingeben und ganz oben unseren "FreePDF - Tiff-Drucker"?

LG
imebro
Mitglied: 37414
37414 May 11, 2016 at 09:29:06 (UTC)
Goto Top
Habe eine Lösung gefunden face-wink

Die Lösung habe ich nun per Batchdatei gefunden.

Hier mal der Code:

@echo off

REM *** Inhalt der Tif-Datei auf dem Desktop wird um 180 Grad gedreht ***
REM *** Gleichzeitig wird das Powershell-Script "tiff-drehen.ps1" gestartet. ***  
REM *** Dieses erstellt die Datei "Fax_180.tif" ***  
powershell -Executionpolicy ByPass -File "C:\Users\user\Desktop\tiff-drehen.ps1" "C:\Users\user\Desktop\Fax.tif"  


REM *** Der Tiff-Drucker wird zum Standarddrucker gemacht ***
rundll32 printui.dll,PrintUIEntry /y /n "\\user\FreePDF - Tiff-Drucker"  

REM *** Die Datei "Fax_180.tif" wird auf dem Standarddrucker (jetzt Tiff-Drucker) gedruckt. ***  
REM *** Somit landet der Inhalt im Posteingang von AidA ***
"P:\IrfanView\i_view32.exe" "C:\Users\user\Desktop\Fax_180.tif" /print  

REM *** Standarddrucker wird wieder der Ursprüngliche Drucker ***
rundll32 printui.dll,PrintUIEntry /y /n "\\user\OKI (IM)"  

REM *** Die Dateien "Fax.tif" und "Fax_180.tif" werden gelöscht ***  
del "C:\Users\user\Desktop\Fax.tif"  
del "C:\Users\user\Desktop\Fax_180.tif"  

echo.

echo Das Fax wurde in den Posteingang von AidA gedruckt!
ping -n 7 localhost > NUL

exit

Funktioniert wunderbar... face-smile

Am Ende werden die beiden Tif-Dateien vom Desktop gelöscht, sodass es beim speichern des nächsten Tif-Anhanges aus Outlook keine Probleme gibt.

Dazu wird der aktuelle Standarddrucker nur für diesen Druckvorgang verändert und dann wieder zurück gesetzt.

LG und danke für Deine Hilfe
imebro