Powershell Tiff için yeni dosyaları dönüştürme


1

Yeni eklenen dosyalar için bir klasöre bakan, birlikte frankensteined bir powershell betiği var, daha sonra bu dosyaları ghostscript kullanılarak bir .tif dönüştürülen bir başka klasöre taşır. Bundan sonra tüm .pdf'ler bir PDF klasörüne taşınır ve tüm tiff'ler bir TIF klasörüne taşınır. Tamamlandığında, bir txt dosyasına bir günlük girişi yapar. İçe Aktarma klasörüne bırakılan tüm yeni dosyalar bu komut dosyasını yeniden çalıştırılmasını tetikler.

Yaşadığım sorunlar:

  1. Dönüştürülen Tiff'lerin dosya adının önünde "TIF" var, bunu istemiyorum, yalnızca oluşturulduğu pdf ile aynı adda.
  2. İkinci bir dosya dönüştürüldüğünde, dönüştürülen son dosyanın bir kopyasını oluşturur ve onu kök klasöre yapıştırır. Neden böyle emin değilim. Ancak TIF'in sadece bir kopyasını istiyorum ve TIF klasörüne konulmasını istiyorum.

Birisi bana yanlış yaptığımı söylesin!

Kod:

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
   $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "C:\Folder\Import"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $false
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { 

    $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "C:\Folder\log.txt" -value $logline

                    #Path to your Ghostscript EXE
                $tool = 'C:\Program Files\gs\gs9.26\bin\gswin64c.exe'
                    #Directory containing the PDF files that will be converted
                $inputDir       = 'C:\Folder\'
                    #.pdf Files
                $pdfDir         = 'C:\Folder\*.pdf'
                    #.tif Files
                $tifDir         = 'C:\Folder\*.tif'
                    #Directory catchall for all incoming files.
                $dumpDir        = 'C:\Folder\Import\*.*'
                    #Output path where converted PDF files will be stored
                $pdfOutputDir   = 'C:\Folder\PDF'
                    #Output path where the TIF files will be saved
                $tifOutputDir   = 'C:\Folder\TIF'

Get-ChildItem -Path $dumpDir -Recurse -File | Move-Item -Destination $inputDir
$pdfs = get-childitem $inputDir -recurse | where {$_.Extension -match "pdf"}

foreach($pdf in $pdfs)
{
    $tif = $tifOutputDir + $pdf.BaseName + ".tif"
    if(test-path $tif)
    {
        "tif file already exists " + $tif
    }
    else        
    {   
        'Processing ' + $pdf.Name        
        $param = "-sOutputFile=$tif"
        & $tool -q -dNOPAUSE -sDEVICE=tiffg4 $param -r300 $pdf.FullName -c quit
    }
Get-ChildItem -Path $pdfDir -Recurse -File | Move-Item -Destination $pdfOutputDir
Get-ChildItem -Path $tifDir -Recurse -File | Move-Item -Destination $tifOutputDir   
}

              }    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
    while ($true) {sleep 5}

Lütfen cevabınızı sorunuza göre düzenlemeyin. Süper kullanıcı bir soru ve cevap sitesidir ve cevaplar sorulardan ayrı olmalıdır. Yapabilirsin kendi soruna cevap ver yerine.
DavidPostill

Yanıtlar:


1

Soru / cevap düzenleme için özür dilerim.

İşte çalışan senaryo. Oldukça az değişiklik var ama ihtiyaç duyduğu şeyi yapıyor. Orta gelişme .pdf'den .tiff'e .txt'den .jpg'ye geçmem istendi. İşlem hala oldukça iyi çalışıyor, sadece istenen çıktı türünü elde etmek için Ghost script bölümünü değiştirmeniz gerekiyor.

Diğer konulardan pek çok yardım almak, bu yazının oldukça bir kısmı farklı insanlardan oluşan bir bolluktan Frankensteined oldu.

Gerekli bileşenler:

  1. Güç kalkanı
  2. CutePDF Yazar
  3. GhostScript

Bu betiğin ne yaptığını çalıştırın:

  1. Klasörü tarar ve dosyaları günlüğe kaydeder
  2. .Txt dosyalarını işlenmek üzere kök klasörüne taşır
  3. CutePDF Writer kullanarak .txt dosyalarını .pdf dosyasına yazdırır
  4. Ghostscript'i kullanarak .pdf dosyalarını .jpg dosyasına dönüştürür
  5. .Pdf, .jpg ve .txt dosyalarını ayrı klasörlere taşır
  6. Tümünü siler .pdf
  7. "İşleme" klasöründe değişiklik taramasını başlatır, değişiklik bulunursa değişiklik komut dosyasını tekrar çalıştırır.

Bunu bir .exe aracına dönüştürdüm ve NSSM'yi her zaman çalışacak bir hizmet olarak ayarlamak için kullandım.

$freshStart = 0
$PrintPageHandler ={
param([object]$sender, [System.Drawing.Printing.PrintPageEventArgs]$ev)

$linesPerPage = 0
$yPos = 0
$count = 0
$leftMargin = $ev.MarginBounds.Left
$topMargin = $ev.MarginBounds.Top
$line = $null

$printFont = New-Object System.Drawing.Font "Arial", 10

# Calculate the number of lines per page.
$linesPerPage = $ev.MarginBounds.Height / $printFont.GetHeight($ev.Graphics)

# Print each line of the file.
while ($count -lt $linesPerPage -and (($line = $streamToPrint.ReadLine()) -ne $null))
{
$yPos = $topMargin + ($count * $printFont.GetHeight($ev.Graphics))
$ev.Graphics.DrawString($line, $printFont, [System.Drawing.Brushes]::Black, $leftMargin, $yPos, (New-Object System.Drawing.StringFormat))
$count++
}

# If more lines exist, print another page.
if ($line -ne $null) 
{
$ev.HasMorePages = $true
}
else
{
$ev.HasMorePages = $false
}
}
While ($freshStart -eq 0)
{
$prossDir        = 'C:\FINAL\PROCESSING\'
$files = get-childitem -Path $prossDir | where {$_.Extension -match "txt"}
foreach($file in $files)
{
$path = "C:\FINAL\PROCESSING\$file"
$logline = "$(Get-Date), BackLog, FINAL, $path"
Add-content "C:\LOG\log.txt" -value $logline
}
#Path to your Ghostscript EXE
$tool = 'C:\Program Files\gs\gs9.26\bin\gswin64c.exe'
#Directory containing the PDF files that will be converted
$inputDir       = 'C:\FINAL\'
#.pdf Files
$pdfDir         = 'C:\FINAL\*.pdf'
#.jpg Files
$jpgDir         = 'C:\FINAL\*.jpg'
#.txt Files
$txtDir         = 'C:\FINAL\*.txt'
#Directory that deletes all old pdfs
$deleteME       = 'C:\FINAL\DELETE\*.pdf'
#Directory catchall for all incoming files.
$dumpDir        = 'C:\FINAL\PROCESSING\*.*'
#Output path where converted PDF files will be stored
$pdfOutputDir   = 'C:\FINAL\DELETE'
#Output path where the JPG files will be saved
$jpgOutputDir   = 'C:\FINAL\Folder2'
#Output path where the TXT files will be saved
$txtOutputDir   = 'C:\FINAL\Folder1'

Get-ChildItem -Path $dumpDir -File | Move-Item -Destination $inputDir


function Out-Pdf
{
param($InputDocument, $OutputFolder)

Add-Type -AssemblyName System.Drawing

$doc = New-Object System.Drawing.Printing.PrintDocument
$doc.DocumentName = $InputDocument.FullName
$doc.PrinterSettings = New-Object System.Drawing.Printing.PrinterSettings
$doc.PrinterSettings.PrinterName = 'CutePDF Writer'
$doc.PrinterSettings.PrintToFile = $true

$streamToPrint = New-Object System.IO.StreamReader $InputDocument.FullName

$doc.add_PrintPage($PrintPageHandler)

$doc.PrinterSettings.PrintFileName = "$($InputDocument.DirectoryName)\$($InputDocument.BaseName).pdf"
$doc.Print()

$streamToPrint.Close()
}

Get-Childitem -Path "C:\FINAL" -File -Filter "*.txt" |
ForEach-Object { Out-Pdf $_ $_.Directory }


$pdfs = get-childitem $inputDir | where {$_.Extension -match "pdf"}

foreach($pdf in $pdfs)
{
$jpg = $inputDir + $pdf.BaseName + ".jpg"
$cJpg = $inputDir + $pdf.BaseName + "_" + "%03d" + ".jpg"
if(test-path $jpg)
{
"jpg file already exists " + $jpg
}
else        
{   
'Processing ' + $pdf.Name        
$param = "-sOutputFile=$cJpg"
& $tool -q -dNOPAUSE -sDEVICE=jpeg $param -r300 $pdf.FullName -c quit
}  
}
Get-ChildItem -Path $pdfDir -Recurse -File | Move-Item -Destination $pdfOutputDir
Get-ChildItem -Path $jpgDir -Recurse -File | Move-Item -Destination $jpgOutputDir
Get-ChildItem -Path $txtDir -Recurse -File | Move-Item -Destination $txtOutputDir
Remove-Item -Path $deleteME

$freshStart = 1
}


