Converta PDF para imagem com alta resolução

328

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

Quero que o programa reduza o excesso de espaço em branco e retorne uma imagem de qualidade alta o suficiente para que os sobrescritos possam ser lidos com facilidade.

Esta é a minha melhor tentativa atual . Como você pode ver, o corte funciona bem, só preciso aprimorar a resolução um pouco. 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:

  • redimensioná-lo maior (não afeta a resolução)
  • faça a qualidade o mais alta possível
  • use o -sharpen(eu tentei um intervalo de valores)

Todas as sugestões sobre como obter a resolução da imagem no PNG / JPEG final mais alto serão muito apreciadas!

JBWhitmore
fonte
Eu não sei, você também pode tentar ligação ...
karnok
1
Veja também: askubuntu.com/a/50180/64957
Dave Jarvis
Se você estiver em um Mac, ter um olhar para a página do homem para sips, o "sistema de processamento de imagem programável". É um editor de imagens de linha de comando incorporado ao macOS, funciona em PDFs e em muitos outros tipos de imagens.
ghoti
Os @ghoti sips converterão apenas a primeira página de um arquivo PDF em uma imagem.
benwiggy

Respostas:

386

Parece que o seguinte funciona:

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

Isso resulta na 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 do mouse em cada um e selecione "Abrir imagem em nova guia ..." .)

Lembre-se também dos seguintes fatos:

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

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

JBWhitmore
fonte
77
O densityparâmetro é um pouco especial, pois deve vir antes do arquivo de entrada. Como o PDF é um formato de arquivo baseado em vetor que não tem (muito) noção de pixels, ele diz algo como "a página é 8 por 12 polegadas". Se você deseja pixel, use a densityconfiguração para informar quantos pixels por polegada deseja obter na saída. Por exemplo. com 150, você obteria 8x150 = 1200 por 12x150 = 1800 pixels na imagem resultante. Essa também é a quantidade de pixels nas quais as configurações de nitidez, contraste, compactação etc.
Daniel Schneller
8
Isso pode resultar em fundo preto no Mac OS (consulte stackoverflow.com/questions/10934456/… ). Para corrigir isso, adicione -flatten.
Rolf
2
Eu tenho um fundo preto no Mac OS quando tentei converter pdf para png, adicionando -flatten o resolvi.
olala
4
Uau! Apenas usei a opção -densitye -flattenpara reduzir o tamanho de um pdf (para outro pdf). A -flattenopção realmente ajuda muito na redução do tamanho total. No meu caso, sem distúrbios visuais.
parvus
2
O -densitysinalizador provavelmente dará resultados piores em valores mais altos se a qualidade da imagem inicial for inferior a isso.
parvus
153

Pessoalmente, eu gosto disso.

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

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

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

-trim remove os pixels de borda que são da mesma cor que os pixels de canto.

-quality 100 define a qualidade da compactação JPEG para a mais alta qualidade.

Coisas como -sharpennão funcionam bem com o texto porque desfazem o que o sistema de renderização de fontes fez para torná-lo mais legível.

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

Descrições dos parâmetros em imagemagick.org estão aqui

majinnaibu
fonte
É o dobro do tamanho, principalmente porque a densidade de saída foi duplicada e a qualidade de compactação do jpg está definida no máximo (portanto, não há muita compactação).
rivimey
Usando convertcomo saberemos quantas páginas foram convertidas?
precisa
Definitivamente, este é o caminho a percorrer. Aumente a densidade da fonte e remova o -sharpen. A qualidade é muito melhor do que com os padrões e muito mais natural do que com -sharpen.
Joshua Pinter
19

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

Norman Ramsey
fonte
1
Embora não use o Imagemagick, essa solução parece mais com uma conversão transparente. pdftoppmtambém pode gerar JPEGs e PNGs.
Aaron Brick
19

normalmente extraio a imagem incorporada com 'pdfimages' na resolução nativa e depois uso o convert do 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 incorporadas JPG com perdas, você tinha que usar -j:

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

Com o poppler recente, você pode usar tudo o que economiza perdas como jpg e sem perdas como png

Na plataforma Win pouco fornecida, você precisava fazer o download de um binário 'poppler-util' recente (0,37 2015) em: http://blog.alivate.com.au/poppler-windows/

Valerio
fonte
Apenas uma pequena correcção: o segundo comando no bloco de código primeiro deve começar com pdftoppm não compdfimages
rao Satyanarayan
não, o pdfimages antigo salva as imagens extraídas em ppm, como o pdftoppm, e o pdftoppm nunca teve a opção -list. Pdfimages atuais pode salvar diretamente para PNG e JPG com -todos como indicado na nota
Valerio
13

