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

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

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

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

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

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

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

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

Ответ 1

Похоже, что следующие работы:

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

В результате получается левое изображение. Сравните это с результатом моей исходной команды ( изображение справа):

qmLXI.jpg   FCjw6.jpg

(Чтобы действительно видеть и оценивать различия между ними, щелкните их правой кнопкой мыши и выберите "Открыть изображение в новой вкладке...".)

Также учитывайте следующие факты:

  • Хуже, размытое изображение справа имеет размер файла 1.941.702 байт (1.85 МБайт). Его разрешение составляет 3060x3960 пикселей, используя 16-битное цветовое пространство RGB.
  • Лучшее четкое изображение слева имеет размер файла 337,879 байт (330 кбайт). Его разрешение составляет 758x996 пикселей, используя 8-битное серое цветовое пространство.

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

Ответ 2

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

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 здесь

Ответ 3

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

Ответ 4

обычно я извлекаю внедренное изображение с помощью 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

С недавним попплером вы можете использовать -all, который сохраняет убытки как JPG и без потерь как PNG

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

Ответ 5

Я нашел его более быстрым и стабильным при пакетной обработке больших PDF файлов в PNG и JPG, чтобы использовать базовую команду gs (aka Ghostscript), которая использует convert.

Вы можете увидеть команду на выходе convert -verbose, и там есть несколько дополнительных настроек (YMMV), которые трудно или невозможно получить непосредственно через convert.

Однако было бы сложнее выполнить обрезку и резкость с помощью gs, поэтому, как я уже сказал, YMMV!

Ответ 6

Он также дает хорошие результаты:

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

enter image description here

Ответ 8

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

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

Ответ 9

В ImageMagick вы можете делать "суперсэмплинг". Вы указываете большую плотность, а затем уменьшаете размер до желаемого для конечного выходного размера. Например с вашим изображением:

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


enter image description here

Загрузите изображение для просмотра в полном разрешении для сравнения.

Я не рекомендую сохранять в JPG, если вы ожидаете дальнейшей обработки.

Если вы хотите, чтобы размер выходного файла был таким же, как у входного, измените размер до величины, обратной отношению вашей плотности к 72. Например, -density 288 и -resize 25%. 288 = 4 * 72 и 25% = 1/4

Чем больше плотность, тем лучше полученное качество, но обработка займет больше времени.

Ответ 10

Файл PNG, который вы прикрепляете, выглядит действительно размытым. Если вам нужно использовать дополнительную пост-обработку для каждого изображения, которое вы создали в виде предварительного просмотра PDF, вы уменьшите производительность своего решения.

2JPEG может конвертировать PDF файл, который вы прикрепляете к хорошему резкости JPG, и обрезать пустые поля за один вызов:

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

Ответ 11

Используйте эту командную строку:

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

Это должно правильно преобразовать файл, как вы просили.

Ответ 12

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

Ответ 13

Следующий скрипт на 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 developer pages.
                options = {
                    Quartz.kCGImagePropertyDPIHeight: resolution,
                    Quartz.kCGImagePropertyDPIWidth: resolution
                    }
                writeImage (image, url, type, options)
                del page

Ответ 14

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

Выполните следующие простые действия, чтобы извлечь изображения в любом формате из PDF-документов

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

Это все.

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

Ответ 15

Я использую 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.