userxy
Goto Top

Tiff-Dateien in vielen Unterordnern zusammenfügen zu einem PDF pro Ordner

Ich habe eine Ordnerstruktur in der sich unregelmäßig viele Tiffs in einzelen Ordnern befinden.

Ziel ist es nun "automatisiert" (per Batch oder so...) die Ordner zu durchsuchen und ein PDF pro Ordner zu erzeugen, wobei alle im Ordner befindlichen Tiffs zusammengefasst werden.
Am Ende sollte die PDFs wie der jeweilige Ordner bezeichnet sein.

System:
Windows XP

Programme:
Adobe Acrobat Professional 9
- freeware möglich...

Aufbau:
Ordner1 -> 10 Tiffs
Ordner2 -> 15 Tiffs
Ordner3 -> 113 Tiffs
...

Ziel:
Ordner1.pdf
Ordner2.pdf
Ordner3.pdf

Vielen Dank für Ihre Bemühungen
Repro-Rone

Content-Key: 155343

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

Printed on: April 19, 2024 at 09:04 o'clock

Member: micneu
micneu Nov 18, 2010 at 19:20:44 (UTC)
Goto Top
habe bis jetzt nur das gefunden mit dem kannst du aus einer tiff ein pdf erstellen.
nconvert

hier die zeile mit der ich es getestet habe.

nconvert.exe -out pdf "michael_1986.tif "Unbenannt 1.tif"

hetzt fehlt nur noch ein kommandozeilen tool um die dateien zu eriner pdf zu machen.

gruß michael
Member: micneu
micneu Nov 18, 2010 at 21:06:25 (UTC)
Goto Top
muss das unter windows sein oder kann es auch unter linux gelöst werden?
welche systeme hast du zur auswahl?

gruß Michael
Member: UserXY
UserXY Nov 18, 2010 at 21:07:28 (UTC)
Goto Top
Hallo!

Ich kannte dieses Tool nicht, scheint abber ganz schön mächtig zu sein.

Habe nun folgenden Code angewendet und das Programm erzeugt einzelne PDFs.

nconvert.exe -multi -out pdf D:|Testbereich|Ordner1|*.*

Leider habe ich bei diesem Tool keine Funktion zum Zusammenfassen der PDFs gefunden.

Vielen Dank bis hier hin...
Member: micneu
micneu Nov 18, 2010 at 22:14:54 (UTC)
Goto Top
ich habe gerade ein shell script für linux/unix erstellt:

### Tiff2PDF
### (c) M. N. 18.11.2010

QUELLE="/daten//temp"  
ZIEL="/daten//temp/"  
EXTENSION="*.tif"  
DIR=`find $QUELLE -type d`
for i in $DIR; do    
    b=`echo $i | awk -F '/' '{ print $NF }'`  
    convert "$i/$EXTENSION" "$i/$b.pdf"  
done
habe noch etwas geduld, dann kommt auch noch die powershell version face-smile

gruß michael
Member: UserXY
UserXY Nov 18, 2010 at 22:35:40 (UTC)
Goto Top
Das geht ja fluchs....

Entschuldige den wahrscheinlich dummen Einwand:

Ist mit einer Powershell-Anwendung die Verarbeitung als Batch weiterhin möglich?

Ich würde mir gerne die Option offen halten die Befehlkette(n) zu modifizieren...

P.S. Kenne mich mit Powershell überhaupt nicht aus...

Bis dann,
Repro-Rone
Member: UserXY
UserXY Nov 18, 2010 at 22:47:35 (UTC)
Goto Top
Entschuldigung, ich hatte die Frage überlesen...

Ja, Windows (XP) müsste es schon sein...
Member: micneu
micneu Nov 18, 2010 at 23:15:44 (UTC)
Goto Top
so habe fertig.
schaues dir einfach an, hier die powershell version.
abspeichern als "nameirgendwas.ps1"
ist denke ich sehr schlüssig der code face-smile
wenn noch änderungen sind sach einfach bescheid.
zurzeit ist es so das die pdf in dem verzeichnis gespeichert wird in dem die entsprechenden tif dateien sind.

das "Set-ExecutionPolicy Unrestricted" in der powershell einmal perhand ausführen.

