Конвертировать PDF в изображение с высоким разрешением


328

Я пытаюсь использовать программу командной строки, convertчтобы перевести PDF в изображение (JPEG или PNG). Вот один из PDF-файлов, которые я пытаюсь конвертировать.

Я хочу, чтобы программа убрала лишние пробелы и вернула изображение достаточно высокого качества, чтобы верхние индексы можно было легко прочитать.

Это моя лучшая попытка . Как видите, обрезка работает нормально, мне просто нужно немного повысить разрешение. Это команда, которую я использую:

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

Я пытался принять следующие сознательные решения:

  • изменить его размер больше (не влияет на разрешение)
  • сделать качество как можно выше
  • использовать -sharpen(я пробовал диапазон значений)

Любые предложения по получению разрешения изображения в финальном PNG / JPEG выше будут с благодарностью!


Я не знаю, вы также можете попробовать ссылку ...
Карнок

1
Смотрите также: askubuntu.com/a/50180/64957
Дейв Джарвис

Если вы на макинтоше, смотрите на странице человека для 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,85 МБ). Его разрешение составляет 3060x3960 пикселей с использованием 16-битного цветового пространства RGB.
  • Лучшее четкое изображение слева имеет размер файла 337,879 байт (330 кБайт). Его разрешение составляет 758х996 пикселей с использованием 8-битного серого цветового пространства.

Таким образом, нет необходимости изменять размер; добавить -densityфлаг. Значение плотности 150 странно - попытка диапазона значений приводит к ухудшению изображения в обоих направлениях!


77
densityПараметр немного особенного в том , что в должен прийти прежде , чем входной файл. Так как PDF - векторный формат файла, который не имеет (большого) значения пикселей, он говорит что-то вроде «страница 8 на 12 дюймов». Если вы хотите использовать пиксель, используйте densityнастройку, чтобы указать, сколько пикселей на дюйм вы хотите получить в выводе. Например при 150 вы получите 8x150 = 1200 на 12x150 = 1800 пикселей в результирующем изображении. Это также количество пикселей, над которыми работают параметры повышения резкости, контраста, сжатия и т. Д.
Даниэль Шнеллер

8
Это может привести к черному фону в Mac OS (см. Stackoverflow.com/questions/10934456/… ). Чтобы это исправить, добавьте -flatten.
Рольф

2
Я получил черный фон на Mac OS, когда пытался конвертировать pdf в png, добавив -flatten, решил.
Олала

4
Вот Это Да! Просто использовали -densityи -flattenвозможность уменьшить размер PDF (в другой формат PDF). -flattenВариант действительно помогает в снижении общего размера. В моем случае без зрительных нарушений.
Парвус

2
-densityФлаг, скорее всего , даст худшие результаты на более высоких значениях , если качество исходного изображения было ниже , чем это.
Парвус

153

Лично мне это нравится.

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

Это немного в два раза больше размера файла, но для меня это выглядит лучше.

-density 300 устанавливает dpi, в котором отображается PDF.

-trim удаляет все краевые пиксели того же цвета, что и угловые пиксели.

-quality 100 устанавливает высокое качество сжатия JPEG.

Такие вещи -sharpenне очень хорошо работают с текстом, потому что они отменяют действия вашей системы рендеринга шрифтов, чтобы сделать их более четкими.

Если вы действительно хотите, чтобы это было взорвано, используйте здесь изменить размер и, возможно, большее значение dpi, например, targetDPI * scalingFactor Это будет отображать PDF в том разрешении / размере, которое вы намереваетесь.

Описания параметров на imagemagick.org здесь


Это в два раза больше, в основном потому, что удвоенная выходная плотность была увеличена, а качество сжатия jpg установлено на максимум (так что сжатие не сильно).
Ривимей

Используя convertкак мы узнаем, сколько страниц было конвертировано?
Киран Редди

О, это определенно путь. Увеличьте плотность источника и удалите -sharpen. Качество намного лучше, чем с настройками по умолчанию и более естественно, чем с -sharpen.
Джошуа Пинтер

