고해상도로 PDF를 이미지로 변환


328

커맨드 라인 프로그램 convert을 사용하여 PDF를 이미지 (JPEG 또는 PNG)로 가져 오려고합니다. 다음은 변환하려는 PDF 중 하나입니다 .

프로그램이 여분의 공백을 제거하고 위 첨자를 쉽게 읽을 수있는 충분한 품질의 이미지를 반환하기를 원합니다.

이것은 나의 현재 최선의 시도 입니다. 보시다시피, 트리밍이 잘 작동하므로 해상도를 약간 높여야합니다. 이것이 내가 사용하는 명령입니다.

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

나는 다음과 같은 의식적인 결정을 시도했습니다.

  • 더 큰 크기로 조정하십시오 (해상도에 영향을 미치지 않음)
  • 가능한 한 품질을 높이다
  • 사용 -sharpen(I 값의 범위를 시도했습니다)

최종 PNG / JPEG에서 이미지의 해상도를 높이는 데 대한 제안은 대단히 감사하겠습니다!


나도 몰라, 당신도 링크 를 시도 할 수 있습니다 ...
karnok


Mac을 사용하는 경우 "스크립트 가능한 이미지 처리 시스템" 맨 페이지참조하십시오sips . macOS에 내장 된 명령 행 이미지 편집기로 PDF 및 기타 여러 이미지 유형에서 작동합니다.
ghoti

@ghoti sips는 PDF 파일의 첫 페이지 만 이미지로 변환합니다.
benwiggy

답변:


386

다음과 같이 작동합니다.

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

이 결과 왼쪽 이미지 . 이것을 원래의 명령 결과 ( 오른쪽 이미지)와 비교하십시오 .

  

( 두 가지의 차이점 을 실제로 보고 이해 하려면 각각을 마우스 오른쪽 버튼으로 클릭하고 "새 탭에서 이미지 열기 ..."를 선택하십시오 .)

또한 다음 사실을 명심하십시오.

  • 오른쪽의 이미지가 흐릿하면 이미지 크기가 1.941.702 바이트 (1.85MB)입니다. 16 비트 RGB 색 공간을 사용하는 해상도는 3060x3960 픽셀입니다.
  • 왼쪽의 이미지가 더 좋을수록 파일 크기는 337.879 바이트 (330kByte)입니다. 해상도는 8 비트 회색 색상 공간을 사용하는 758x996 픽셀입니다.

따라서 크기를 조정할 필요가 없습니다. -density깃발을 추가하십시오 . 밀도 값 150은 이상합니다. 값 범위를 시도하면 양방향에서 이미지가 더 나빠집니다!


77
density매개 변수는 입력 파일 앞에 와야한다는 점에서 조금 특별 합니다. PDF는 (많은) 픽셀 개념이없는 벡터 기반 파일 형식이므로 "page is 8in by 12in"과 같은 것을 말합니다. 픽셀을 원하면 density설정을 사용하여 1 인치당 픽셀 수를 출력에 알려줍니다. 예 : 150을 사용하면 결과 이미지에서 8x150 = 1200 x 12x150 = 1800 픽셀이됩니다. 또한 선명도, 대비, 압축 등의 설정이 작동하는 픽셀의 양입니다.
Daniel Schneller '

8
Mac OS에서 검은 색 배경이 나타날 수 있습니다 ( stackoverflow.com/questions/10934456/… 참조 ). 이 문제를 해결하려면을 추가하십시오 -flatten.
Rolf

2
pdf를 png로 변환하려고 할 때 -flatten을 추가하여 Mac OS에서 검정색 배경을 얻었습니다.
olala

4
와! -densityand -flatten옵션을 사용하여 pdf의 크기를 다른 pdf로 줄였습니다. 이 -flatten옵션은 실제로 전체 크기를 줄이는 데 많은 도움이됩니다. 제 경우에는 시각 장애가 없습니다.
parvus

2
-density시작 이미지의 품질이보다 낮았다 경우 플래그 가능성이 높은 값에 더 나쁜 결과를 줄 것이다.
parvus

152

개인적으로 나는 이것을 좋아한다.

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

파일 크기의 두 배가 약간 넘지 만 나에게는 더 나아 보입니다.

-density 300 PDF가 렌더링되는 dpi를 설정합니다.

-trim 모서리 픽셀과 동일한 색상의 가장자리 픽셀을 제거합니다.

-quality 100 JPEG 압축 품질을 최고 품질로 설정합니다.

