Merge pull request #133 from muellermartin/fix-png-alpha
Remove alpha layer from PNG files for img2pdf
This commit is contained in:
		
						commit
						dbdd9b93f8
					
				@ -66,6 +66,10 @@ class RasterisedDocumentParser(DocumentParser):
 | 
				
			|||||||
            "image/gif",
 | 
					            "image/gif",
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def has_alpha(self, image):
 | 
				
			||||||
 | 
					        with Image.open(image) as im:
 | 
				
			||||||
 | 
					            return im.mode in ('RGBA', 'LA')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_dpi(self, image):
 | 
					    def get_dpi(self, image):
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            with Image.open(image) as im:
 | 
					            with Image.open(image) as im:
 | 
				
			||||||
@ -182,6 +186,19 @@ class RasterisedDocumentParser(DocumentParser):
 | 
				
			|||||||
        if self.is_image(mime_type):
 | 
					        if self.is_image(mime_type):
 | 
				
			||||||
            dpi = self.get_dpi(input_file)
 | 
					            dpi = self.get_dpi(input_file)
 | 
				
			||||||
            a4_dpi = self.calculate_a4_dpi(input_file)
 | 
					            a4_dpi = self.calculate_a4_dpi(input_file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if self.has_alpha(input_file):
 | 
				
			||||||
 | 
					                self.log(
 | 
				
			||||||
 | 
					                    "info",
 | 
				
			||||||
 | 
					                    f"Removing alpha layer from {input_file} "
 | 
				
			||||||
 | 
					                    "for compatibility with img2pdf"
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					                with Image.open(input_file) as im:
 | 
				
			||||||
 | 
					                    background = Image.new('RGBA', im.size, (255, 255, 255))
 | 
				
			||||||
 | 
					                    background.alpha_composite(im)
 | 
				
			||||||
 | 
					                    background = background.convert('RGB')
 | 
				
			||||||
 | 
					                    background.save(input_file, format=im.format)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if dpi:
 | 
					            if dpi:
 | 
				
			||||||
                self.log(
 | 
					                self.log(
 | 
				
			||||||
                    "debug",
 | 
					                    "debug",
 | 
				
			||||||
 | 
				
			|||||||
@ -181,13 +181,14 @@ class TestParser(DirectoriesMixin, TestCase):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        self.assertContainsStrings(parser.get_text(), ["This is a test document."])
 | 
					        self.assertContainsStrings(parser.get_text(), ["This is a test document."])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_image_simple_alpha_fail(self):
 | 
					    def test_image_simple_alpha(self):
 | 
				
			||||||
        parser = RasterisedDocumentParser(None)
 | 
					        parser = RasterisedDocumentParser(None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def f():
 | 
					 | 
				
			||||||
        parser.parse(os.path.join(self.SAMPLE_FILES, "simple-alpha.png"), "image/png")
 | 
					        parser.parse(os.path.join(self.SAMPLE_FILES, "simple-alpha.png"), "image/png")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertRaises(ParseError, f)
 | 
					        self.assertTrue(os.path.isfile(parser.archive_path))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertContainsStrings(parser.get_text(), ["This is a test document."])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_image_calc_a4_dpi(self):
 | 
					    def test_image_calc_a4_dpi(self):
 | 
				
			||||||
        parser = RasterisedDocumentParser(None)
 | 
					        parser = RasterisedDocumentParser(None)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user