it-roy-ru.com

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

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

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

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

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

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

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

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

265
JBWhitmore

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

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-битного цветового пространства Grey.

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

339
JBWhitmore

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

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

Это чуть более чем в два раза больше размера файла, но мне кажется, это лучше.

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

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

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

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

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

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

126
majinnaibu

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

15
Norman Ramsey

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

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

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

13
Coder

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

12
Valerio

Это также дает вам хорошие результаты:

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

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

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

2
Armin Mustafa

Пользователь 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 точек на дюйм (px/in); экспортируется как уровень сжатия PNG 3.

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

 pdf2png

 enter image description here

2
Victoria Stuart

Следующий скрипт на 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 __== '__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
benwiggy

В 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

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

0
fmw42

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

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

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

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

0
Jeff White