상황이 좋아하는 -sharpen그들은 더 명료하게 글꼴 렌더링 시스템이 한 일을 취소하기 때문에 텍스트와 잘 작동하지 않습니다.

실제로 폭파하려면 여기에서 크기 조정을 사용하십시오. 원하는 targetDPI * scalingFactor 해상도 / 크기에서 PDF를 렌더링하는 것과 같은 더 큰 dpi 값을 사용하십시오 .

imagemagick.org의 매개 변수에 대한 설명은 다음과 같습니다.


출력 밀도가 두 배가되었고 jpg 압축 품질이 최대로 설정 되었기 때문에 크기가 두 배입니다.
rivimey

사용하여 convert우리가 변환있어 얼마나 많은 페이지 알고하는 방법?
Kiran Reddy

어, 이것은 확실히가는 길입니다. 해당 소스 밀도를 높이고를 제거하십시오 -sharpen. 품질은 기본값보다 훨씬 뛰어나고보다 자연 스럽습니다 -sharpen.
Joshua Pinter

19

내가 사용 pdftoppm하므로, 일반적으로는 300dpi의 해상도로, 초기 이미지를 얻기 위해 명령 행에 pdftoppm -r 300다음 사용 convert트리밍 및 PNG 변환을 수행 할 수 있습니다.


1
Imagemagick을 사용하지 않는 동안,이 솔루션은 투명한 전환의 정신으로 보입니다. pdftoppmJPEG 및 PNG도 출력 할 수 있습니다.
Aaron Brick

19

일반적으로 기본 해상도에서 'pdfimages'가 포함 된 이미지를 추출한 다음 ImageMagick의 변환을 필요한 형식으로 사용하십시오.

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

이것은 가장 작은 결과 파일을 생성합니다.

참고 : 손실 JPG 임베디드 이미지의 경우 -j를 사용해야했습니다.

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

최근 poppler를 사용하면 손실을 jpg로, 손실을 png로 저장하는 모든 것을 사용할 수 있습니다

거의 제공되지 않은 Win 플랫폼에서는 http://blog.alivate.com.au/poppler-windows/ 에서 최신 (0.37 2015) 'poppler-util'바이너리를 다운로드해야했습니다.


그냥 약간의 보정 : 첫 번째 코드 블록의 두 번째 명령은 시작해야 pdftoppm 하지에pdfimages
satyanarayan 라오

아니요, 오래된 pdfimage는 추출 된 이미지를 pdftoppm과 같은 ppm으로 저장하며 pdftoppm에는 -list 옵션이 없습니다. 현재 pdfimage는 메모에 명시된 바와 같이 -all을 사용하여 PNG 및 JPG에 직접 저장할 수 있습니다.
Valerio

13

큰 PDF를 PNG 및 JPG로 일괄 처리하여 사용하는 기본 gs(일명 Ghostscript) 명령 을 사용할 때 더 빠르고 안정적이라는 것을 알았습니다 convert.

출력에서 명령을 볼 수 convert -verbose있으며을 통해 직접 액세스하기 어렵거나 불가능한 몇 가지 더 많은 조정 (YMMV)이 있습니다 convert.

그러나 gs내가 말했듯이 YMMV!를 사용하여 트리밍 및 샤프닝을 수행하는 것이 더 어려울 것입니다 .


10

또한 좋은 결과를 제공합니다.

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

7

Linux 사용자 여기 : convert명령 줄 유틸리티 (PDF to PNG)를 사용해 보았지만 결과에 만족하지 못했습니다. 나는 이것이 더 쉬운 것으로 더 나은 결과를 얻었습니다.

  • pdftk로 pdf 페이지를 추출하십시오
    • 예 : pdftk file.pdf cat 3 output page3.pdf
  • pdf로 열기 (가져 오기) GIMP
    • 중요 : 가져 오기 Resolution100에서 300또는600 pixel/in
  • GIMPPNG 로 내보내기 (파일 확장자를 .png로 변경)

편집하다:

의 요청에 따라 사진을 추가했습니다 Comments. 사용 된 변환 명령 :

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

GIMP: 300dpi (px / in)로 가져 오기; PNG 압축 수준 3으로 내보냈습니다.

커맨드 라인에서 김프를 사용하지 않았습니다 (아래 : 내 의견).

pdf2png

여기에 이미지 설명을 입력하십시오


1
수천 페이지가 있다면 이것을 자동화 할 수 있습니까?
JBWhitmore

@JBWhitmore : 좋은 질문입니다. pdftk 명령은 이미 명령 행에 있으므로 스크립트를 작성하는 것은 간단합니다. 정말 빠른 Google 검색을 수행하고 김프에 배치 모드가 있음을 발견했습니다 (시도하지 않았지만 스크립트 가능해야 함). gimp.org/tutorials/Basic_Batch
Victoria Stuart

1
@JBWhitmore이 전환을 자동화하는 예제 스크립트는이 질문 / 답변에 표시되어 있습니다 : unix.stackexchange.com/questions/121293/…
tsherwen

1
@ tsherwen, 그 링크를 올바르게 읽으면 변환 명령을 자동화하는 방법입니다. 나는 그것을하는 방법에 대해 혼란스럽지 않습니다. 그러나이 답변은 김프를 단계 중 하나로 사용한다고 말하며이 답변이나 링크가 자동으로 수행하는 방법을 보여주지 않습니다.
JBWhitmore

1
@JBWhitmore. 에 대한 질문에서 실수로 생각하고있었습니다 convert. convert자동화 의견을 읽는 동안 이 답변의 일부 와 귀하의 질문 만 보았습니다 . 이 스레드에서 나중에 답변을 주셔서 감사합니다.이 링크를 내가 연결 한 솔루션과 결합하여 내가 가진 다른 문제를 해결했습니다.
tsherwen

7

정말 좋은 성공 없었어요 convert[나를 위해 작동하지 않습니다 거의 결코 : 실제로 업데이트 할 수 있습니다 (2020)],하지만 난과 우수한 성공을 거두었습니다 pdftoppm. 다음은 PDF에서 고품질 이미지를 생성하는 몇 가지 예입니다.

  1. [pg 당 최대 25MB 크기의 파일 생성] 압축되지 않은 .tif 파일 형식을 300 DPI 에서 "images"라는 폴더로 출력 하고 파일 이름은 pg-1.tif , pg-2.tif , pg-3.tif , 기타:

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [pg 당 ~ 1MB 크기의 파일 생성] 300 DPI 에서 .jpg 형식으로 출력 :

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [pg 당 최대 2MB 크기의 파일 생성] 최고 품질 (최소 압축) 에서 300 DPI.jpg 형식으로 출력 :

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

자세한 설명, 옵션 및 예는 여기에서 전체 답변을 참조하십시오.

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

관련 :

  1. [PDF를 검색 가능한 PDF로 변환하는 방법 pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. 가교 :
    1. 리눅스에서 커맨드 라인을 사용하여 PDF를 JPG로 변환하는 방법은 무엇입니까?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574

6

ImageMagick에서는 "슈퍼 샘플링"을 수행 할 수 있습니다. 큰 밀도를 지정한 다음 최종 출력 크기에 대해 원하는만큼 크기를 줄입니다. 예를 들어 이미지의 경우 :

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


여기에 이미지 설명을 입력하십시오

이미지를 다운로드하여 전체 해상도로 비교하십시오.

추가 처리가 필요한 경우 JPG에 저장하지 않는 것이 좋습니다.

출력이 입력과 동일한 크기가되도록하려면 밀도 대 72의 비율의 역수로 크기를 조정하십시오. 예를 들어 -density 288 및 -resize 25 %입니다. 288 = 4 * 72 및 25 % = 1 / 4

밀도가 클수록 결과 품질은 좋아 지지만 처리하는 데 시간이 더 걸립니다.


3

또 다른 제안은 김프를 사용할 수 있다는 것입니다.

김프에 PDF 파일을로드하고 .xcf로 저장하면 이미지에 원하는 작업을 수행 할 수 있습니다.


9
커맨드 라인을 통해이 작업을 수행하는 이유는이 프로세스가 필요한 수천 페이지가 있기 때문입니다.
JBWhitmore

또한 김프는 로드시 페이지를 렌더링 하므로 로드 할 페이지를 선택할 때 해상도를 설정해야합니다. 로드시 100 DPI 기본값으로 시작하는 경우 출력 매개 변수를 무엇으로 설정했는지는 중요하지 않습니다.
Keith Davies

1

내가 사용 icepdf 오픈 소스 자바 PDF 엔진. 사무실 데모를 확인하십시오 .

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();
   }
}

또한 imagemagickpdftoppm을 시도했지만 pdftoppm 및 icepdf는 imagemagick보다 높은 해상도를 가지고 있습니다.


1

투표하기 전에이 솔루션은 그래픽 인터페이스를 사용하는 Gimp 용이며 명령 줄을 사용하는 ImageMagick 용은 아니지만 대안으로 완벽하게 작동했기 때문에 여기서 공유해야합니다.

이 간단한 단계를 따라 PDF 문서에서 원하는 형식으로 이미지를 추출하십시오.

  1. 김프 이미지 조작 프로그램 다운로드
  2. 설치 후 프로그램을 엽니 다
  3. 이미지를 추출하려는 PDF 문서를여십시오.
  4. 이미지를 추출 할 PDF 문서의 페이지 만 선택하십시오. 해당 없음 : 표지 이미지 만 필요한 경우 첫 페이지 만 선택하십시오.
  5. 이미지를 추출 할 페이지를 선택한 후 열기를 클릭하십시오.
  6. 페이지가 열릴 때 김프 할 때 파일 메뉴를 클릭하십시오
  7. 파일 메뉴에서 다른 이름으로 내보내기를 선택하십시오.
  8. 팝업 대화 상자 아래에서 확장자 (예 : png)로 원하는 파일 형식을 선택하십시오.
  9. 내보내기 를 클릭 하여 이미지를 원하는 위치로 내 보냅니다.
  10. 그런 다음 파일 탐색기에서 내 보낸 이미지를 확인할 수 있습니다.

그게 다야.

이게 도움이 되길 바란다


문제는 그래픽 인터페이스를 사용하는 Gimp가 아니라 명령 줄을 사용하는 ImageMagick에 대한 것입니다.
sidney

0

첨부 한 PNG 파일이 정말 흐리게 보입니다. PDF 미리보기로 생성 한 각 이미지에 대해 추가 사후 처리를 사용해야하는 경우 솔루션 성능이 저하됩니다.

2JPEG 는 첨부 한 PDF 파일을 멋진 JPG로 변환하고 한 번의 호출로 빈 여백을 자를 수 있습니다.

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

원본 PNG의 흐릿함은 처음부터 질문에 영감을 주었으며 허용되는 답변의 PNG는 다소 선명합니다.
JBWhitmore

0

이 명령 줄을 사용하십시오 :

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

요청 한대로 파일을 올바르게 변환해야합니다.


0

다음 파이썬 스크립트는 모든 Mac (Snow Leopard 이상)에서 작동합니다. 명령 행에서 연속적인 PDF 파일을 인수로 사용하거나 Automator의 Run Shell Script 조치에 넣고 서비스 (Mojave의 빠른 조치)를 작성할 수 있습니다.

스크립트에서 출력 이미지의 해상도를 설정할 수 있습니다.

스크립트빠른 조치 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

0

LibreOffice Draw (일반적으로 Ubuntu에 사전 설치되어 있음)에서 수행 할 수 있습니다 .

  1. LibreOffice Draw에서 PDF 파일을 엽니 다.
  2. 필요한 페이지로 스크롤하십시오.
  3. 확인하십시오텍스트 / 이미지 요소가 올바르게 배치되었는지 . 그렇지 않은 경우 페이지에서 조정 / 편집 할 수 있습니다.
  4. 최상위 메뉴 : 파일> 내보내기 ...
  5. 오른쪽 하단 메뉴에서 필요한 이미지 형식을 선택하십시오. PNG를 추천합니다.
  6. 파일 이름을 지정하고 저장을 클릭하십시오.
  7. 옵션 창이 나타나므로 해상도와 크기를 조정할 수 있습니다.
  8. 확인을 클릭하면 완료됩니다.

0

pdf2image를 사용 했습니다 . 매력처럼 작동하는 간단한 파이썬 라이브러리.

먼저 리눅스가 아닌 머신에 poppler 를 설치하십시오 . 당신은 우편 번호를 다운로드 할 수 있습니다. 프로그램 파일에서 압축을 풀고 빈을 머신 경로에 추가하십시오.

그 후 파이썬 클래스에서 다음과 같이 pdf2image를 사용할 수 있습니다.

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

나는 파이썬에는 좋지 않지만 그것을 실행할 수있었습니다. 나중에 파일 입력 및 출력 매개 변수와 함께 exe를 사용할 수 있습니다. 나는 C #에서 그것을 사용했고 일이 잘되고있다.

이미지 품질이 좋습니다. OCR이 잘 작동합니다.


-1

실제로 Mac에서 미리보기를 사용하는 것은 매우 쉽습니다. 미리보기에서 파일을 열고 png 또는 jpeg로 저장 (또는 내보내기)하지만 고품질 이미지를 얻으려면 창 하단에서 300dpi 이상을 사용해야합니다.


6
수천 페이지가 있다면 이것을 자동화 할 수 있습니까?
JBWhitmore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.