19

Я использую pdftoppmв командной строке исходное изображение, обычно с разрешением 300 точек на дюйм, а pdftoppm -r 300затем использую convertобрезку и преобразование PNG.


1
Хотя это решение и не использует Imagemagick, оно выглядит в духе прозрачного преобразования. pdftoppmтакже может выводить JPEG и PNG.
Аарон Брик

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 вы можете использовать -all, который сохраняет убытки как JPG и без потерь как PNG

На небольшой предоставляемой платформе Win вам пришлось загрузить недавний (0.37 2015 г.) бинарный файл poppler-util с http://blog.alivate.com.au/poppler-windows/


Небольшое исправление: вторая команда в первом блоке кода должна начинаться с pdftoppm не сpdfimages
сатьянараян Рао

нет, более старые pdfimages сохраняют извлеченные изображения в ppm, как pdftoppm, а pdftoppm никогда не включал опцию -list. Текущие pdfimages могут напрямую сохранять в PNG и JPG с -all, как указано в примечании
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 в PNG), и я не был доволен результатами. Я нашел, что это было проще, с лучшим результатом:

  • Извлеките pdf страницы с помощью pdftk
    • например: pdftk file.pdf cat 3 output page3.pdf
  • открыть (импортировать) этот PDF с GIMP
    • важно: изменить импорт Resolutionс 100на 300или600 pixel/in
  • при GIMPэкспорте в формате PNG (изменить расширение файла на .png)

Редактировать:

Добавлена ​​картинка, как того требует Comments. Используемая команда преобразования:

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

GIMP: импортируется с разрешением 300 точек на дюйм (пикс / дюйм); экспортируется как уровень сжатия PNG 3.

Я не использовал GIMP в командной строке (см. Мой комментарий ниже).

pdf2png

введите описание изображения здесь


1
Может ли это быть автоматизировано, если у вас есть тысячи страниц?
JBWhitmore

@JBWhitmore: хороший вопрос. Конечно, было бы просто написать скрипт команды pdftk, так как он уже находится в командной строке. Я сделал очень быстрый поиск в Google и обнаружил, что в GIMP есть пакетный режим (я не пробовал, но, похоже, он также должен быть в сценариях): gimp.org/tutorials/Basic_Batch
Victoria Stuart

1
@JBWhmore пример сценария для автоматизации этого преобразования показан на этот вопрос / ответ: unix.stackexchange.com/questions/121293/…
tsherwen

1
@tsherwen, если я правильно прочитал эту ссылку, это как автоматизировать команду преобразования. Я не запутался в том, как это сделать. Однако в этом ответе говорится, что в качестве одного из шагов следует использовать GIMP - и ни этот ответ, ни ссылка не показывают, как его автоматизировать.
JBWhitmore

1
@JBWhitmore. Я по ошибке просто думал с точки зрения вопроса о convert. Я видел только часть этого ответа convertи ваш вопрос во время чтения вашего комментария по автоматизации. Спасибо за ваш ответ позже в этой теме, который я объединил с решением, с которым связался, и решил другую проблему, с которой столкнулся.
tsherwen

7

У меня действительно не было хорошего успеха с convert[обновление мая 2020 года: на самом деле: он почти никогда не работает для меня], но у меня был ОТЛИЧНЫЙ успех pdftoppm. Вот пара примеров создания высококачественных изображений из PDF:

  1. [Производит файлы размером ~ 25 МБ на pg] Выводит несжатый формат файла .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. [Производит файлы размером ~ 1 МБ на pg] Вывод в формате .jpg с разрешением 300 DPI :

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [Производит файлы размером ~ 2 МБ на pg] Вывод в формате .jpg с высочайшим качеством (с наименьшим сжатием) и с разрешением 300 DPI :

    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 w / pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. Сшитые:
    1. Как конвертировать PDF в JPG с помощью командной строки в Linux?
    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

Еще одно предложение заключается в том, что вы можете использовать GIMP.

