web-dev-qa-db-pt.com

Converter PDF para imagem com alta resolução

Estou tentando usar o programa de linha de comando convert para obter um PDF em uma imagem (JPEG ou PNG). Aqui está um dos PDFs que estou tentando converter. 

Eu quero que o programa corte o excesso de espaço em branco e retorne uma imagem de qualidade suficientemente alta para que os sobrescritos possam ser lidos com facilidade.

Esta é minha atual melhor tentativa . Como você pode ver, o corte funciona bem, eu só preciso aguçar um pouco a resolução. Este é o comando que estou usando: 

convert -trim 24.pdf -resize 500% -quality 100 -sharpen 0x1.0 24-11.jpg

Eu tentei tomar as seguintes decisões conscientes:

  • redimensione-o maior (não tem efeito na resolução)
  • tornar a qualidade o mais alta possível
  • use o -sharpen (tentei um intervalo de valores)

Qualquer sugestão, por favor, para obter a resolução da imagem no final PNG/JPEG maior seria muito apreciada!

265
JBWhitmore

Parece que os seguintes trabalhos: 

convert           \
   -verbose       \
   -density 150   \
   -trim          \
    test.pdf      \
   -quality 100   \
   -flatten       \
   -sharpen 0x1.0 \
    24-18.jpg

Isso resulta em a imagem esquerda . Compare isso com o resultado do meu comando original ( a imagem à direita ):

(Para realmente ver e apreciar as diferenças entre os dois, clique com o botão direito em cada um deles e selecione "Abrir Imagem em Nova Aba ...".)

Além disso, tenha em mente os seguintes fatos:

  • A pior imagem embaçada à direita tem um tamanho de arquivo de 1.941.702 Bytes (1,85 MByte). Sua resolução é 3060x3960 pixels, usando espaço de cor RGB de 16 bits.
  • A imagem melhor e nítida à esquerda tem um tamanho de arquivo de 337,879 Bytes (330 kByte). Sua resolução é de 758x996 pixels, usando o espaço de cor cinza de 8 bits.

Portanto, não há necessidade de redimensionar; adicione o sinalizador -density. O valor de densidade 150 é estranho - tentar um intervalo de valores resulta em uma imagem com aparência pior em ambas as direções!

339
JBWhitmore

Pessoalmente eu gosto disso.

convert -density 300 -trim test.pdf -quality 100 test.jpg

É um pouco mais que o dobro do tamanho do arquivo, mas parece melhor para mim.

-density 300 define o dpi em que o PDF é renderizado.

-trim remove qualquer Edge Pixel da mesma cor que os pixels do canto.

-quality 100 define a qualidade de compressão JPEG para a mais alta qualidade.

Coisas como -sharpen não funcionam bem com texto porque desfazem as coisas que seu sistema de renderização de fonte fez para torná-lo mais legível.

Se você realmente quiser explodir, use o redimensionamento aqui e, possivelmente, um valor de dpi maior de algo como targetDPI * scalingFactor Isso renderizará o PDF na resolução/tamanho desejado.

Descrições dos parâmetros no imagemagick.org são aqui

126
majinnaibu

Eu uso pdftoppm na linha de comando para obter a imagem inicial, normalmente com uma resolução de 300dpi, então pdftoppm -r 300, então use convert para fazer a conversão de corte e PNG.

15
Norman Ramsey

Eu descobri que é mais rápido e mais estável quando o processamento em lote de grandes PDFs em PNGs e JPGs usa o comando subjacente gs (também conhecido como Ghostscript) que convert usa.

Você pode ver o comando na saída de convert -verbose e há mais alguns ajustes possíveis (YMMV) que são difíceis/impossíveis de acessar diretamente via convert.

No entanto, seria mais difícil fazer o corte e a nitidez usando gs, então, como eu disse, YMMV!

13
Coder

normalmente eu extraio a imagem incorporada com 'pdfimages' na resolução nativa, então uso o convertido da ImageMagick para o formato necessário:

$ pdfimages -list fileName.pdf
$ pdfimages fileName.pdf fileName   # save in .ppm format
$ convert fileName-000.ppm fileName-000.png

isso gera o melhor e menor arquivo de resultado.

Nota: Para imagens com JPG com perdas, você tinha que usar -j:

$ pdfimages -j fileName.pdf fileName   # save in .jpg format

Com o recente poppler você pode usar -todos que salvam com perdas como jpg e sem perdas como png

Na pequena plataforma Win você teve que baixar um binário recente (0.37 2015) 'poppler-util' de: http://blog.alivate.com.au/poppler-windows/

12
Valerio

Também lhe dá bons resultados:

exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");
8
Preet Sandhu

Mais uma sugestão é que você pode usar o GIMP. 

Basta carregar o arquivo PDF no GIMP-> salvar como .xcf e, em seguida, você pode fazer o que quiser com a imagem.

2
Armin Mustafa

Usuário Linux aqui: Eu tentei o utilitário de linha de comando convert (para PDF para PNG) e não fiquei feliz com os resultados. Achei isso mais fácil, com um resultado melhor:

  • extrair a (s) página (s) em pdf com pdftk
    • por exemplo: pdftk file.pdf cat 3 output page3.pdf
  • abra (importe) esse pdf com GIMP
    • importante: altere a importação Resolution de 100 para 300 ou 600 pixel/in
  • em GIMP export como PNG (altere a extensão do arquivo para .png)

Edit:

