Python Wand convierte PDF a PNG deshabilita transparente(alpha_channel)
imagemagick (5)
A partir de una respuesta anterior , intente crear una imagen vacía con un color de fondo, luego componga.
from wand.image import Image
from wand.color import Color
with Image(filename="sample.pdf", resolution=300) as img:
with Image(width=img.width, height=img.height, background=Color("white")) as bg:
bg.composite(img,0,0)
bg.save(filename="image.png")
Estoy tratando de convertir un PDF a PNG; todo esto funciona bien, sin embargo, la imagen de salida sigue siendo transparente incluso cuando creo que la he desactivado:
with Image(filename=''sample.pdf'', resolution=300) as img:
img.background_color = Color("white")
img.alpha_channel = False
img.save(filename=''image.png'')
Lo anterior produce las imágenes pero son transparentes, también probé lo siguiente:
with Image(filename=''sample.pdf'', resolution=300, background=Color(''white'')) as img:
img.alpha_channel = False
img.save(filename=''image.png'')
que produce este error:
Traceback (most recent call last):
File "file_convert.py", line 20, in <module>
with Image(filename=''sample.pdf'', resolution=300, background=Color(''white'')) as img:
File "/Users/Frank/.virtualenvs/wand/lib/python2.7/site-packages/wand/image.py", line 1943, in __init__
raise TypeError("blank image parameters can''t be used with image "
TypeError: blank image parameters can''t be used with image opening parameters
Compilando las otras respuestas, aquí está la función que uso para convertir un PDF en páginas:
import os
from wand.image import Image
from wand.color import Color
def convert_pdf(filename, output_path, resolution=150):
""" Convert a PDF into images.
All the pages will give a single png file with format:
{pdf_filename}-{page_number}.png
The function removes the alpha channel from the image and
replace it with a white background.
"""
all_pages = Image(filename=filename, resolution=resolution)
for i, page in enumerate(all_pages.sequence):
with Image(page) as img:
img.format = ''png''
img.background_color = Color(''white'')
img.alpha_channel = ''remove''
image_filename = os.path.splitext(os.path.basename(filename))[0]
image_filename = ''{}-{}.png''.format(image_filename, i)
image_filename = os.path.join(output_path, image_filename)
img.save(filename=image_filename)
La otra respuesta (composición con una imagen en blanco) funciona, pero solo en la última página, al igual que configurar el canal alfa directamente. Lo siguiente funciona en la varita 0.4.2:
im = wand_image(filename=''/tmp/foo.pdf'', resolution=200)
for i, page in enumerate(im.sequence):
with wand_image(page) as page_image:
page_image.alpha_channel = False
page_image.save(filename=''/tmp/foo.pdf.images/page-%s.png'' % i)
Creo que esto es probablemente un error en la varita. Parece que configurar el canal alfa para un PDF debería afectar a todas las páginas, pero no lo hace.
Para aquellos que todavía tienen problemas con esto, encontré una solución (funciona en la versión 0.4.1 y superior, no estoy seguro de las versiones anteriores). Entonces deberías usar algo como esto:
with Image(filename=''sample.pdf'', resolution=300) as img:
img.background_color = Color("white")
img.alpha_channel = ''remove''
img.save(filename=''image.png'')
También tenía algunos archivos PDF para convertir a PNG. Esto funcionó para mí y parece más simple que componer imágenes, como se muestra arriba .:
all_pages = Image(blob=self.pdf) # PDF will have several pages.
single_image = all_pages.sequence[0] # Just work on first page
with Image(single_image) as i:
i.format = ''png''
i.background_color = Color(''white'') # Set white background.
i.alpha_channel = ''remove'' # Remove transparency and replace with bg.
Referencia: wand.image