Konwertuj pliki PDF na obrazy o wysokiej rozdzielczości

328

Próbuję użyć programu wiersza polecenia convertdo pobrania pliku PDF do obrazu (JPEG lub PNG). Oto jeden z plików PDF, które próbuję przekonwertować.

Chcę, aby program usunął nadmiar białych znaków i zwrócił obraz o wystarczająco wysokiej jakości, aby można było z łatwością odczytać indeks górny.

To moja najlepsza próba . Jak widać przycinanie działa dobrze, muszę tylko trochę wyostrzyć rozdzielczość. Oto polecenie, którego używam:

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

Próbowałem podjąć następujące świadome decyzje:

  • zmień rozmiar większy (nie ma wpływu na rozdzielczość)
  • podnieść jakość tak wysoko, jak to możliwe
  • użyj -sharpen(próbowałem zakresu wartości)

Wszelkie sugestie dotyczące uzyskania rozdzielczości obrazu w końcowej wersji PNG / JPEG byłyby bardzo mile widziane!

JBWhitmore
źródło
Nie wiem, możesz też spróbować link ...
karnok
1
Zobacz także: askubuntu.com/a/50180/64957
Dave Jarvis
Jeśli jesteś na mac, zajrzyj na strony man dla sips, „system przetwarzania obrazu skryptów”. Jest to edytor obrazów wiersza poleceń wbudowany w macOS, działa na plikach PDF i wielu innych typach obrazów.
ghoti
@ ghoti sips przekonwertuje tylko pierwszą stronę pliku PDF na obraz.
benwiggy

Odpowiedzi:

386

Wygląda na to, że następujące działania:

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

Daje to lewy obraz . Porównaj to z wynikiem mojego oryginalnego polecenia ( obrazek po prawej ):

  

(Aby naprawdę zobaczyć i docenić różnice między nimi, kliknij każdy z nich prawym przyciskiem myszy i wybierz „Otwórz obraz w nowej karcie ...” ).

Pamiętaj także o następujących faktach:

  • Gorzej, rozmazany obraz po prawej stronie ma rozmiar pliku 1.941.702 Bajtów (1,85 MB). Jego rozdzielczość to 3060 x 3960 pikseli, przy użyciu 16-bitowej przestrzeni kolorów RGB.
  • Lepszy, ostry obraz po lewej ma rozmiar pliku 337,879 bajtów (330 kB). Jego rozdzielczość wynosi 758 x 996 pikseli, przy użyciu 8-bitowej przestrzeni kolorów Graya.

Nie trzeba więc zmieniać rozmiaru; dodaj -densityflagę. Gęstość 150 jest dziwna - próba zakresu wartości skutkuje gorszym obrazem w obu kierunkach!

JBWhitmore
źródło
77
Ten densityparametr jest nieco wyjątkowy, ponieważ musi znajdować się przed plikiem wejściowym. Ponieważ PDF to wektorowy format pliku, który nie ma (dużej) liczby pikseli, mówi coś w stylu „strona ma wymiary 8 cali na 12 cali”. Jeśli chcesz piksel, użyj tego densityustawienia, aby powiedzieć mu, ile pikseli na cal chcesz uzyskać na wyjściu. Np. przy 150 otrzymasz 8x150 = 1200 na 12x150 = 1800 pikseli na obrazie wynikowym. To także liczba pikseli, na których działają ustawienia wyostrzania, kontrastu, kompresji itp.
Daniel Schneller,
8
Może to spowodować czarne tło w systemie Mac OS (patrz stackoverflow.com/questions/10934456/… ). Aby to naprawić, dodaj -flatten.
Rolf
2
dostałem czarne tło w systemie Mac OS, kiedy próbowałem przekonwertować pdf na png, dodając -flatten rozwiązałem go.
olala
4
Łał! Właśnie użyłem opcji -densityi -flatten, aby zmniejszyć rozmiar pliku pdf (do innego pliku pdf). Ta -flattenopcja naprawdę bardzo pomaga w zmniejszeniu całkowitego rozmiaru. W moim przypadku bez zaburzeń widzenia.
parvus
2
-densityFlaga będzie prawdopodobnie dają gorsze wyniki na wyższe wartości, jeśli jakość obrazu wyjściowego była niższa niż.
parvus
152

Osobiście to lubię.

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

Jest to nieco ponad dwa razy większy rozmiar pliku, ale dla mnie wygląda lepiej.

-density 300 ustawia rozdzielczość, przy której renderowany jest plik PDF.

-trim usuwa piksele krawędziowe tego samego koloru co piksele narożne.

-quality 100 ustawia jakość kompresji JPEG na najwyższą jakość.

