2012-04-04 5 views
7

Używam GS zrobić konwersję PDF do formatu JPEG i po to jest polecenie, które używam:Ustawianie automatycznego wysokość/szerokość na przebudowanej JPEG z PDF przy użyciu GhostScript

gs -sDEVICE=jpeg -dNOPAUSE -dBATCH -g500x300 -dPDFFitPage -sOutputFile=image.jpg image.pdf 

W tym poleceniu jak u można zobaczyć -g500x300 służy do ustawienia rozmiaru przekonwertowanego obrazu (szerokość x wysokość).

Czy istnieje sposób na ustawienie szerokości bez konieczności wprowadzania wysokości, aby opierał się na szerokości, aby skalować wysokość przy użyciu oryginalnego współczynnika proporcji? Wiem, że można to osiągnąć, używając programu ImageMagick convert, w którym po prostu umieszczasz 0 na parametrze wysokości, tj. -resize 500x0. Próbowałem z GhostScript, ale nie sądzę, że jest to właściwy sposób.

Zdecydowałem się nie używać konwersji z ImageMagick, ponieważ jest ona bardzo powolna, jeśli chodzi o konwersję wielkoformatowego, wielostronicowego pliku PDF.

Dzięki za pomoc!

Odpowiedz

5

Ten post wyjaśnia, dlaczego ghostscript jest szybszy - https://serverfault.com/questions/167573/fast-pdf-to-jpg-conversion-on-linux-wanted, a jedynym sposobem obejścia tego problemu byłaby modyfikacja kodu imagemagick.

Niestety, autodeterminacja rozmiaru wyjściowego nie jest obsługiwana przez ghostscript. Dzieje się tak głównie dlatego, że użyta opcja -g określa rozmiar, który będzie zajmował renderowane wyjście, a nie sam wyrenderowany wynik. Ten rozmiar wyjściowy zmienia się z powodu przełącznika -dPDFFitPage, który następnie próbuje dopasować rozmiar urządzenia. I chociaż można zdefiniować tylko wysokość "urządzenia" jpeg za pomocą -dDEVICEHEIGHT=n, to pozostawi to szerokość urządzenia przy niezmienionej wartości domyślnej.

Mimo nieco żmudnego rozwiązania, można użyć funkcji ghostscript lub imagemagick, aby uzyskać szerokość i wysokość strony pdf. Aby to zrobić za pomocą ghostscript, zobacz odpowiedź na Using GhostScript to get page size. Następnie można obliczyć właściwą szerokość, aby ustawić flagę -g na współczynnik proporcji. Punkty premiowe, jeśli możesz wymyślić pojedynczy zestaw poleceń, aby to wszystko zrobić :)

4

Możesz napisać program PostScript, aby to zrobić wystarczająco łatwo. Oto początek:

 
%! 
% usage: gs -sFile=____.pdf scale.ps 

/File where not { 
    (\n *** Missing source file. \(use -sFile=____.pdf\)\n) = 
    Usage 
} { 
    pop 
}ifelse 

% Get the width and height of a PDF page 
% 
/GetSize { 
    pdfgetpage currentpagedevice 
    1 index get_any_box 
    exch pop dup 2 get exch 3 get 
    /PDFHeight exch def 
    /PDFWidth exch def 
} def 


% 
% The main loop 
% For every page in the original PDF file 
% 
1 1 PDFPageCount 
{ 
    /PDFPage exch def 
    PDFPage GetSize 

% In here, knowing the desired destination size 
% calculate a scale factor for the PDF to fit 
% either the width or height, or whatever 
% The width and height are stored in PDFWidht and PDFHeight 
    PDFPage pdfgetpage 
    pdfshowpage 
} for 

pdfgetpage i pdfshowpage są wewnętrzne rozszerzenia Ghostscript do języka PostScript do obsługi plików PDF.

+0

Czy możesz wyjaśnić w nieco szczegółowy sposób, jak korzystać z tego programu? Czy muszę utworzyć skrypt powłoki i uruchomić go? –

+0

Jego PostScript, więc podajesz go interpreterowi PostScript. Mówiąc dokładniej, przekazujesz go jako argument linii poleceń do Ghostscript. Komentarz jako pierwsza linia programu daje nawet użytek. Zauważ, że nie jest to kompletna działająca implementacja. – KenS