Конвертируйте PDF изображения в PNG используя Python на macOS

Я прочитал много статей, которые пытаются описать, как конвертировать PDF в изображение PNG. Но я просто не могу заставить его работать. Я пытался import PythonMagick поверх моего скрипта, но он возвращает ошибку ImportError: No module named PythonMagick,

Возможно ли установить PythonMagick так же легко, как инструменты оболочки через Homebrew?! Фон - мой скрипт на Python, который намного короче, чем эквивалентный скрипт Bash. Единственное, что не работает, - это преобразование PDF в PNG и масштабирование конечного изображения. В Bash я использую Imagemagick для этого, но я хочу сделать это и на Python, так как это один вкладыш.

Есть идеи?

РЕДАКТИРОВАТЬ

Код можно найти на Github: https://github.com/Blackjacx/Scripts/blob/master/iconizer.py

РЕШЕНИЕ НАЙДЕНО

Использование MagickWand работает лучше, поэтому я использую это. Чтобы установить это я сделал:

$ brew install imagemagick@6
$ export MAGICK_HOME=/usr/local/opt/imagemagick@6

2 ответа

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

Попробуй использовать mupdf, Команда mudraw Вы должны использовать различные решения в зависимости от версии. Большую часть времени это должно быть:

mudraw [-h 1080] [-w 1080] [-o <output_path>] <input_path> 

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

Попробуйте это для ошибки ImportError: Нет модуля с именем PythonMagick

Также посмотрите на эту ссылку

Попробуйте изменить: с. импортировать _PythonMagick для импорта _PythonMagick в ваш init.py из PythonMagick

Вы можете использовать собственные API-интерфейсы CoreGraphics от Apple со скриптом Python "из коробки". Следующий скрипт преобразует PDF-файлы, представленные в качестве аргументов, в PNG. Его также можно использовать в действии Automator "Run Shell Script".

#!/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
Другие вопросы по тегам