Конвертируйте 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