Rzeczy jak -sharpen nie działają dobrze z tekstem, ponieważ cofają czynności wykonane przez system renderowania czcionek, aby uczynić go bardziej czytelnym.

Jeśli naprawdę chcesz go wysadzić, użyj tutaj zmiany rozmiaru i prawdopodobnie większej wartości dpi czegoś podobnego targetDPI * scalingFactor co spowoduje wyświetlenie pliku PDF w zamierzonej rozdzielczości / rozmiarze.

Opisy parametrów na imagemagick.org są tutaj

majinnaibu
źródło
Jest dwa razy większy, głównie dlatego, że gęstość wyjściowa została podwojona, a jakość kompresji jpg jest ustawiona na maksimum (więc kompresja mało).
piątek
Korzystając ze convertskąd będziemy wiedzieć, ile stron zostało przekonwertowanych?
Kiran Reddy,
To zdecydowanie najlepsza droga. Zwiększ gęstość źródła i usuń -sharpen. Jakość jest o wiele lepsza niż w przypadku ustawień domyślnych i znacznie bardziej naturalna niż w przypadku -sharpen.
Joshua Pinter
19

Używam pdftoppmw wierszu polecenia, aby uzyskać obraz początkowy, zwykle o rozdzielczości 300dpi, więc pdftoppm -r 300następnie użyj convertdo przycinania i konwersji PNG.

Norman Ramsey
źródło
1
chociaż nie używa Imagemagick, to rozwiązanie wydaje się najbardziej w duchu przejrzystej konwersji. pdftoppmmoże również generować pliki JPEG i PNG.
Aaron Brick
19

normalnie wyodrębniam osadzony obraz z „pdfimages” w natywnej rozdzielczości, a następnie używam konwersji ImageMagick do wymaganego formatu:

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

generuje to najlepszy i najmniejszy plik wyników.

Uwaga: W przypadku stratnych osadzonych obrazów JPG konieczne było użycie opcji -j:

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

W najnowszym popplerze możesz używać -all, które oszczędzają stratne jako jpg i bezstratne jak png

Na niewielkiej platformie Win trzeba było pobrać najnowszy (0.37 2015) plik binarny „poppler-util” z: http://blog.alivate.com.au/poppler-windows/

Valerio
źródło
pdftoppmpdfimages
Drobna
nie, starsze obrazy pdf zapisują wyodrębnione obrazy do ppm, takie jak pdftoppm, a pdftoppm nigdy nie miał opcji -list. Aktualne obrazy pdf mogą bezpośrednio zapisywać w formacie PNG i JPG za pomocą opcji -all, jak podano w nocie
Valerio
13

Przekonałem się, że jest to zarówno szybsze, jak i bardziej stabilne, gdy przetwarzam wsadowo duże pliki PDF na pliki PNG i JPG, aby użyć bazowej gskomendy (inaczej Ghostscript), któraconvert .

Możesz zobaczyć polecenie na wyjściu convert -verbosei istnieje kilka możliwych poprawek (YMMV), do których dostęp jest trudny / niemożliwy bezpośrednio przez convert.

Jednak trudniej byłoby wykonać przycinanie i ostrzenie za pomocą gs, więc, jak powiedziałem, YMMV!

Koder
źródło
10

Daje również dobre wyniki:

exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");
Preet Sandhu
źródło
7

Użytkownik systemu Linux tutaj: Wypróbowałem convertnarzędzie wiersza polecenia (dla plików PDF do PNG) i nie byłem zadowolony z wyników. Uznałem, że jest to łatwiejsze, z lepszym wynikiem:

  • wypakuj strony pdf za pomocą pdftk
    • na przykład: pdftk file.pdf cat 3 output page3.pdf
  • otwórz (importuj) ten pdf za pomocą GIMP
    • ważne: zmień import Resolutionz 100na 300lub600 pixel/in
  • w GIMPeksporcie jako PNG (zmień rozszerzenie pliku na .png)

Edytować:

Dodano zdjęcie, zgodnie z żądaniem w Comments. Użyto polecenia Konwertuj:

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

GIMP: importowane w rozdzielczości 300 dpi (px / in); eksportowane jako poziom kompresji PNG 3.

Nie użyłem GIMP-a w wierszu poleceń (dotyczy: mojego komentarza poniżej).

pdf2png

wprowadź opis zdjęcia tutaj

