mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-05 06:00:58 +03:00
Merge pull request #6925 from radarhere/pdf
Added saving RGBA images as PDFs
This commit is contained in:
commit
d0f316718c
|
@ -8,7 +8,7 @@ import pytest
|
||||||
|
|
||||||
from PIL import Image, PdfParser, features
|
from PIL import Image, PdfParser, features
|
||||||
|
|
||||||
from .helper import hopper, mark_if_feature_version
|
from .helper import hopper, mark_if_feature_version, skip_unless_feature
|
||||||
|
|
||||||
|
|
||||||
def helper_save_as_pdf(tmp_path, mode, **kwargs):
|
def helper_save_as_pdf(tmp_path, mode, **kwargs):
|
||||||
|
@ -42,6 +42,11 @@ def test_save(tmp_path, mode):
|
||||||
helper_save_as_pdf(tmp_path, mode)
|
helper_save_as_pdf(tmp_path, mode)
|
||||||
|
|
||||||
|
|
||||||
|
@skip_unless_feature("jpg_2000")
|
||||||
|
def test_save_rgba(tmp_path):
|
||||||
|
helper_save_as_pdf(tmp_path, "RGBA")
|
||||||
|
|
||||||
|
|
||||||
def test_monochrome(tmp_path):
|
def test_monochrome(tmp_path):
|
||||||
# Arrange
|
# Arrange
|
||||||
mode = "1"
|
mode = "1"
|
||||||
|
|
|
@ -1457,8 +1457,13 @@ PDF
|
||||||
^^^
|
^^^
|
||||||
|
|
||||||
Pillow can write PDF (Acrobat) images. Such images are written as binary PDF 1.4
|
Pillow can write PDF (Acrobat) images. Such images are written as binary PDF 1.4
|
||||||
files, using either JPEG or HEX encoding depending on the image mode (and
|
files. Different encoding methods are used, depending on the image mode.
|
||||||
whether JPEG support is available or not).
|
|
||||||
|
* 1 mode images are saved using TIFF encoding, or JPEG encoding if libtiff support is
|
||||||
|
unavailable
|
||||||
|
* L, RGB and CMYK mode images use JPEG encoding
|
||||||
|
* P mode images use HEX encoding
|
||||||
|
* RGBA mode images use JPEG2000 encoding
|
||||||
|
|
||||||
.. _pdf-saving:
|
.. _pdf-saving:
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ TODO
|
||||||
Other Changes
|
Other Changes
|
||||||
=============
|
=============
|
||||||
|
|
||||||
TODO
|
Added support for saving PDFs in RGBA mode
|
||||||
^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
TODO
|
Using the JPXDecode filter, PDFs can now be saved in RGBA mode.
|
||||||
|
|
|
@ -173,6 +173,10 @@ def _save(im, fp, filename, save_all=False):
|
||||||
filter = "DCTDecode"
|
filter = "DCTDecode"
|
||||||
colorspace = PdfParser.PdfName("DeviceRGB")
|
colorspace = PdfParser.PdfName("DeviceRGB")
|
||||||
procset = "ImageC" # color images
|
procset = "ImageC" # color images
|
||||||
|
elif im.mode == "RGBA":
|
||||||
|
filter = "JPXDecode"
|
||||||
|
colorspace = PdfParser.PdfName("DeviceRGB")
|
||||||
|
procset = "ImageC" # color images
|
||||||
elif im.mode == "CMYK":
|
elif im.mode == "CMYK":
|
||||||
filter = "DCTDecode"
|
filter = "DCTDecode"
|
||||||
colorspace = PdfParser.PdfName("DeviceCMYK")
|
colorspace = PdfParser.PdfName("DeviceCMYK")
|
||||||
|
@ -199,6 +203,8 @@ def _save(im, fp, filename, save_all=False):
|
||||||
)
|
)
|
||||||
elif filter == "DCTDecode":
|
elif filter == "DCTDecode":
|
||||||
Image.SAVE["JPEG"](im, op, filename)
|
Image.SAVE["JPEG"](im, op, filename)
|
||||||
|
elif filter == "JPXDecode":
|
||||||
|
Image.SAVE["JPEG2000"](im, op, filename)
|
||||||
elif filter == "FlateDecode":
|
elif filter == "FlateDecode":
|
||||||
ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)])
|
ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)])
|
||||||
elif filter == "RunLengthDecode":
|
elif filter == "RunLengthDecode":
|
||||||
|
|
|
@ -487,6 +487,10 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) {
|
||||||
goto quick_exit;
|
goto quick_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strcmp(im->mode, "RGBA") == 0) {
|
||||||
|
image->comps[3].alpha = 1;
|
||||||
|
}
|
||||||
|
|
||||||
opj_set_error_handler(codec, j2k_error, context);
|
opj_set_error_handler(codec, j2k_error, context);
|
||||||
opj_set_info_handler(codec, j2k_warn, context);
|
opj_set_info_handler(codec, j2k_warn, context);
|
||||||
opj_set_warning_handler(codec, j2k_warn, context);
|
opj_set_warning_handler(codec, j2k_warn, context);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user