A melhor maneira de limpar um PDF sem aumentar o tamanho do arquivo massivamente

2

Eu digitalizo um monte de anotações em A4 que escrevo, mas muitas das minhas antigas têm furos básicos nelas. Algumas dessas verificações também têm pequenas imperfeições, como um pequeno ponto (sujeira) nelas, o que realmente me incomoda quando leio esses PDFs.

Eu tentei me livrar de furos de grampo por meio da redação, já que os furos de grampo estão sempre na mesma área e posso aplicar a mesma redação em várias páginas. No entanto, isso tem o infeliz resultado de aumentar o tamanho do arquivo PDF em 7 vezes!

Da mesma forma, quando tento remover manchas de sujeira manualmente editando a página do PDF na pintura, o tamanho dos arquivos também aumenta drasticamente em cerca de 2 MB por página editada.

Existe uma maneira melhor de fazer o que eu estou fazendo?

Aqui é um exemplo de uma página de tal PDF. Nesta página eu gostaria de remover algumas das manchas de sujeira na página atual, os furos de grampos no canto superior esquerdo, os orifícios perfurados no lado esquerdo e a barra preta no canto superior direito.

    
por Irregular User 06.03.2016 / 23:26

1 resposta

1

CleanPDF (9 MB)

Criei um pequeno script do PowerShell chamado CleanPDF para remover em lote determinadas áreas de páginas PDF. Nenhum programa adicional precisa ser instalado. É uma solução portátil

O usuário deve configurar uma imagem de máscara adequada para informar ao programa quais áreas devem ser removidas. Use o Paint.net, o Gimp, o Photoshop ou o que você tiver para editar o mask.png e preservar a transparência

Script do 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 }
}

Ferramentas e técnicas usadas

O script usa as seguintes ferramentas de terceiros para lidar com tarefas diferentes

  • pdfimages.exe (fornecido no projeto Xpdf ) para extrair todo o PDF páginas como imagens separadas. Mas por que usar pdfimages quando o imagemagick também é capaz de converter arquivos PDF em imagens? A vantagem do pdfimages é que não precisamos instalar o GhostScript

    pdfimages.exe -j C:\inputfile.pdf C:\outputfolder  
    
  • composite.exe (fornecido no projeto imagemagick ) para mascarar certas áreas predefinidas

    composite.exe -compose dst-out C:\mask.png C:\input1.jpg -matte C:\output2.png 
    
  • convert.exe (fornecido no projeto imagemagick ) para converter áreas transparentes em áreas brancas. E para combinar todas as imagens processadas de volta para um único PDF

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

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

Como usar

  1. Faça o download do este arquivo .zip e extraia-o para uma pasta de sua escolha. Você pode ignorar o aviso O site a seguir contém programas prejudiciais da Navegação segura do Google

    O arquivo .zip contém todos os arquivos necessários para que você não precise baixar o pacote imagemagick (155 MB) ou o pacote Xpdf (11 MB)

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

  2. Abra sua pasta sendto ( Win + R »shell: sendto) e crie um novo atalho. Nomeie-o como CleanPDF e insira como local de destino o caminho a seguir, mas altere D:\dir para sua própria pasta onde você extraiu os arquivos para

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file "D:\dir\cleanPDF.ps1"
    
  3. Abra mask.png e altere-o de acordo com suas necessidades. Todas as regiões não transparentes marcam as áreas que serão removidas (mascaradas). A transparência deve ser preservada

  4. Clique com o botão direito do mouse em qualquer PDF e escolha Enviar para »CleanPDF . Um novo PDF será criado no mesmo local

OsOPs amostra . Observe quais partes estão agora removidas:

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

    
por 14.03.2016 / 00:06