### SET Folder TO WATCH + FILES TO WATCH + SubFolder YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\FINAL\PROCESSING"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
$action = 
{
$path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, FINAL, $path"
Add-content "C:\LOG\log.txt" -value $logline
#Path to your Ghostscript EXE
$tool = 'C:\Program Files\gs\gs9.26\bin\gswin64c.exe'
#Directory containing the PDF files that will be converted
$inputDir       = 'C:\FINAL\'
#.pdf Files
$pdfDir         = 'C:\FINAL\*.pdf'
#.jpg Files
$jpgDir         = 'C:\FINAL\*.jpg'
#.txt Files
$txtDir         = 'C:\FINAL\*.txt'
#Directory that deletes all old pdfs
$deleteME       = 'C:\FINAL\DELETE\*.pdf'
#Directory catchall for all incoming files.
$dumpDir        = 'C:\FINAL\PROCESSING\*.*'
#Output path where converted PDF files will be stored
$pdfOutputDir   = 'C:\FINAL\DELETE'
#Output path where the JPG files will be saved
$jpgOutputDir   = 'C:\FINAL\Folder2'
#Output path where the TXT files will be saved
$txtOutputDir   = 'C:\FINAL\Folder1'

Get-ChildItem -Path $dumpDir -File | Move-Item -Destination $inputDir

$PrintPageHandler ={
param([object]$sender, [System.Drawing.Printing.PrintPageEventArgs]$ev)

$linesPerPage = 0
$yPos = 0
$count = 0
$leftMargin = $ev.MarginBounds.Left
$topMargin = $ev.MarginBounds.Top
$line = $null

$printFont = New-Object System.Drawing.Font "Arial", 10

# Calculate the number of lines per page.
$linesPerPage = $ev.MarginBounds.Height / $printFont.GetHeight($ev.Graphics)

# Print each line of the file.
while ($count -lt $linesPerPage -and (($line = $streamToPrint.ReadLine()) -ne $null))
{
$yPos = $topMargin + ($count * $printFont.GetHeight($ev.Graphics))
$ev.Graphics.DrawString($line, $printFont, [System.Drawing.Brushes]::Black, $leftMargin, $yPos, (New-Object System.Drawing.StringFormat))
$count++
}

# If more lines exist, print another page.
if ($line -ne $null) 
{
$ev.HasMorePages = $true
}
else
{
$ev.HasMorePages = $false
}
}
function Out-Pdf
{
param($InputDocument, $OutputFolder)

Add-Type -AssemblyName System.Drawing

$doc = New-Object System.Drawing.Printing.PrintDocument
$doc.DocumentName = $InputDocument.FullName
$doc.PrinterSettings = New-Object System.Drawing.Printing.PrinterSettings
$doc.PrinterSettings.PrinterName = 'CutePDF Writer'
$doc.PrinterSettings.PrintToFile = $true

$streamToPrint = New-Object System.IO.StreamReader $InputDocument.FullName

$doc.add_PrintPage($PrintPageHandler)

$doc.PrinterSettings.PrintFileName = "$($InputDocument.DirectoryName)\$($InputDocument.BaseName).pdf"
$doc.Print()

$streamToPrint.Close()
}

Get-Childitem -Path "C:\FINAL" -File -Filter "*.txt" |
ForEach-Object { Out-Pdf $_ $_.Directory }


$pdfs = get-childitem $inputDir | where {$_.Extension -match "pdf"}

foreach($pdf in $pdfs)
{
$jpg = $inputDir + $pdf.BaseName + ".jpg"
$cJpg = $inputDir + $pdf.BaseName + "_" + "%03d" + ".jpg"
if(test-path $jpg)
{
"jpg file already exists " + $jpg
}
else        
{   
'Processing ' + $pdf.Name        
$param = "-sOutputFile=$cJpg"
& $tool -q -dNOPAUSE -sDEVICE=jpeg $param -r300 $pdf.FullName -c quit
}  
}
Get-ChildItem -Path $pdfDir -Recurse -File | Move-Item -Destination $pdfOutputDir
Get-ChildItem -Path $jpgDir -Recurse -File | Move-Item -Destination $jpgOutputDir
Get-ChildItem -Path $txtDir -Recurse -File | Move-Item -Destination $txtOutputDir
Remove-Item -Path $deleteME
}    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
Register-ObjectEvent $watcher "Created" -Action $action
while ($true) {sleep 5}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.