Eu achei mais rápido e mais estável ao processar em lote PDFs grandes em PNGs e JPGs para usar o gscomando subjacente (também conhecido como Ghostscript) queconvert usa.

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

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

Codificador
fonte
10

Também oferece bons resultados:

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

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

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

Editar:

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 de compactação PNG 3.

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

pdf2png

insira a descrição da imagem aqui

Victoria Stuart
fonte
1
Isso pode ser automatizado se você tiver milhares de páginas?
precisa saber é o seguinte
@JBWhitmore: boa pergunta. Certamente, seria simples criar um script do comando pdftk, pois ele já está na linha de comando. Eu fiz uma pesquisa muito rápida no Google e descobriu que GIMP tem um modo de lote (eu não tentei, mas parece que deve ser programável também): gimp.org/tutorials/Basic_Batch
Victoria Stuart
1
@JBWhitmore um exemplo script para automatizar esta conversão é mostrada nesta pergunta / resposta: unix.stackexchange.com/questions/121293/...
tsherwen
1
@tsherwen, Se eu li esse link corretamente, é como automatizar o comando convert. Não estou confuso sobre como fazer isso. No entanto, esta resposta diz usar o GIMP como uma das etapas - e nem essa resposta nem o link parecem mostrar como automatizar isso.
JBWhitmore
1
@JBWhitmore. Eu, por engano, só estava pensando em termos da questão convert. Eu só vi a parte desta resposta mencionando converte sua pergunta enquanto lia seu comentário de automação. Obrigado pela sua resposta mais adiante neste tópico, que combinei com a solução à qual vinculei e resolvi um problema diferente que estava tendo.
tsherwen
7

Realmente não tive um bom sucesso com convert[atualização de maio de 2020: na verdade: praticamente nunca funciona para mim], mas tive um EXCELENTE sucesso pdftoppm. Veja alguns exemplos de produção de imagens de alta qualidade a partir de um PDF:

  1. [Produz ~ arquivos com tamanho de 25 MB por página] Imprime o formato de arquivo .tif a 300 DPI em uma pasta chamada "images", com os arquivos denominados pg-1.tif , pg-2.tif , pg-3.tif , etc:

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [Produz ~ arquivos com tamanho de 1 MB por página] Saída no formato .jpg a 300 DPI :

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [Produz ~ arquivos com tamanho de 2 MB por página] Saída no formato .jpg com a mais alta qualidade (menos compactação) e ainda com 300 DPI :

    mkdir -p images && pdftoppm -jpeg -jpegopt quality=100 -r 300 mypdf.pdf images/pg
    

Para mais explicações, opções e exemplos, veja minha resposta completa aqui:

/ubuntu/150100/extracting-embedded-images-from-a-pdf/1187844#1187844 .