Imagem adicionada, conforme solicitado no Comments. Comando Convert usado:

convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png

GIMP: importado a 300 dpi (px/in); exportado como nível 3 de compactação PNG.

Eu não usei o GIMP na linha de comando (re: meu comentário, abaixo).

pdf2png

enter image description here

2
Victoria Stuart

O seguinte script python funcionará em qualquer Mac (Snow Leopard e para cima). Ele pode ser usado na linha de comando com arquivos sucessivos PDF como argumentos, ou você pode colocar em uma ação Executar Script de Shell no Automator e fazer um Serviço (Ação Rápida no Mojave).

Você pode definir a resolução da imagem de saída no script.

O script e a Quick Action podem ser baixados do github.

#!/usr/bin/python
# coding: utf-8

import os, sys
import Quartz as Quartz
from LaunchServices import (kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG, kCFAllocatorDefault) 

resolution = 300.0 #dpi
scale = resolution/72.0

cs = Quartz.CGColorSpaceCreateWithName(Quartz.kCGColorSpaceSRGB)
whiteColor = Quartz.CGColorCreate(cs, (1, 1, 1, 1))
# Options: kCGImageAlphaNoneSkipLast (no trans), kCGImageAlphaPremultipliedLast 
transparency = Quartz.kCGImageAlphaNoneSkipLast

#Save image to file
def writeImage (image, url, type, options):
    destination = Quartz.CGImageDestinationCreateWithURL(url, type, 1, None)
    Quartz.CGImageDestinationAddImage(destination, image, options)
    Quartz.CGImageDestinationFinalize(destination)
    return

def getFilename(filepath):
    i=0
    newName = filepath
    while os.path.exists(newName):
        i += 1
        newName = filepath + " %02d"%i
    return newName

if __== '__main__':

    for filename in sys.argv[1:]:
        pdf = Quartz.CGPDFDocumentCreateWithProvider(Quartz.CGDataProviderCreateWithFilename(filename))
        numPages = Quartz.CGPDFDocumentGetNumberOfPages(pdf)
        shortName = os.path.splitext(filename)[0]
        prefix = os.path.splitext(os.path.basename(filename))[0]
        folderName = getFilename(shortName)
        try:
            os.mkdir(folderName)
        except:
            print "Can't create directory '%s'"%(folderName)
            sys.exit()

        # For each page, create a file
        for i in range (1, numPages+1):
            page = Quartz.CGPDFDocumentGetPage(pdf, i)
            if page:
        #Get mediabox
                mediaBox = Quartz.CGPDFPageGetBoxRect(page, Quartz.kCGPDFMediaBox)
                x = Quartz.CGRectGetWidth(mediaBox)
                y = Quartz.CGRectGetHeight(mediaBox)
                x *= scale
                y *= scale
                r = Quartz.CGRectMake(0,0,x, y)
        # Create a Bitmap Context, draw a white background and add the PDF
                writeContext = Quartz.CGBitmapContextCreate(None, int(x), int(y), 8, 0, cs, transparency)
                Quartz.CGContextSaveGState (writeContext)
                Quartz.CGContextScaleCTM(writeContext, scale,scale)
                Quartz.CGContextSetFillColorWithColor(writeContext, whiteColor)
                Quartz.CGContextFillRect(writeContext, r)
                Quartz.CGContextDrawPDFPage(writeContext, page)
                Quartz.CGContextRestoreGState(writeContext)
        # Convert to an "Image"
                image = Quartz.CGBitmapContextCreateImage(writeContext) 
        # Create unique filename per page
                outFile = folderName +"/" + prefix + " %03d.png"%i
                url = Quartz.CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, outFile, len(outFile), False)
        # kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG
                type = kUTTypePNG
        # See the full range of image properties on Apple's developer pages.
                options = {
                    Quartz.kCGImagePropertyDPIHeight: resolution,
                    Quartz.kCGImagePropertyDPIWidth: resolution
                    }
                writeImage (image, url, type, options)
                del page
0
benwiggy

No ImageMagick, você pode fazer "supersampling". Você especifica uma densidade grande e redimensiona para baixo o tamanho desejado para o tamanho final de saída. Por exemplo, com sua imagem:

convert -density 600 test.pdf -background white -flatten -resize 25% test.png


 enter image description here 

Baixe a imagem para ver em resolução máxima para comparação ..

Eu não recomendo salvar em JPG se você estiver esperando fazer mais processamento.

Se você quiser que a saída tenha o mesmo tamanho da entrada, redimensione para o inverso da proporção de sua densidade para 72. Por exemplo, -densidade 288 e -resize 25%. 288 = 4 * 72 e 25% = 1/4

Quanto maior a densidade, melhor a qualidade resultante, mas levará mais tempo para ser processada.

0
fmw42

O arquivo PNG que você anexou parece realmente desfocado. Caso você precise usar pós-processamento adicional para cada imagem gerada como PDF, você diminuirá o desempenho de sua solução.

2JPEG pode converter o arquivo PDF que você anexou a um JPG de nitidez agradável e cortar margens vazias em uma chamada:

2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop
0
Mikhael

É realmente muito fácil de fazer com o Preview em um mac. Tudo o que você precisa fazer é abrir o arquivo em Preview e salvar-as (ou exportar) um png ou jpeg, mas certifique-se de usar pelo menos 300 dpi na parte inferior da janela para obter uma imagem de alta qualidade.

0
Jeff White