#   **************************************************************
#   Tiff2PDF
#   bitte hier die benoetigte imageversion runterladen
#
#   http://www.imagemagick.org/script/binary-releases.php#windows
#   
#    einmal auf der powershell ausgeführt werden
#     "Set-ExecutionPolicy Unrestricted"  
#   **************************************************************
#    
#   **************************************************************
#   * Erstellt M.N. - POWERSHELL / Entwicklung   18.11.2010      *
#   **************************************************************

$QUELLE = "c:\Temp"  
$EXTENSION = "*.tif"  
### laufzeit auswertung start
$start = Get-Date
echo "programm gestartet"  
### Verzeichnis namen speichern
$VERZEICHNIS = Get-ChildItem $QUELLE -recurse  -filter * | ? { $_.PSisContainer -eq $true } | sort

### verzeichnis namen der reihe nach abarbeiten
foreach ($i in $VERZEICHNIS) {
    echo "bearbeite verzeichnis: `t$i"  
    $i2 = $i.fullname
    convert "$i2\$EXTENSION" "$i2\$i.pdf"  
    }
### laufzeit auswertung stop    
$stop = Get-Date
#### laufzeit auswertung
$gelaufenezeit = ($stop - $start).TotalSeconds
If ($gelaufenezeit -gt 60) {
    $gelaufenezeit = ($gelaufenezeit / 60)
    $MINSEK = "Min."}  
    Else {$MINSEK = "Sek."}  
echo "Auftrag nach $gelaufenezeit $MINSEK erledigt...."  

gruß michael
Member: UserXY
UserXY Nov 19, 2010 at 09:06:35 (UTC)
Goto Top
Danke, ist echt super. Ich habe mir Powershell runtergeladen und das Ganze klappt super.

Mir ist auf meiner Seite gerade aufgefallen das ich noch ein weiteres Problem habe.

Die Tiffs kommen ursprünglich über einen Programmexport in ein Verzeichnis mit einer INDEX.DAT-Datei:

Originalverzeichnis:
00000001.TIF
00000002.TIF
00000003.TIF
...

INDEX.DAT:
9292##,22#1234#,300,00000001.TIF,00000002.TIF,00000003.TIF,00000004.TIF,00000005.TIF,00000006.TIF,00000007.TIF
9222##,23#1235#,300,00000008.TIF,00000009.TIF,00000010.TIF,00000004.TIF,00000011.TIF,00000012.TIF,00000013.TIF
9222##,23#1236#,300,00000014.TIF,00000015.TIF,00000016.TIF,00000017.TIF,00000018.TIF,00000019.TIF,00000020.TIF

Bisher lese ich über batch die Textdatei (DAT) aus und verteile die einzelnen Tiffs in die gewünschten Ordner:
echo off
cls
chcp 1252
:start
FOR /F "usebackq tokens=1,2 delims=, " %%i IN (INDEX.DAT) DO @mkdir "%%i%%j"   
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%l %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%m %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%n %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%o %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%p %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%q %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%r %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%s %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%t %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%u %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%v %%i%%j  
FOR /F "usebackq tokens=1-26 delims=, " %%i IN (INDEX.DAT) DO @move /y %%w %%i%%j  
:end

Daraus ergeben sich Ordner die so heißen:
9292##22#1234#
9222##23#1235#
9222##23#1236#

Die Tiffs werden auch ordentlich in den jeweiligen Ordnern abgelegt.

Soweit so gut. Leider habe ich eben festgestellt, dass das nur funktioniert wenn ich weniger als 26 Tiffs in einen Ordner habe, da FOR /F nur maximal 26 Variablen zulässt.

Fällt dir da eventuell noch was ein? Kann man das auch mit Powershell erledigen und vor dein Programm Tiff2PDF schalten?

Gruß und nochmals DANKE!
Repro-Rone
Member: micneu
micneu Nov 19, 2010 at 10:52:44 (UTC)
Goto Top
ja! sollte kein problem sein....
so noch ein paar fragen:
ist das "9292##22#1234#" wirklich ein verzeichnis name?

gruß michael
Member: UserXY
UserXY Nov 19, 2010 at 11:14:10 (UTC)
Goto Top
Genau:

Aus der INDEX.DAT:
9292##,22#1234#,300,00000001.TIF,00000002.TIF,00000003.TIF,00000004.TIF,00000005.TIF,00000006.TIF,00000007.TIF

