Konversi PDF ke gambar dengan resolusi tinggi


328

Saya mencoba menggunakan program baris perintah convertuntuk mengambil PDF menjadi gambar (JPEG atau PNG). Ini adalah salah satu PDF yang saya coba konversi.

Saya ingin program untuk memangkas kelebihan white-space dan mengembalikan gambar berkualitas cukup tinggi sehingga superskrip dapat dibaca dengan mudah.

Ini adalah upaya terbaik saya saat ini . Seperti yang Anda lihat, pemangkasan berfungsi dengan baik, saya hanya perlu sedikit mempertajam resolusi. Ini adalah perintah yang saya gunakan:

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

Saya sudah mencoba membuat keputusan sadar berikut:

  • ubah ukurannya lebih besar (tidak berpengaruh pada resolusi)
  • buat kualitas setinggi mungkin
  • gunakan -sharpen(saya sudah mencoba berbagai nilai)

Setiap saran, mohon untuk mendapatkan resolusi gambar di PNG / JPEG akhir yang lebih tinggi akan sangat dihargai!


Saya tidak tahu, Anda juga bisa mencoba tautan ...
karnok


Jika Anda menggunakan mac, lihat halaman manual untuk sips, "sistem pemrosesan gambar skrip". Ini adalah editor gambar baris perintah bawaan untuk macOS, berfungsi pada PDF dan banyak jenis gambar lainnya.
ghoti

@ ghoti menyeruput hanya akan mengonversi halaman pertama file PDF ke gambar.
benwiggy

Jawaban:


386

Tampaknya berfungsi sebagai berikut:

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

Ini menghasilkan gambar kiri . Bandingkan ini dengan hasil perintah asli saya ( gambar di sebelah kanan ):

  

(Untuk benar-benar melihat dan menghargai perbedaan di antara keduanya, klik kanan pada masing-masing dan pilih "Buka Gambar di Tab Baru ..." .)

Ingat juga fakta-fakta berikut:

  • Yang lebih buruk, gambar buram di sebelah kanan memiliki ukuran file 1,941.702 Bytes (1,85 MByte). Resolusi adalah 3060x3960 piksel, menggunakan ruang warna RGB 16-bit.
  • Gambar yang lebih baik dan tajam di sebelah kiri memiliki ukuran file 337.879 Bytes (330 kByte). Resolusi adalah 758x996 piksel, menggunakan ruang warna abu-abu 8-bit.

Jadi, tidak perlu mengubah ukuran; tambahkan -densitybendera. Nilai kepadatan 150 aneh - mencoba berbagai nilai menghasilkan gambar yang tampak lebih buruk di kedua arah!


77
The densityparameter adalah sedikit khusus di dalam harus datang sebelum file input. Karena PDF adalah format file berbasis vektor yang tidak memiliki (banyak) gagasan piksel, ia mengatakan sesuatu seperti "halaman adalah 8in oleh 12in". Jika Anda ingin piksel, Anda menggunakan densitypengaturan untuk memberi tahu, berapa banyak piksel per inci yang ingin Anda dapatkan dalam output. E. g. dengan 150 Anda akan mendapatkan 8x150 = 1200 dengan 12x150 = 1800 piksel pada gambar yang dihasilkan. Itu juga jumlah piksel yang dipertajam, kontras, kompresi dll pengaturan bekerja.
Daniel Schneller

8
Ini dapat menghasilkan latar belakang hitam pada Mac OS (lihat stackoverflow.com/questions/10934456/… ). Untuk memperbaiki ini, tambahkan -flatten.
Rolf

2
saya mendapat latar belakang hitam di Mac OS ketika saya mencoba mengubah pdf ke png, menambahkan -flatten menyelesaikannya.
olala

4
Wow! Hanya menggunakan opsi -densitydan -flattenuntuk mengurangi ukuran pdf (ke pdf lain). The -flattenpilihan yang sangat banyak membantu dalam mengurangi ukuran total. Dalam kasus saya, tanpa gangguan visual.
parvus

2
The -densitybendera kemungkinan akan memberikan hasil yang lebih buruk pada nilai yang lebih tinggi jika kualitas gambar mulai lebih rendah dari itu.
parvus

153

Secara pribadi saya suka ini.

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

Ini sedikit lebih dari dua kali ukuran file, tetapi terlihat lebih baik bagi saya.

-density 300 menyetel dpi tempat PDF diberikan.

-trim menghapus piksel tepi apa pun yang warnanya sama dengan piksel sudut.

-quality 100 mengatur kualitas kompresi JPEG ke kualitas tertinggi.

