2

Я сканирую много записок формата А4, которые я записываю, но у многих моих старых есть отверстия для скоб. Некоторые из этих сканов также имеют небольшие дефекты, такие как маленькая точка (грязь) на них, что действительно беспокоит меня, когда я читаю эти PDF-файлы.

Я пытался избавиться от отверстий для скрепок путем редактирования, так как отверстия для скрепок всегда находятся в одной и той же области, и я могу просто применить одно и то же редактирование к нескольким страницам. Однако это приводит к печальному результату увеличения размера файла PDF в 7 раз!

Точно так же, когда я пытаюсь удалить пятна грязи вручную, редактируя страницу PDF в рисовании, размер файлов также резко увеличивается примерно до 2 МБ на редактируемую страницу.

Есть ли лучший способ рассказать о том, что я делаю?

Вот пример страницы такого PDF. На этой странице я хотел бы удалить некоторые грязные пятна на текущей странице, отверстия для скоб в левом верхнем углу, отверстия для пробитых отверстий слева и черную полосу в верхнем правом углу.

1 ответ1

1

CleanPDF (9 МБ)

Я собрал небольшой скрипт PowerShell под названием CleanPDF для пакетного удаления определенных областей со страниц PDF. Никаких дополнительных программ не нужно устанавливать. Это портативное решение

Пользователь должен установить правильное изображение маски, чтобы сообщить программе, какие области должны быть удалены. Используйте Paint.net, Gimp, Photoshop или все, что вам нужно, чтобы отредактировать mask.png и сохранить прозрачность


Скрипт PowerShell

# user variables
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
$pdfimages = "$scriptDir\pdfimages.exe"
$convert   = "$scriptDir\convert.exe"
$composite = "$scriptDir\composite.exe"
$mask      = "$scriptDir\mask.png"
$temp      = "$enc:temp\cleanPDF"

# function to remove certain areas from each PDF site according to mask.png
function cleanPDF($file){

    # check if temp folder exists. Maybe from a previous run. If yes, delete it
    if (Test-Path $temp){ Remove-Item $temp -Force -Recurse}

    # Create a new temp folder which is always empty
    New-Item $temp -ItemType Dir | Out-Null

    # Extract one JPG per PDF site and save them in temp folder
    & $pdfimages '-j' $file.FullName "$temp\image"

    # Iterate through each new image and process them
    Get-ChildItem "$temp\image-*.jpg" | foreach { 

        # Remove unwanted areas from current JPG with the help of mask.png. Convert JPG to PNG to preserve transparency
        & $composite -compose dst-out "$mask" $_.Fullname -matte "$temp\$($_.BaseName)_result.png"

        # Convert PNG back to JPG so we can replace transparent with white areas. Without this JPG>PNG>JPG trick they would be black
        & $convert "$temp\$($_.BaseName)_result.png" -background white -alpha remove "$temp\$($_.BaseName)_result.jpg"
    }       

    # combine all images back to a single pdf and append "_result" to the file name
    & $convert "$temp\image*_result.jpg" "$($file.Directory)/$($file.BaseName)_result.pdf"

    # Remove temp folder and work images
    Remove-Item $temp -Force -Recurse
}

# Iterate through each passed commandline argument
ForEach ($path in $args){

    # Get path as Powershell item
    $file = Get-Item $path

    # If file extension is .pdf, start CleanPDF function for this pdf
    If ($file.Extension.ToLower() -eq '.pdf') { cleanPDF $file }
}

Используемые инструменты и методы

Скрипт использует следующие сторонние инструменты для решения различных задач.

  • pdfimages.exe (предоставляется в рамках проекта Xpdf) для извлечения всех страниц PDF в виде отдельных изображений. Но зачем использовать pdfimages, когда imagemagick также способен конвертировать PDF файлы в изображения? Преимущество pdfimages в том, что нам не нужно устанавливать GhostScript

    pdfimages.exe -j C:\inputfile.pdf C:\outputfolder  
    
  • Composite.exe (предоставляется в рамках проекта imagemagick) для маскировки определенных предопределенных областей

    composite.exe -compose dst-out C:\mask.png C:\input1.jpg -matte C:\output2.png 
    
  • convert.exe (предоставляется в рамках проекта imagemagick) для преобразования прозрачных областей в белые области. И объединить все обработанные изображения обратно в один PDF

    convert.exe C:\input2.png -background white -alpha remove C:\output3.jpg
    

    convert.exe C:\input*.jpg C:\output.pdf
    

Как пользоваться

  1. Загрузите этот ZIP-файл и распакуйте его в папку по вашему выбору. Вы можете проигнорировать предупреждение . Впереди сайт содержит вредоносные программы из безопасного просмотра Google.

    Файл .zip содержит все необходимые файлы, поэтому вам не нужно загружать пакет imagemagick (155 МБ) или пакет Xpdf (11 МБ)

    cleanPDF.ps1
    convert.exe
    composite.exe
    pdfimages.exe
    mask.png sample.pdf

  2. Откройте папку sendto (оболочка Win+R :sendto) и создайте новый ярлык. Назовите его CleanPDF и введите в качестве целевого местоположения следующий путь, но измените D:\dir на вашу собственную папку, куда вы распаковали файлы

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file "D:\dir\cleanPDF.ps1"
    
  3. Откройте mask.png и измените его в соответствии со своими потребностями. Все непрозрачные области отмечают области, которые будут удалены (замаскированы). Прозрачность должна быть сохранена

  4. Щелкните правой кнопкой мыши любой PDF-файл и выберите « Отправить» CleanPDF. Новый PDF будет создан в том же месте


Образец ОП. Обратите внимание, какие части теперь удалены:

sample.pdf (1,35 MB)                sample_result.pdf (1,46 MB)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .