PDF를 PNG로 변환


83

PDF를 PNG 이미지 (적어도 하나의 표지)로 변환하려고합니다. pdftk로 PDF의 첫 페이지를 성공적으로 추출하고 있습니다. 변환을 위해 imagemagick을 사용하고 있습니다.

convert cover.pdf cover.png

이것은 작동하지만 불행히도 cover.png는 잘못 렌더링되어 제공됩니다 (PDF의 일부 알파 개체가 제대로 렌더링되지 않음). ImageMagick이 GhostScript를 사용하여 변환을 수행한다는 것을 알고 있으며 gs로 직접 수행하면 원하는 결과를 얻을 수 있지만 활용하고 싶은 다른 도구가 있으므로 변환 라이브러리를 사용하고 싶습니다.

GhostScript의이 명령은 원하는 이미지를 수행합니다.

gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf

Convert to GhostScript를 통해 인수를 전달할 수있는 방법이 있는지 궁금합니다. 아니면 GhostScript를 직접 호출해야합니까?


2
GhostScript를 직접 호출하는 것이 왜 문제입니까?
kquinn

정말 큰 문제가 아닙니다. 동시에 변환을 통해 다른 매개 변수를 실행하고 싶습니다.이 모든 것을 하나의 명령으로 유지할 수 있다면 좋을 것입니다. 내 코드를 더 깨끗하고 일관되게 유지합니다. 또한 임시 파일이 하나 적다는 의미이기도합니다.
아담


gs를 호출하는 방법과 ImageMagick이 호출하는 방법의 차이점은 무엇입니까? ImageMagick이에 가치가보고 뭔가 상향 될 수 있음 (추종자 노트, 고스트 스크립트를 업데이트하면 ... 물론 도움이 될 수 있습니다)
rogerdpack

답변:


71

첫 번째 명령이 출력을 stdout에 쓸 수 있고 두 번째 명령이 stdin에서 입력을 읽을 수있는 경우 파이프를 통해 연결된 두 개의 명령 ( gs, convert) 과 함께 하나의 명령 줄을 사용할 수 있습니다 .

  1. 다행히 gs는 stdout ( ... -o %stdout ...)에 쓸 수 있습니다 .
  2. 운 좋게도 convert는 stdin ( convert -background transparent - output.png) 에서 읽을 수 있습니다 .

문제 해결됨:

  • 특수 이미지를 처리하는 알파 채널에 사용되는 GS,
  • 투명한 배경을 만드는 데 사용되는 변환,
  • 디스크에 임시 파일 쓰기를 방지하는 데 사용되는 파이프입니다.

완벽한 솔루션 :

gs -sDEVICE=pngalpha       \
   -o %stdout              \
   -r144 cover.pdf         \
   |                       \
convert                    \
   -background transparent \
   -                       \
    cover.png

최신 정보

PDF 페이지 당 별도의 PNG를 사용하려면 다음 %d구문을 사용할 수 있습니다 .

gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf

이것은라는 이름의 PNG 파일을 생성합니다 page-000.png, page-001.png... (주 것을 %d-counting은 제로 - file-000.png대응을 PDF의 페이지 1, 0012 페이지로 ...

또는 100 페이지 PDF에 대해 투명한 배경을 유지하려면

for i in {1..100}; do        \
                             \
  gs -sDEVICE=pngalpha       \
     -dFirstPage="${i}"      \
     -dLastPage="${i}"       \
     -o %stdout              \
     -r144 input.pdf         \
     |                       \
  convert                    \
     -background transparent \
     -                       \
      page-${i}.png ;        \
                             \
done

7
이것은 -dBATCH -dNOPAUSE -dQUIETgs 옵션을 추가 하는 경우에만 작동합니다 .
ford

@ford : 즉, 이전 버전의 Ghostscript가 있음을 의미합니다. 최신 버전은 할 수 있으며 동시에 -o output.file자동으로 설정 -dBATCH -dNOPAUSE -dQUIET됩니다.
Kurt Pfeifle 2014

@ford : 그러나 위 답변의 다른 곳에 심각한 오타가 있습니다. 그럼에도 불구하고 왜 22 개의 찬성표를 받았는지 궁금합니다. :-)
Kurt Pfeifle 2014

나를 위해 일하지만 자동으로 여러 페이지의 pdf를 image_1.png, image_2.png로 변환하고 싶습니다 ... 먼저 pdf 파일에서 각 페이지를 추출해야 하나의 명령으로 쉬운가요?
Tarass

네, 이미지를 분리했습니다. 하지만 변환하는 동안 '변환'매개 변수로 "-투명 흰색"을 원합니다. 파이프로 할 수 있었지만?
Tarass

29

사용 가능한 모든 대안 중에서 Inkscape가 PDF를 PNG로 변환 할 때 가장 정확한 결과를 생성하는 것을 발견했습니다. 특히 소스 파일에 투명 레이어가있을 때 Inkscape는 Imagemagick 및 기타 도구가 실패한 곳에서 성공했습니다.

이것은 내가 사용하는 명령입니다.

inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"

그리고 여기에서는 스크립트로 구현됩니다.

#!/bin/bash