wird der Ordnername "9292##22#1234#" erstellt und die in der Zeile folgenden Tiffs werden in den Ordner verschoben. Nur die 300 im String (gibt die dpi an und kann somit schwanken) ist nutzlos.

Wie der Ordner soll dan nachher auch die PDF heißen.


MFG
Repro-Rone
Member: micneu
micneu Nov 19, 2010 at 13:18:17 (UTC)
Goto Top
hat etwas gedauert... ist jetzt version 2.0 face-smile

hier mein powershell script:

#   **************************************************************
#   Tiff2PDF
#   bitte hier die benoetigte imageversion runterladen
#
#   http://www.imagemagick.org/script/binary-releases.php#windows
#   
#    einmal auf der powershell ausgeführt werden
#     "Set-ExecutionPolicy Unrestricted"  
#   **************************************************************
#    
#   **************************************************************
#   * Erstellt M.N. - POWERSHELL / Entwicklung   19.11.2010      *
#   * Version: 2.0 :)
#   **************************************************************

$QUELLE = "c:\Temp"  
$EXTENSION = "*.tif"  
$ZIEL = "C:\Temp"  
$FILE = "INDEX.DAT"  
### laufzeit auswertung start
#$start = Get-Date
#$ErrorActionPreference = 'stop'  
$ErrorActionPreference = 'SilentlyContinue'  
echo "programm gestartet"  

function pic_convert() {
    ### Verzeichnis namen speichern
    $VERZEICHNIS = Get-ChildItem $QUELLE -recurse  -filter * | ? { $_.PSisContainer -eq $true } | sort
    $VERZEICHNISZAHL = $VERZEICHNIS.Count
    echo "es sind $VERZEICHNISZAHL verzeichnisse die bearbeitet werden..."  
    ### verzeichnis namen der reihe nach abarbeiten
    foreach ($i in $VERZEICHNIS) {
        $VERZEICHNISZAHL = $VERZEICHNISZAHL-1
        if ($VERZEICHNISZAHL -eq 0) {
            "bearbeite verzeichnis: `t$i" }   
        Else {
            "bearbeite verzeichnis: `t$i, noch $VERZEICHNISZAHL verzeichnisse...." }  
        $i2 = $i.fullname
        convert "$i2\$EXTENSION" "$i2\$i.pdf"  
     }
     ### laufzeit auswertung stop
     $stop = Get-Date
     timepost
 }

function movefile_createdir() {
    $start = Get-Date
    $TEXT = Get-Content $QUELLE\$FILE
    #$TEXT1 = Import-Csv -UseCulture "," -InputObject $TEXT -Delimiter ","  
    $TEXT1 = ConvertFrom-Csv -InputObject $TEXT -Delimiter "," -header  
    foreach ( $i in $TEXT1 ) {
        $REG1 = $i -match '(\d{4}##)'  
        $TEXT3 = $matches
        $REG2 = $i -match '(\d{2}#\d{4}#)'  
        $TEXT4 = $matches
        echo "Ordnername: `t$TEXT3$TEXT4"  
        if (Test-Path $ZIEL\$TEXT3$TEXT4) {
            echo "Verzeichnis $ZIEL\$TEXT3$TEXT4 ist da" }  
        else {
            echo "Verzeichnis $ZIEL\$TEXT3$TEXT4 nicht da"  
            md "$ZIEL\$TEXT3$TEXT4" }  
        $rohtext = "$i"  
        $muster = '(\d{8}\.TIF)'  
        $regex = [regex]$muster
        foreach ($i1 in $regex.Matches($rohtext)) {
            echo "`tDatei: `t`t`t$i1"  
            Move-Item -path "$QUELLE\$i1" -destination "$ZIEL\$TEXT3$TEXT4\$i1"  
            }
       }
  }

#### laufzeit auswertung

function timepost() {
    $gelaufenezeit = ($stop - $start).TotalSeconds
    If ($gelaufenezeit -gt 60) {
        $gelaufenezeit = ($gelaufenezeit / 60)
        $MINSEK = "Min."}  
    Else {$MINSEK = "Sek."}  
    'Auftrag nach {0:0.00} {1} erledigt....' -f $gelaufenezeit, $MINSEK  
    }

movefile_createdir
pic_convert
bitte kurz melden ob es so geht... hatte es getestet aber kann ja sein das noch was fehlt.

gruß michael
Member: UserXY
UserXY Nov 19, 2010 at 17:38:40 (UTC)
Goto Top
Hallo Michael,

leider geht es nicht...

Es erscheint:
Verzeichnis D:Original ist da
es sind verzeichnisse die bearbeitet werde
bearbeite verzeichnis: , noch -1 verzeichn
Magick: unable to open image `*.tif': Inva
Magick: missing an image filename `.pdf' @
Auftrag nach Sek. erledigt....

In d:original liegen alle tifs und die INDEX.DAT.

in diesem Ordner "Original" sollten ja nun neue Ordner entstehen. Es passiert leider nichts...

MFG
Repro-Rone
Member: UserXY
UserXY Nov 19, 2010 at 18:16:10 (UTC)
Goto Top
Ich habe nun $ErrorActionPreference = 'stop' aktiviert und es erscheint:

Die Benennung "ConvertFrom-Csv" wurde nicht als Cmdlet, Funktion, ausführbares Programm oder Skriptdatei erkannt. Überprüfen Sie die Benennung, und versuchen Sie es erneut.  
Bei D:Tiff2PDF2.ps1:50 Zeichen:29
+     $TEXT1 = ConvertFrom-Csv  <<<< -InputObject $TEXT -Delimiter "," -header  

MFG
Repro-Rone
Member: UserXY
UserXY Nov 19, 2010 at 20:48:47 (UTC)
Goto Top
Habe eben gesehen das ich die PowerShell 1.0 draugespielt habe. Habe nun die neue 2.0 installiert.

Jetzt erhalte ich folgende Meldung:

ConvertFrom-Csv : Missing an argument for parameter 'Header'. Specify a parameter of type 'System.String' and try again.  
At D:OriginalTiff2PDF2.ps1:50 char:71
+     $TEXT1 = convertfrom-csv -InputObject $TEXT -Delimiter "," -header <<<<  
    + CategoryInfo          : InvalidArgument: (:) [ConvertFrom-Csv], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingArgument,Microsoft.PowerShell.Commands.ConvertFromCsvCommand


Wenn ich "-header" und die stoppfunktion rausnehme erstellt das Prgramm den ersten Ordner verschiebt alle Tiffs in den diesen Ordner.

programm gestartet
Ordnername:     1224##11#1234#
Verzeichnis d:|original|1224##11#1234# nicht da


    Directory: D:original


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        19.11.2010     22:19            1224##11#1234#
        Datei:                  00000001.TIF
        Datei:                  00000008.TIF
        Datei:                  00000002.TIF
        Datei:                  00000009.TIF
        Datei:                  00000003.TIF
        Datei:                  00000010.TIF
        Datei:                  00000004.TIF
        Datei:                  00000011.TIF
        Datei:                  00000005.TIF
        Datei:                  00000012.TIF
        Datei:                  00000006.TIF
        Datei:                  00000013.TIF
        Datei:                  00000007.TIF
        Datei:                  00000014.TIF
Ordnername:     1224##11#1234#
Verzeichnis d:|original|1224##11#1234#ist da
        Datei:                  00000001.TIF
        Datei:                  00000015.TIF
        Datei:                  00000002.TIF
        Datei:                  00000016.TIF
        Datei:                  00000003.TIF
        Datei:                  00000017.TIF
        Datei:                  00000004.TIF
        Datei:                  00000018.TIF
        Datei:                  00000005.TIF
        Datei:                  00000019.TIF
        Datei:                  00000006.TIF
        Datei:                  00000020.TIF
        Datei:                  00000007.TIF
        Datei:                  00000021.TIF
es sind  verzeichnisse die bearbeitet werden...
bearbeite verzeichnis:  1224##11#1234#, noch -1 verzeichnisse....

Wie gesagt, die erste Zeile sieht eigentlich so aus:
1224##11#1234#,300,00000001.TIF,00000002.TIF,00000003.TIF,00000004.TIF,00000005.TIF,00000006.TIF,00000007.TIF

MFG
Repro-Rone
Member: micneu
micneu Nov 20, 2010 at 09:48:42 (UTC)
Goto Top
du hast schon zeile 16 - 18 angepasst?