Palavras-chave:

  1. [Como transformar um PDF em um PDF pesquisável com pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. Reticulado:
    1. Como converter um PDF em JPG com linha de comando no linux?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574
Gabriel Staples
fonte
6

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

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


insira a descrição da imagem aqui

Faça o download da imagem para ver em resolução máxima para comparação.

Não recomendo salvar em JPG se você espera fazer um processamento adicional.

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

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

fmw42
fonte
3

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.

Armin Mustafa
fonte
9
O motivo para fazer isso pela linha de comando é que eu tinha milhares de páginas que precisavam desse processo.
JBWhitmore
Além disso, o GIMP renderiza a página no carregamento , portanto, você deve definir a resolução ao selecionar as páginas a serem carregadas. Não importa muito para que você defina os parâmetros de saída se você começar com o padrão de 100 DPI no carregamento.
Keith Davies
1

Eu uso o icepdf, um mecanismo java pdf de código aberto. Confira a demonstração do escritório .

package image2pdf;

import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class pdf2image {

   public static void main(String[] args) {

      Document document = new Document();
      try {
         document.setFile("C:\\Users\\Dell\\Desktop\\test.pdf");
      } catch (PDFException ex) {
         System.out.println("Error parsing PDF document " + ex);
      } catch (PDFSecurityException ex) {
         System.out.println("Error encryption not supported " + ex);
      } catch (FileNotFoundException ex) {
         System.out.println("Error file not found " + ex);
      } catch (IOException ex) {
         System.out.println("Error IOException " + ex);
      }

      // save page captures to file.
      float scale = 1.0f;
      float rotation = 0f;

      // Paint each pages content to an image and
      // write the image to file
      for (int i = 0; i < document.getNumberOfPages(); i++) {
         try {
         BufferedImage image = (BufferedImage) document.getPageImage(
             i, GraphicsRenderingHints.PRINT, Page.BOUNDARY_CROPBOX, rotation, scale);

         RenderedImage rendImage = image;
         try {
            System.out.println(" capturing page " + i);
            File file = new File("C:\\Users\\Dell\\Desktop\\test_imageCapture1_" + i + ".png");
            ImageIO.write(rendImage, "png", file);
         } catch (IOException e) {
            e.printStackTrace();
         }
         image.flush();
         }catch(Exception e){
             e.printStackTrace();
         }
      }

      // clean up resources
      document.dispose();
   }
}

Eu também tentei o imagemagick e o pdftoppm , tanto o pdftoppm quanto o icepdf têm alta resolução que o imagemagick.

Kris Roofe
fonte
1

Por favor, tome nota antes da votação, esta solução é para o Gimp usando uma interface gráfica, e não para o ImageMagick usando uma linha de comando, mas funcionou perfeitamente bem para mim como alternativa, e é por isso que achei necessário compartilhar aqui.

Siga estas etapas simples para extrair imagens em qualquer formato de documentos PDF

  1. Download do Programa de Manipulação de Imagem GIMP
  2. Abra o programa após a instalação
  3. Abra o documento PDF que você deseja extrair Imagens
  4. Selecione apenas as páginas do documento PDF das quais você deseja extrair imagens. N / B: Se você precisar apenas das imagens de capa, selecione apenas a primeira página.
  5. Clique em Abrir depois de selecionar as páginas das quais deseja extrair imagens.
  6. Clique no menu Arquivo no GIMP quando as páginas abrirem.
  7. Selecione Exportar como no menu Arquivo
  8. Selecione o tipo de arquivo preferido por extensão (por exemplo, png) abaixo da caixa de diálogo exibida.
  9. Clique em Exportar para exportar sua imagem para o local desejado.
  10. Você pode verificar o seu explorador de arquivos quanto à imagem exportada.

Isso é tudo.

Eu espero que isso ajude

Promise Preston
fonte
A questão é para o ImageMagick usando uma linha de comando, não para o Gimp usando uma interface gráfica.
sidney
0

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

O 2JPEG pode converter o arquivo PDF que você anexou em um bom JPG nítido e cortar margens vazias em uma chamada:

2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop
Mikhael
fonte
O embaçamento no PNG original foi o que inspirou a pergunta em primeiro lugar, e o PNG na resposta aceita é bastante nítido.
JBWhitmore
0

Use esta linha de comando:

convert -geometry 3600x3600 -density 300x300 -quality 100 TEAM\ 4.pdf team4.png

Isso deve converter corretamente o arquivo, conforme solicitado.

Aleksandrs Bogdanovs
fonte
0

O seguinte script python funcionará em qualquer Mac (Snow Leopard e para cima). Ele pode ser usado na linha de comando com arquivos PDF sucessivos como argumentos, ou você pode inserir uma ação Executar Script de Shell no Automator e criar 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 uma Ação rápida podem ser baixados no 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 __name__ == '__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
benwiggy
fonte
0

Você pode fazer isso no LibreOffice Draw (que geralmente é pré-instalado no Ubuntu ):

  1. Abra o arquivo PDF no LibreOffice Draw.
  2. Role até a página que você precisa.
  3. Verifique se os elementos de texto / imagem estão posicionados corretamente. Caso contrário, você pode ajustá-los / editá-los na página.
  4. Menu superior: Arquivo> Exportar ...
  5. Selecione o formato da imagem que você precisa no menu inferior direito. Eu recomendo PNG.
  6. Nomeie seu arquivo e clique em Salvar.
  7. A janela Opções será exibida, para que você possa ajustar a resolução e o tamanho.
  8. Clique em OK e pronto.
Similar.Fotos
fonte
0

Eu usei pdf2image . Uma biblioteca python simples que funciona como charme.

Primeiro instale o poppler em uma máquina não-linux. Você pode apenas baixar o zip. Descompacte em Arquivos de Programa e adicione bin ao Caminho da Máquina.

Depois disso, você pode usar o pdf2image na classe python da seguinte forma:

from pdf2image import convert_from_path, convert_from_bytes
images_from_path = convert_from_path(
   inputfile,
   output_folder=outputpath,
   grayscale=True, fmt='jpeg')

Eu não sou bom com python, mas foi capaz de exe. Mais tarde, você pode usar o exe com o parâmetro de entrada e saída de arquivo. Eu usei em C # e as coisas estão funcionando bem.

A qualidade da imagem é boa. OCR funciona bem.

Pratap Singh Mehra
fonte
-1

Na verdade, é muito fácil fazer o Preview no Mac. Tudo o que você precisa fazer é abrir o arquivo em Visualizar e salvar como (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.

Jeff White
fonte
6
Isso pode ser automatizado se você tiver milhares de páginas?
perfil completo de JBWhitmore