while [ $# -gt 0 ]; do

pdf=$1
echo "Converting "$pdf" ..."
pngfile=`echo "$pdf" | sed 's/\.\w*$/.png/'`
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
echo "Converted to "$pngfile""
shift

done

echo "All jobs done. Exiting."

21

pdf를 이미지 파일로 변환하려면 다음 명령을 사용하십시오.

PNG의 경우 gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf

JPG 용 gs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf

여러 페이지가있는 경우 이름 % 03d에 추가 gs -o a%03d.jpg a.pdf

각 옵션의 의미 :

  • sDEVICE = {jpeg, pngalpha, png16m ...}-파일 형식
  • -o-출력 파일 (% stdout에서 stdout으로)
  • -dTextAlphaBits = 4-글꼴 앤티 앨리어싱.
  • -r300-300 dpi

9

poppler-utils패키지에 포함 된 명령 줄 유틸리티를 사용할 수도 있습니다 .

sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help

예:

pdftocairo -png mypage.pdf mypage.png

1
아주 좋습니다. PDF가 여러 페이지 인 경우 여러 PNG 파일이 있습니다.
Tomasz Gandor

5

작동에 대한 수락 된 답변을 얻을 수 없습니다. 그런 다음 Ghostscript가 기본적으로 PNG를 지원할뿐만 아니라 여러 다른 "인코딩" 도 지원하므로 실제로 솔루션이 훨씬 더 간단하다는 것을 알게되었습니다 .

  • png256
  • png16
  • pnggray
  • pngmono
  • ...

나를 위해 작동하는 셸 명령은 다음과 같습니다.

gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf

pnggray인코딩 및 500 DPI를 사용하여 test.pdf의 2 페이지를 test.png에 저장합니다 .


2

다음은 SVG 파일에 대해 이와 같은 문제에 대한 독일어 토론입니다.

convert -background transparent

아마도 이것은 당신에게도 효과가 있습니다.


슬프게도 그것은 내 문제를 해결하지 못합니다. 실제로 모든 것 위에 알파 채널이있는 PDF의 이미지입니다.
아담

2

그의 스레드가 오래되었다고 생각하더라도 내 솔루션을 추가합니다. 어쨌든 이것은 누군가를 도울 것입니다.

먼저 PDF를 생성해야합니다. 이를 위해 XeLaTeX 를 사용 합니다.

xelatex test.tex

이제 ImageMagickGraphicMagic은 모두 왼쪽에서 오른쪽으로 매개 변수를 구문 분석 하므로 맨 왼쪽 매개 변수가 먼저 실행됩니다. 최적의 처리를 위해이 순서를 사용했습니다.

gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png

투명한 배경에 멋진 그래픽을 제공하고 실제로 페이지에있는 내용으로 잘립니다. -density-resize매개 변수는 더 세분화을주고, 전체 해상도를 높일 수 있습니다.

밀도를 줄일 수 있는지 확인하는 것이 좋습니다. 전환 시간이 단축됩니다.


2

ImageMagick이 부정확 한 색상을 제공하는 PDF의 경우 GraphicsMagick이 더 나은 작업을 수행한다는 것을 알았습니다.

$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg

확신 할 수있는 정보가 충분하지 않지만 색상 공간이 올바르게 정의되지 않았기 때문일 수 있습니다. -colorspace IM 옵션을 확인하십시오.
rivimey

2

이 페이지에는 또한 Linux / Windows / Mac 용으로 컴파일 된 명령 줄 도구가있는 xpdf 가 나와 있습니다. 투명성을 지원합니다. 상업용으로 무료입니다 . 가격 이 정말 터무니없는 Ghostscript와는 다릅니다 .

거대한 PDF 파일에 대한 테스트에서 Ghostscript보다 7.5 % 더 빠릅니다.

(또한 PDF to text 및 HTML 변환기가 있습니다)


나는 이것을 잠시 동안 사용했고 잘 작동합니다. 일반적으로 해상도가 높지만 Ghostscript보다 약간 느립니다. 그러나 이미지는 훨씬 더 멋지게 보이며 (조금 더 어둡지 만) Ghostscript에서 작업 할 수있는 앤티 앨리어싱은 xpdf에서 훌륭하게 작동합니다!
TheStoryCoder

2

단일 페이지 추출을 시도하십시오.

$ 페이지 = 4

gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf

1

내 솔루션은 훨씬 간단하고 직접적입니다. 적어도 내 PC에서 그런 식으로 작동합니다 (다음 사양).

me@home: my.folder$ uname -a
Linux home 3.2.0-54-generic-pae #82-Ubuntu SMP Tue Sep 10 20:29:22 UTC 2013 i686 i686 i386 GNU/Linux

me@home: my.folder$ convert --version
Version: ImageMagick 6.6.9-7 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP

그래서, 여기에 내가 실행하는 것이 있습니다 file.pdf.

me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png

그래 이것은 OP가 처음에 시도했지만 ImageMagick이 ghostscript를 호출 할 때 다른 오류를 가져올 수는 없지만 작동하면 작동합니다. :)
rogerdpack

0

PDF의 첫 페이지를 다른 도구로 분리하지 않고 ImageMagick을 사용할 수 있습니다. 그냥 해

convert -density 288 cover.pdf[0] -resize 25% cover.png


여기서 공칭 밀도를 400 % (72 * 4 = 288) 늘린 다음 1/4 (25 %) 크기를 조정합니다. 이것은 결과 png에 대해 훨씬 더 나은 품질을 제공합니다.

그러나 PDF가 CMYK 인 경우 PNG는이를 지원하지 않습니다. 특히 투명성이있는 경우 sRGB로 변환해야합니다. Ghostscript는 알파가있는 CMYK를 처리 할 수 ​​없기 때문입니다.

convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.