Hal-hal seperti -sharpentidak berfungsi dengan baik dengan teks karena mereka membatalkan hal-hal yang dilakukan sistem rendering font Anda agar lebih mudah dibaca.

Jika Anda benar-benar ingin itu meledak gunakan mengubah ukuran di sini dan mungkin nilai dpi yang lebih besar dari sesuatu seperti targetDPI * scalingFactor Itu akan membuat PDF pada resolusi / ukuran yang Anda inginkan.

Deskripsi parameter di imagemagick.org ada di sini


Ukurannya dua kali lipat lebih besar karena kerapatan keluaran telah dua kali lipat dan kualitas kompresi jpg diatur pada maks (jadi tidak banyak kompresi).
rivimey

Dengan menggunakan convertbagaimana kita akan tahu berapa banyak halaman yang dikonversi?
Kiran Reddy

Eh, ini pasti cara yang harus ditempuh. Bump up sumber kepadatan itu dan hapus -sharpen. Kualitasnya jauh lebih baik daripada dengan default dan jauh lebih alami daripada dengan -sharpen.
Joshua Pinter

19

Saya menggunakan pdftoppmpada baris perintah untuk mendapatkan gambar awal, biasanya dengan resolusi 300dpi, jadi pdftoppm -r 300, kemudian gunakan convertuntuk melakukan pemangkasan dan konversi PNG.


1
sementara tidak menggunakan Imagemagick, solusi ini tampaknya paling dalam semangat konversi yang transparan. pdftoppmjuga dapat menampilkan JPEG dan PNG.
Aaron Brick

19

biasanya saya mengekstrak gambar yang disematkan dengan 'pdfimages' pada resolusi asli, kemudian menggunakan konversi ImageMagick ke format yang diperlukan:

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

ini menghasilkan file hasil terbaik dan terkecil.

Catatan: Untuk gambar tersemat JPG yang hilang, Anda harus menggunakan -j:

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

Dengan poppler baru-baru ini Anda dapat menggunakan -semua yang menyelamatkan lossy sebagai jpg dan lossless sebagai png

Pada sedikit platform Win yang disediakan Anda harus mengunduh biner 'poppler-util' terbaru dari (0,37 2015) dari: http://blog.alivate.com.au/poppler-windows/


Hanya koreksi kecil: perintah kedua di blok kode pertama harus dimulai dengan pdftoppm tidak denganpdfimages
satyanarayan rao

tidak, pdfimages lama menyimpan gambar yang diekstraksi ke ppm seperti pdftoppm, dan pdftoppm tidak pernah memiliki opsi -list. Pdfimages saat ini dapat langsung menyimpan ke PNG dan JPG dengan -semua seperti yang tercantum dalam catatan
Valerio

13

Saya telah menemukan keduanya lebih cepat dan lebih stabil ketika batch-processing PDF besar menjadi PNG dan JPG untuk menggunakan perintah yang mendasari gs(alias Ghostscript) yang convertdigunakan.

Anda dapat melihat perintah di output convert -verbosedan ada beberapa tweak mungkin di sana (YMMV) yang sulit / tidak mungkin diakses secara langsung melalui convert.

Namun, akan lebih sulit untuk melakukan pemangkasan dan penajaman Anda menggunakan gs, jadi, seperti yang saya katakan, YMMV!


10

Ini juga memberi Anda hasil yang baik:

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

7

Pengguna Linux di sini: Saya mencoba convertutilitas baris perintah (untuk PDF ke PNG) dan saya tidak puas dengan hasilnya. Saya menemukan ini lebih mudah, dengan hasil yang lebih baik:

  • ekstrak halaman pdf dengan pdftk
    • misalnya: pdftk file.pdf cat 3 output page3.pdf
  • buka (impor) dengan pdf itu GIMP
    • Penting: ubah impor Resolutiondari 100ke 300atau600 pixel/in
  • di GIMPekspor sebagai PNG (ubah ekstensi file menjadi .png)

Edit:

Menambahkan gambar, seperti yang diminta di Comments. Perintah konversi yang digunakan:

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

GIMP: diimpor pada 300 dpi (px / in); diekspor sebagai level kompresi PNG 3.

Saya belum pernah menggunakan GIMP pada baris perintah (re: komentar saya, di bawah).

pdf2png

masukkan deskripsi gambar di sini


1
Bisakah ini otomatis jika Anda memiliki ribuan halaman?
JBWhitmore