gruß michael
Member: UserXY
UserXY Nov 20, 2010 at 09:56:23 (UTC)
Goto Top
Hallo!

So sieht es bei mir aus...

16. $QUELLE = "d:|original"
17. $EXTENSION = "*.tif"
18. $ZIEL = "d:|original"

MFG
Repro-Rone
Member: micneu
micneu Nov 21, 2010 at 10:59:10 (UTC)
Goto Top
so, und wie sieht es aus, was macht deine powershell installation?
hat alles geklappt?

gruß michael
Member: micneu
micneu Nov 22, 2010 at 19:25:52 (UTC)
Goto Top
so ist endlich am laufen.... ich sollte nicht so kompliziert denken.

#   **************************************************************
#   Tiff2PDF
#   bitte hier die benoetigte imageversion runterladen
#
#   http://www.imagemagick.org/script/binary-releases.php#windows
#   
#    einmal auf der powershell ausgeführt werden
#     "Set-ExecutionPolicy Unrestricted"  
#   **************************************************************
#    
#   **************************************************************
#   * Erstellt M.N. - POWERSHELL / Entwicklung   22.11.2010      *
#   * Version: 2.0 :)
#   **************************************************************

$QUELLE = "C:\Temp"  
$EXTENSION = "*.tif"  
$ZIEL = "C:\Temp"  
$FILE = "INDEX.DAT"  
### laufzeit auswertung start
#$start = Get-Date
#$ErrorActionPreference = 'stop'  
$ErrorActionPreference = 'SilentlyContinue'  
$start = Get-Date
echo "programm gestartet"  

function pic_convert() {
    ### Verzeichnis namen speichern
    $VERZEICHNIS = Get-ChildItem $QUELLE -recurse  -filter * | ? { $_.PSisContainer -eq $true } | sort
    $VERZEICHNISZAHL = $VERZEICHNIS.Count
    echo "es sind $VERZEICHNISZAHL verzeichnisse die bearbeitet werden..."  
    ### verzeichnis namen der reihe nach abarbeiten
    foreach ($i in $VERZEICHNIS) {
        $VERZEICHNISZAHL = $VERZEICHNISZAHL-1
        if ($VERZEICHNISZAHL -eq 0) {
            "bearbeite verzeichnis: `t$i" }   
        Else {
            "bearbeite verzeichnis: `t$i, noch $VERZEICHNISZAHL verzeichnisse...." }  
        $i2 = $i.fullname
        convert "$i2\$EXTENSION" "$i2\$i.pdf"  
     }
     ### laufzeit auswertung stop
     $stop = Get-Date
     timepost
 }

function movefile_createdir() {
    $TEXT = Get-Content $QUELLE\$FILE
    foreach ( $i in $TEXT ) {
        $REG1 = $i -match '(\d{4}##)'  
        $TEXT3 = $matches
        $REG2 = $i -match '(\d{2}#\d{4}#)'  
        $TEXT4 = $matches
        echo "Ordnername: `t$TEXT3$TEXT4"  
        if (Test-Path $ZIEL\$TEXT3$TEXT4) {
            echo "Verzeichnis $ZIEL\$TEXT3$TEXT4 ist da" }  
        else {
            echo "Verzeichnis $ZIEL\$TEXT3$TEXT4 nicht da"  
            md "$ZIEL\$TEXT3$TEXT4" }  
        $rohtext = "$i"  
        $muster = '(\d{8}\.TIF)'  
        $regex = [regex]$muster        
        foreach ($i1 in $regex.Matches($rohtext)) {
            echo "`tDatei: `t`t`t$i1"  
            Move-Item -path "$QUELLE\$i1" -destination "$ZIEL\$TEXT3$TEXT4\$i1"  
            }
       }
  }
#### laufzeit auswertung

function timepost() {
    $gelaufenezeit = ($stop - $start).TotalSeconds
    If ($gelaufenezeit -gt 60) {
        $gelaufenezeit = ($gelaufenezeit / 60)
        $MINSEK = "Min."}  
    Else {$MINSEK = "Sek."}  
    'Auftrag nach {0:0.00} {1} erledigt....' -f $gelaufenezeit, $MINSEK  
    }

movefile_createdir
pic_convert

gruß michael