Victoria Stuart
źródło
1
Czy można to zautomatyzować, jeśli masz tysiące stron?
JBWhitmore
@JBWhitmore: dobre pytanie. Z pewnością skrypt byłby prosty do skryptu, ponieważ jest on już w wierszu poleceń. Przeprowadziłem bardzo szybkie wyszukiwanie w Google i okazało się, że GIMP ma tryb wsadowy (jeszcze go nie wypróbowałem, ale wygląda na to, że powinien on również być skryptowalny): gimp.org/tutorials/Basic_Batch
Victoria Stuart
1
@JBWhitmore przykładowy skrypt automatyzujący tę konwersję pokazano na tym pytaniu / odpowiedzi: unix.stackexchange.com/questions/121293/…
tsherwen
1
@tsherwen, jeśli poprawnie przeczytam ten link, to jak zautomatyzować polecenie konwersji. Nie jestem zdezorientowany, jak to zrobić. Jednak ta odpowiedź mówi o użyciu GIMP jako jednego z kroków - i ani ta odpowiedź, ani powiązany link nie pokazują, jak to zautomatyzować.
JBWhitmore
1
@JBWhitmore. Przez pomyłkę myślałem tylko o pytaniu convert. Widziałem tylko część tej odpowiedzi wspominającą converti twoje pytanie podczas czytania komentarza dotyczącego automatyzacji. Dziękuję za odpowiedź w dalszej części tego wątku, który połączyłem z rozwiązaniem, do którego podłączyłem i rozwiązałem inny problem, który miałem.
tsherwen
7

Naprawdę nie miałem dobrego sukcesu z convert[aktualizacja maja 2020 r .: właściwie: to prawie nigdy dla mnie nie działa], ale miałem ZNAKOMITY sukces pdftoppm. Oto kilka przykładów tworzenia obrazów o wysokiej jakości z pliku PDF:

  1. [Wytwarza ~ 25 MB wielkości plików na pg] Wyjście nieskompresowanego formatu pliku .tif przy 300 DPI do folderu o nazwie „obrazy”, z nazwami plików pg-1.tif , pg-2.tif , pg-3.tif , itp:

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [Wytwarza ~ 1 MB plików na pg] Dane wyjściowe w formacie .jpg przy 300 DPI :

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [Produkuje pliki o wielkości ~ 2 MB na pg] Wyjście w formacie .jpg w najwyższej jakości (najmniejszej kompresji) i wciąż przy 300 DPI :

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

Aby uzyskać więcej wyjaśnień, opcji i przykładów, zobacz moją pełną odpowiedź tutaj:

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