@JBWhitmore: pertanyaan bagus. Tentu saja akan mudah untuk skrip perintah pdftk, karena sudah ada di baris perintah. Saya melakukan pencarian Google sangat cepat, dan menemukan bahwa GIMP memiliki mode batch (saya belum mencobanya, tetapi sepertinya itu harus skrip
Victoria Stuart

1
@JBWhitmore contoh skrip untuk mengotomatiskan konversi ini ditampilkan pada pertanyaan / jawaban ini: unix.stackexchange.com/questions/121293/…
tsherwen

1
@tsherwen, Jika saya membaca tautan itu dengan benar, itu adalah cara mengotomatiskan perintah konversi. Saya tidak bingung bagaimana melakukannya. Namun, jawaban ini mengatakan untuk menggunakan GIMP sebagai salah satu langkah - dan baik jawaban maupun tautan ini tampaknya tidak menunjukkan cara mengotomatiskannya.
JBWhitmore

1
@JBWhitmore. Saya keliru hanya berpikir dalam hal pertanyaan convert. Saya hanya melihat bagian dari jawaban ini yang menyebutkan convertdan pertanyaan Anda saat membaca komentar otomasi Anda. Terima kasih atas jawaban Anda nanti di utas ini, yang saya kombinasikan dengan solusi yang saya tautkan dan memecahkan masalah berbeda yang saya alami.
tsherwen

7

Saya benar-benar tidak memiliki kesuksesan yang baik dengan convert[pembaruan Mei 2020: sebenarnya: itu hampir tidak pernah berhasil untuk saya], tetapi saya sudah sukses dengan SANGAT BAIK pdftoppm. Berikut adalah beberapa contoh menghasilkan gambar berkualitas tinggi dari PDF:

  1. [Menghasilkan ~ 25 MB ukuran file per pg] Output format file .tif tanpa kompresi pada 300 DPI ke dalam folder yang disebut "gambar", dengan file yang diberi nama pg-1.tif , pg-2.tif , pg-3.tif , dll:

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [Menghasilkan ~ file berukuran 1MB per pg] Output dalam format .jpg pada 300 DPI :

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [Menghasilkan ~ file berukuran 2MB per pg] Output dalam format .jpg dengan kualitas tertinggi (kompresi terendah) dan masih pada 300 DPI :

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

Untuk penjelasan, opsi, dan contoh lainnya, lihat jawaban lengkap saya di sini:

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

Terkait:

  1. [Cara mengubah PDF menjadi PDF yang dapat dicari dengan pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. Tautan silang:
    1. Bagaimana cara mengubah PDF menjadi JPG dengan commandline di linux?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574

6

Di ImageMagick, Anda dapat melakukan "supersampling". Anda menentukan kerapatan besar dan kemudian mengubah ukuran sebanyak yang diinginkan untuk ukuran output akhir. Misalnya dengan gambar Anda:

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


masukkan deskripsi gambar di sini

Unduh gambar untuk dilihat pada resolusi penuh untuk perbandingan ..

Saya tidak merekomendasikan menyimpan ke JPG jika Anda mengharapkan untuk melakukan pemrosesan lebih lanjut.

Jika Anda ingin output memiliki ukuran yang sama dengan input, maka ubah ukurannya menjadi kebalikan dari rasio kepadatan Anda menjadi 72. Misalnya, -densitas 288 dan -ukuran 25%. 288 = 4 * 72 dan 25% = 1/4

Semakin besar kepadatan semakin baik kualitas yang dihasilkan, tetapi akan membutuhkan waktu lebih lama untuk diproses.


3

Satu saran lagi adalah Anda dapat menggunakan GIMP.

Hanya memuat file PDF di GIMP-> save as .xcf dan kemudian Anda dapat melakukan apa pun yang Anda inginkan pada gambar.


9
Alasan untuk melakukan ini melalui baris perintah adalah bahwa saya memiliki ribuan halaman yang memerlukan proses ini.
JBWhitmore

Juga, GIMP membuat halaman memuat , jadi Anda ingin mengatur resolusi ketika Anda memilih halaman untuk memuat. Tidak masalah dengan apa Anda mengatur parameter output jika Anda mulai dengan 100 DPI default saat memuat.
Keith Davies

1

Saya menggunakan icepdf mesin pdf java open source. Periksa demo kantor .

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

Saya juga sudah mencoba imagemagick dan pdftoppm , baik pdftoppm dan icepdf memiliki resolusi tinggi daripada imagemagick.


1

Harap perhatikan sebelum pemungutan suara, solusi ini untuk Gimp menggunakan antarmuka grafis, dan bukan untuk ImageMagick menggunakan baris perintah, tetapi itu berfungsi dengan baik bagi saya sebagai alternatif, dan itulah sebabnya saya merasa perlu untuk berbagi di sini.

Ikuti langkah-langkah sederhana ini untuk mengekstrak gambar dalam format apa pun dari dokumen PDF

  1. Unduh Program Manipulasi Gambar GIMP
  2. Buka Program setelah instalasi
  3. Buka dokumen PDF yang ingin Anda ekstrak Gambar
  4. Pilih hanya halaman dokumen PDF yang ingin Anda ekstrak gambarnya. T / B: Jika Anda hanya membutuhkan gambar sampul, pilih hanya halaman pertama.
  5. Klik buka setelah memilih halaman yang ingin Anda ambil gambarnya
  6. Klik pada menu File ketika GIMP ketika halaman terbuka
  7. Pilih Ekspor sebagai dalam menu File
  8. Pilih jenis file yang Anda inginkan dengan ekstensi (say png) di bawah kotak dialog yang muncul.
  9. Klik Ekspor untuk mengekspor gambar Anda ke lokasi yang Anda inginkan.
  10. Anda kemudian dapat memeriksa file explorer Anda untuk gambar yang diekspor.

Itu saja.

saya harap ini membantu


Pertanyaannya adalah untuk ImageMagick menggunakan baris perintah, bukan untuk Gimp menggunakan antarmuka grafis.
sidney

0

File PNG yang Anda lampirkan terlihat sangat kabur. Jika Anda perlu menggunakan pasca-pemrosesan tambahan untuk setiap gambar yang Anda buat sebagai pratinjau PDF, Anda akan mengurangi kinerja solusi Anda.

2JPEG dapat mengonversi file PDF yang Anda lampirkan ke JPG yang bagus, tajamkan dan potong margin kosong dalam satu panggilan:

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

Keburaman dalam PNG asli adalah apa yang mengilhami pertanyaan di tempat pertama, dan PNG dalam jawaban yang diterima agak tajam.
JBWhitmore

0

Gunakan baris perintah ini:

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

Ini harus benar mengkonversi file seperti yang Anda minta.


0

Skrip python berikut akan berfungsi pada Mac apa saja (Snow Leopard dan yang lebih tinggi). Ini dapat digunakan pada baris perintah dengan file PDF berturut-turut sebagai argumen, atau Anda dapat dimasukkan ke dalam tindakan Run Shell Script di Automator, dan membuat Layanan (Tindakan Cepat di Mojave).

Anda dapat mengatur resolusi gambar output dalam skrip.

The Script dan Aksi Cepat dapat didownload dari 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

Anda dapat melakukannya di LibreOffice Draw (yang biasanya diinstal sebelumnya di Ubuntu ):

  1. Buka file PDF di LibreOffice Draw.
  2. Gulir ke halaman yang Anda butuhkan.
  3. Pastikan elemen teks / gambar ditempatkan dengan benar. Jika tidak, Anda dapat menyesuaikan / mengeditnya di halaman.
  4. Menu atas: File> Ekspor ...
  5. Pilih format gambar yang Anda butuhkan di menu kanan bawah. Saya merekomendasikan PNG.
  6. Namai file Anda dan klik Simpan.
  7. Jendela opsi akan muncul, sehingga Anda dapat menyesuaikan resolusi dan ukuran.
  8. Klik OK, dan Anda selesai.

0

Saya telah menggunakan pdf2image . Pustaka python sederhana yang berfungsi seperti pesona.

Pertama instal poppler pada mesin non linux. Anda bisa mengunduh zipnya. Buka zip di File Program dan tambahkan nampan ke Jalur Mesin.

Setelah itu Anda bisa menggunakan pdf2image di kelas python seperti ini:

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

Saya tidak pandai dengan python tetapi bisa membuatnya exe. Kemudian Anda dapat menggunakan exe dengan input file dan parameter output. Saya telah menggunakannya di C # dan semuanya bekerja dengan baik.

Kualitas gambar bagus. OCR berfungsi dengan baik.


-1

Ini sebenarnya cukup mudah dilakukan dengan Pratinjau di mac. Yang harus Anda lakukan adalah membuka file di Pratinjau dan simpan sebagai (atau ekspor) png atau jpeg tetapi pastikan Anda menggunakan setidaknya 300 dpi di bagian bawah jendela untuk mendapatkan gambar berkualitas tinggi.


6
Bisakah ini otomatis jika Anda memiliki ribuan halaman?
JBWhitmore
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.