Просто загрузите файл PDF в GIMP-> сохранить как .xcf, и тогда вы сможете делать с изображением все, что захотите.


9
Причина для этого через командную строку состоит в том, что у меня были тысячи страниц, которые нуждались в этом процессе.
JBWhitmore

Кроме того, GIMP отображает страницу при загрузке , поэтому вам нужно установить разрешение при выборе страниц для загрузки. Не имеет большого значения, на что вы устанавливаете выходные параметры, если вы начинаете со 100 DPI по умолчанию при загрузке.
Кит Дэвис,

1

Я использую icepdf java 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();
   }
}

Я также попытался ImageMagick и pdftoppm , как pdftoppm и icepdf имеет высокое разрешение , чем ImageMagick.


1

Пожалуйста, примите к сведению, прежде чем голосовать, это решение предназначено для Gimp, использующего графический интерфейс, а не для ImageMagick, использующего командную строку, но оно отлично работало для меня в качестве альтернативы, и поэтому я счел необходимым поделиться здесь.

Следуйте этим простым шагам, чтобы извлечь изображения в любом формате из документов PDF

  1. Скачать программу управления изображениями GIMP
  2. Откройте программу после установки
  3. Откройте документ PDF, который вы хотите извлечь изображения
  4. Выберите только те страницы документа PDF, из которых вы хотите извлечь изображения. N / B: если вам нужны только обложки, выберите только первую страницу.
  5. Нажмите «Открыть» после выбора страниц, с которых вы хотите извлечь изображения.
  6. Нажмите на меню Файл, когда GIMP, когда открываются страницы
  7. Выберите Экспорт как в меню Файл
  8. Выберите предпочитаемый тип файла по расширению (скажем, png) под всплывающим диалоговым окном.
  9. Нажмите « Экспорт», чтобы экспортировать изображение в нужное место.
  10. Затем вы можете проверить файловый менеджер на предмет экспортированного изображения.

Вот и все.

надеюсь, это поможет


Вопрос для ImageMagick, использующего командную строку, а не для Gimp, использующего графический интерфейс.
Сидни

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

Следующий скрипт на python будет работать на любом Mac (Snow Leopard и выше). Его можно использовать в командной строке с последовательными файлами PDF в качестве аргументов, или вы можете вставить действие Run Shell Script в Automator и создать сервис (Quick Action in Mojave).

Вы можете установить разрешение выходного изображения в скрипте.

Сценарий и Quick Action можно загрузить с 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. Откройте PDF-файл в LibreOffice Draw.
  2. Прокрутите страницу до нужной вам страницы.
  3. Убедитесь, что элементы текста / изображения размещены правильно. Если нет, вы можете настроить / отредактировать их на странице.
  4. Главное меню: Файл> Экспорт ...
  5. Выберите нужный формат изображения в правом нижнем меню. Я рекомендую PNG.
  6. Назовите свой файл и нажмите «Сохранить».
  7. Появится окно параметров, чтобы вы могли настроить разрешение и размер.
  8. Нажмите OK, и все готово.

0

Я использовал pdf2image . Простая библиотека Python, которая работает как шарм.

Сначала установите poppler на машину, отличную от Linux. Вы можете просто скачать почтовый индекс. Разархивируйте в Program Files и добавьте bin в Machine Path.

После этого вы можете использовать pdf2image в классе Python следующим образом:

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

Я не очень хорошо разбираюсь в python, но смог сделать его лучше. Позже вы можете использовать исполняемый файл с входным и выходным параметром файла. Я использовал его в C # и все работает нормально.

Качество изображения хорошее. OCR работает отлично.


-1

Это на самом деле довольно легко сделать с Preview на Mac. Все, что вам нужно сделать, это открыть файл в режиме предварительного просмотра и сохранить как (или экспортировать) файл в формате png или jpeg, но убедитесь, что вы используете не менее 300 точек на дюйм в нижней части окна, чтобы получить изображение высокого качества.


6
Может ли это быть автоматизировано, если у вас есть тысячи страниц?
JBWhitmore
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.