Związane z:

  1. [Jak zamienić plik PDF na plik PDF z możliwością wyszukiwania w / pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. Usieciowany:
    1. Jak przekonwertować plik PDF na JPG za pomocą wiersza polecenia w systemie Linux?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574
Gabriel Staples
źródło
6

W ImageMagick możesz wykonać „supersampling”. Podajesz dużą gęstość, a następnie zmieniasz rozmiar tak bardzo, jak to pożądane dla ostatecznego rozmiaru wyjściowego. Na przykład ze swoim obrazem:

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


wprowadź opis zdjęcia tutaj

Pobierz obraz, aby zobaczyć w pełnej rozdzielczości do porównania ..

Nie polecam zapisywania do JPG, jeśli spodziewasz się dalszego przetwarzania.

Jeśli chcesz, aby wyjście miało ten sam rozmiar co wejście, zmień rozmiar do odwrotności stosunku gęstości do 72. Na przykład, -gęstość 288 i -rozmiar 25%. 288 = 4 * 72 i 25% = 1/4

Im większa gęstość, tym lepsza jakość wynikowa, ale przetwarzanie potrwa dłużej.

fmw42
źródło
3

Jeszcze jedna sugestia: możesz użyć GIMP.

Wystarczy załadować plik PDF do GIMP-> zapisz jako .xcf, a następnie możesz zrobić co chcesz z obrazem.

Armin Mustafa
źródło
9
Powodem tego jest to, że miałem tysiące stron, które wymagały tego procesu.
JBWhitmore
Ponadto GIMP renderuje stronę podczas ładowania , więc będziesz chciał ustawić rozdzielczość po wybraniu stron do załadowania. Nie ma znaczenia, jakie parametry wyjściowe ustawisz, jeśli zaczynasz od domyślnego ustawienia 100 DPI podczas ładowania.
Keith Davies,
1

Używam icepdf z otwartego źródła java pdf engine. Sprawdź wersję biurową .

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

Próbowałem zostały również ImageMagick i pdftoppm , zarówno pdftoppm i icepdf ma wysoką rozdzielczość niż ImageMagick.

Kris Roofe
źródło
1

Proszę wziąć pod uwagę przed głosowaniem, to rozwiązanie jest dla Gimpa korzystającego z interfejsu graficznego, a nie dla ImageMagick za pomocą wiersza poleceń, ale działało dla mnie idealnie jako alternatywa i dlatego uważam, że muszę się tutaj dzielić.

Wykonaj te proste kroki, aby wyodrębnić obrazy w dowolnym formacie z dokumentów PDF

  1. Pobierz GIMP Image Manipulation Program
  2. Otwórz program po instalacji
  3. Otwórz dokument PDF, który chcesz wyodrębnić Obrazy
  4. Wybierz tylko strony dokumentu PDF, z którego chcesz wyodrębnić obrazy. N / B: Jeśli potrzebujesz tylko okładek, wybierz tylko pierwszą stronę.
  5. Kliknij Otwórz po wybraniu stron, z których chcesz wyodrębnić obrazy
  6. Kliknij Plik menu gdy GIMP po otwarciu stron
  7. Wybierz Eksportuj jako w menu Plik
  8. Wybierz preferowany typ pliku według rozszerzenia (powiedzmy png) poniżej wyskakującego okna dialogowego.
  9. Kliknij Eksportuj, aby wyeksportować obraz do wybranej lokalizacji.
  10. Następnie możesz sprawdzić eksplorator plików pod kątem wyeksportowanego obrazu.

To wszystko.

mam nadzieję, że to pomoże

Obiecaj Preston
źródło
Pytanie dotyczy ImageMagick używającego wiersza poleceń, a nie Gimp używającego interfejsu graficznego.
sidney,
0

Załączony plik PNG wygląda na niewyraźny. W przypadku, gdy będziesz potrzebował dodatkowego przetwarzania końcowego dla każdego obrazu wygenerowanego jako podgląd PDF, zmniejszysz wydajność swojego rozwiązania.

2JPEG może konwertować plik PDF dołączony do ładnego wyostrzenia JPG i przycinać puste marginesy za jednym razem:

2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop
Michael
źródło
Rozmycie w oryginalnym PNG jest tym, co zainspirowało pytanie, a PNG w przyjętej odpowiedzi jest dość wyraźny.
JBWhitmore
0

Użyj tego wiersza poleceń:

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

Powinno to poprawnie przekonwertować plik zgodnie z prośbą.

Aleksandrs Bogdanovs
źródło
0

Poniższy skrypt python będzie działał na każdym komputerze Mac (Snow Leopard i nowszym). Można go użyć w wierszu polecenia z kolejnymi plikami PDF jako argumentami, lub można wprowadzić akcję Uruchom skrypt powłoki w Automatorze i wykonać usługę (Szybka akcja w Mojave).

Możesz ustawić rozdzielczość obrazu wyjściowego w skrypcie.

Skrypt i szybkie działanie można pobrać z 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
źródło
0

Możesz to zrobić w LibreOffice Draw (który jest zwykle preinstalowany w Ubuntu ):

  1. Otwórz plik PDF w LibreOffice Draw.
  2. Przewiń do potrzebnej strony.
  3. Upewnić się elementy tekstu / obrazu są poprawnie umieszczone. Jeśli nie, możesz je dostosować / edytować na stronie.
  4. Menu główne: Plik> Eksportuj ...
  5. Wybierz potrzebny format obrazu w prawym dolnym menu. Polecam PNG.
  6. Nazwij swój plik i kliknij Zapisz.
  7. Pojawi się okno opcji, umożliwiające dostosowanie rozdzielczości i rozmiaru.
  8. Kliknij OK i gotowe.
Podobne zdjęcia
źródło
0

Użyłem pdf2image . Prosta biblioteka python, która działa jak urok.

Najpierw zainstaluj poppler na maszynie innej niż Linux. Możesz po prostu pobrać zip. Rozpakuj w Program Files i dodaj bin do Machine Path.

Następnie możesz użyć pdf2image w klasie python w następujący sposób:

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

Nie jestem dobry w Pythonie, ale byłem w stanie zrobić z niego exe. Później możesz użyć exe z parametrem wejściowym i wyjściowym pliku. Użyłem go w języku C # i wszystko działa dobrze.

Jakość obrazu jest dobra. OCR działa dobrze.

Pratap Singh Mehra
źródło
-1

W rzeczywistości jest to dość łatwe dzięki Preview na Macu. Wszystko, co musisz zrobić, to otworzyć plik w podglądzie i zapisać jako plik PNG lub JPEG lub zapisać (lub wyeksportować), ale upewnij się, że używasz co najmniej 300 dpi na dole okna, aby uzyskać obraz wysokiej jakości.

Jeff White
źródło
6
Czy można to zautomatyzować, jeśli masz tysiące stron?
JBWhitmore