Пример #1
0
    def test_xmpmeta_str(self):
        """In 2.7, str must return a byte string.  In 3.x, it is a str."""
        xmp = XMPMeta()
        xmp.set_property(NS_DC, "Title", 'Huckleberry Finn')
        self.assertTrue(isinstance(str(xmp), str))

        xmp = XMPMeta()
        xmp.set_property(NS_DC, "Title", u'Stürm und Drang')
        self.assertTrue(isinstance(str(xmp), str))

        # Something in Devanagari
        xmp = XMPMeta()
        xmp.set_property(NS_DC, "Title", u'शिव')
        self.assertTrue(isinstance(str(xmp), str))
Пример #2
0
    def test_serialize_and_format(self):
        xmp = XMPMeta()
        xmp.parse_from_str(xmpcoverage.RDFCoverage, xmpmeta_wrap=True)

        obj = xmp.serialize_and_format(padding=0,
                                       newlinechr='NEWLINE',
                                       tabchr='TAB',
                                       indent=6)
        if sys.hexversion >= 0x03000000:
            the_unicode_type = str
        else:
            the_unicode_type = unicode
        self.assertTrue(isinstance(obj, the_unicode_type),
                        "Result is not the correct string")

        with self.assertRaises(XMPError):
            xmp.serialize_and_format(read_only_packet=True,
                                     omit_packet_wrapper=True)

        with self.assertRaises(XMPError):
            xmp.serialize_and_format(include_thumbnail_pad=True,
                                     omit_packet_wrapper=True)

        with self.assertRaises(XMPError):
            xmp.serialize_and_format(exact_packet_length=True,
                                     omit_packet_wrapper=True)

        del xmp
Пример #3
0
    def test_serialize_unicode(self):
        """
        Return type is unicode in 2.7, but str in 3.x
        """
        xmp = XMPMeta()
        xmp.parse_from_str(xmpcoverage.RDFCoverage, xmpmeta_wrap=True)
        if sys.hexversion >= 0x03000000:
            the_unicode_type = str
        else:
            the_unicode_type = unicode

        obj = xmp.serialize_to_unicode(use_compact_format=True,
                                       omit_packet_wrapper=False)
        self.assertTrue(isinstance(obj, the_unicode_type),
                        "Incorrect string result type.")

        with self.assertRaises(XMPError):
            xmp.serialize_to_unicode(read_only_packet=True,
                                     omit_packet_wrapper=True)

        with self.assertRaises(XMPError):
            xmp.serialize_to_unicode(include_thumbnail_pad=True,
                                     omit_packet_wrapper=True)

        with self.assertRaises(XMPError):
            xmp.serialize_to_unicode(exact_packet_length=True,
                                     omit_packet_wrapper=True)

        del xmp
Пример #4
0
    def test_serialize_str(self):
        xmp = XMPMeta()
        xmp.parse_from_str(xmpcoverage.RDFCoverage, xmpmeta_wrap=True)

        obj = xmp.serialize_to_str(use_compact_format=True,
                                   omit_packet_wrapper=True)

        if sys.hexversion >= 0x03000000:
            the_unicode_type = str
        else:
            the_unicode_type = unicode
        self.assertTrue(isinstance(obj, the_unicode_type))

        with self.assertRaises(XMPError):
            xmp.serialize_to_str(read_only_packet=True,
                                 omit_packet_wrapper=True)

        with self.assertRaises(XMPError):
            xmp.serialize_to_str(include_thumbnail_pad=True,
                                 omit_packet_wrapper=True)

        with self.assertRaises(XMPError):
            xmp.serialize_to_str(exact_packet_length=True,
                                 omit_packet_wrapper=True)
        del xmp
Пример #5
0
    def test_parse_from_str_3_bytes_per_codepoint(self):
        """
        Verify that we can create and read back utf-8 where each character
        takes 3 bytes to encode.
        """
        xmp = XMPMeta()
        rdf = xmpcoverage.RDFCoverage

        # Replace 'Simple2 value' with 'शिव'
        # This is 'Shiva' in Devanagari
        # शिव has code points [2358, 2367, 2357]
        expectedValue = u'शिव'
        if sys.hexversion < 0x03000000:
            rdf = unicode(rdf[0:272]) + expectedValue + unicode(rdf[285:])
            #rdf = rdf[0:272] + expectedValue.encode('utf-8') + rdf[285:]
            #rdf = unicode(rdf)
        else:
            rdf = rdf[0:272] + expectedValue + rdf[285:]

        xmp.parse_from_str(rdf, xmpmeta_wrap=True)

        prop = xmp.get_property(xmpcoverage.NS1, "SimpleProp2")
        self.assertEqual(prop, expectedValue)

        del xmp
Пример #6
0
 def test_parse_str(self):
     xmp = XMPMeta()
     xmp.parse_from_str(xmpcoverage.RDFCoverage, xmpmeta_wrap=True)
     prop = xmp.get_property(xmpcoverage.NS1, "SimpleProp1")
     self.assertEqual(prop, "Simple1 value")
     self.assertEqual(prop, u"Simple1 value")
     del xmp
Пример #7
0
 def get_xmp_version(filename):
     meta = pikepdf.open(filename).open_metadata()
     xmp = XMPMeta(xmp_str=str(meta))
     try:
         return xmp.get_property('http://ns.adobe.com/pdf/1.3/', 'PDFVersion')
     except XMPError:
         return ''
Пример #8
0
    def test_write_new_property(self):
        """Corresponds to test-write-new-property.cpp"""

        filename = pkg_resources.resource_filename(__name__,
                                                   "samples/test1.xmp")

        with open(filename, 'r') as fptr:
            strbuffer = fptr.read()

        xmp = XMPMeta()
        xmp.parse_from_str(strbuffer, xmpmeta_wrap=False)

        XMPMeta.register_namespace(NS_CC, "cc")
        reg_prefix = XMPMeta.get_namespace_for_prefix("cc")
        self.assertEqual(reg_prefix, NS_CC)

        reg_prefix = XMPMeta.get_prefix_for_namespace(NS_CC)
        self.assertEqual(reg_prefix, "cc:")

        xmp.set_property(NS_CC, "License", "Foo")
        self.assertEqual(xmp.get_property(NS_CC, "License"), "Foo")

        the_dt = datetime.datetime(2005, 12, 25, 12, 42, 42, tzinfo=pytz.utc)
        xmp.set_property_datetime(NS_EXIF, "DateTimeOriginal", the_dt)
        self.assertEqual(xmp.get_property(NS_EXIF, "DateTimeOriginal"),
                         "2005-12-25T12:42:42")

        prop = xmp.get_property_datetime(NS_EXIF, "DateTimeOriginal")
        self.assertEqual(prop.year, 2005)
        self.assertEqual(prop.minute, 42)
        self.assertEqual(prop.tzinfo, pytz.utc)
Пример #9
0
 def test_delete_property(self):
     """
     Verify the deleting a phony property does not raise an exception.
     """
     xmp = XMPMeta()
     xmp.parse_from_str(xmpcoverage.RDFCoverage, xmpmeta_wrap=True)
     xmp.delete_property(xmpcoverage.NS1, "NotReallyThere")
Пример #10
0
    def test_skip(self):
        """Verify usage of XMPMeta skip method.
        """
        filename = pkg_resources.resource_filename(__name__,
                                                   "samples/test1.xmp")
        with open(filename, 'r') as fptr:
            strbuffer = fptr.read()

        xmp = XMPMeta()
        xmp.parse_from_str(strbuffer)

        iterator = iterator = iter(xmp)

        schemas = []
        paths = []
        props = []

        for schema, path, prop, options in iterator:

            if schema == NS_TIFF:
                iterator.skip(iter_skipsubtree=True)
            else:
                schemas.append(schema)
                paths.append(path)
                props.append(prop)

        # If the iteration modification worked, there should be no TIFF
        # properties in the list of schemas.
        self.assertTrue(NS_TIFF not in schemas)
        self.assertTrue(NS_EXIF in schemas)
Пример #11
0
 def test_delete_property_bad_schema(self):
     """
     Specifying a bad schema trigger an exception.
     """
     xmp = XMPMeta()
     xmp.parse_from_str(xmpcoverage.RDFCoverage, xmpmeta_wrap=True)
     with self.assertRaises(XMPError):
         xmp.delete_property("not really a schema", "NotReallyThere")
Пример #12
0
 def test_clone(self):
     xmp1 = XMPMeta()
     self.assertTrue(xmp1 == xmp1, "XMP1 not equal it self")
     self.assertFalse(xmp1 != xmp1, "XMP1 is equal it self")
     xmp2 = xmp1.clone()
     self.assertFalse(xmp1 == xmp2, "XMP1 is not equal XMP2")
     self.assertTrue(xmp1 != xmp2, "XMP1 is not equal XMP2")
     del xmp1
     del xmp2
Пример #13
0
 def test_shorthand_rdf(self):
     """
     Tests pass so long as no error is issued.
     """
     xmp = XMPMeta()
     xmp.parse_from_str(xmpcoverage.ShorthandRDF, xmpmeta_wrap=True)
     prop = xmp.get_property("http://ns.adobe.com/tiff/1.0", "Model")
     self.assertEqual(prop, "Canon PowerShot S300")
     del xmp
Пример #14
0
def test_python_xmp_validate_change(sandwich):
    with sandwich.open_metadata() as xmp:
        assert 'xmp:CreatorTool' in xmp
        xmp['xmp:CreatorTool'] = 'Creator'  # Exists as a xml tag text
        xmp['pdf:Producer'] = 'Producer'  # Exists as a tag node
    assert str(xmp)
    xmpmeta = XMPMeta(xmp_str=str(xmp))
    assert xmpmeta.does_property_exist(XMP_NS_XMP, 'CreatorTool')
    assert xmpmeta.does_property_exist(XMP_NS_PDF, 'Producer')
Пример #15
0
 def test_text_property_450(self):
     xmp = XMPMeta()
     xmp.parse_from_str(xmpcoverage.LongTextProperty, xmpmeta_wrap=True)
     headline = xmp.get_property("http://ns.adobe.com/photoshop/1.0/",
                                 'Headline')
     self.assertEqual(headline[-5:], "=END=")
     self.assertTrue(
         len(headline) > 450,
         "Not all text was extracted from headline property.")
Пример #16
0
 def test_xmpmeta_unicode_27(self):
     """In 2.7, unicode(xmp) should return a unicode object."""
     xmp = XMPMeta()
     rdf = xmpcoverage.RDFCoverage
     xmp.parse_from_str(rdf)
     if sys.hexversion < 0x03000000:
         self.assertTrue(isinstance(unicode(xmp), unicode))
     else:
         # It's a no-op in 3.x.
         self.assertTrue(True)
Пример #17
0
def test_python_xmp_validate_change_list(graph):
    with graph.open_metadata() as xmp:
        assert 'dc:creator' in xmp
        xmp['dc:creator'] = ['Dobby', 'Kreacher']
    assert str(xmp)
    if not XMPMeta:
        pytest.skip(msg='needs libxmp')
    xmpmeta = XMPMeta(xmp_str=str(xmp))
    DC = XMP_NS_DC
    assert xmpmeta.does_array_item_exist(DC, 'creator', 'Dobby')
    assert xmpmeta.does_array_item_exist(DC, 'creator', 'Kreacher')
Пример #18
0
    def test_get_localized_text(self):
        xmp = XMPMeta()
        xmp.parse_from_str(xmpcoverage.RDFCoverage, xmpmeta_wrap=True)

        prop = xmp.get_property(xmpcoverage.NS1, "SimpleProp2")
        self.assertEqual(prop, "Simple2 value")

        ltext = xmp.get_localized_text(xmpcoverage.NS1, "ArrayProp2", 'x-one',
                                       'x-one')
        self.assertEqual(ltext, "Item2.1 value")

        del xmp
Пример #19
0
def loadXmp(inventory):
    for item in inventory:
        if 'xmp' in item:
            try:
                yield (item, object_to_dict(XMPMeta(xmp_str=item['xmp'])))
            except OSError:
                print("!!!WARN Failed to deserialize XMP data in {}".format(
                    item['name']))
                continue
        else:
            print(
                "!!!WARN: File metadata entry doesn't contain serialized xmp data, ignoring item from categories"
            )
Пример #20
0
    def test_count_array_items(self):
        """Tests XMPMeta method count_array_items."""
        filename = pkg_resources.resource_filename(__name__,
                                                   "samples/test1.xmp")
        with open(filename, 'r') as fptr:
            strbuffer = fptr.read()

        xmp = XMPMeta()
        xmp.parse_from_str(strbuffer)

        xmp.set_array_item(NS_DC, "creator", 2, "foo")
        xmp.append_array_item(NS_DC, "creator", "bar")
        xmp.append_array_item(NS_DC, "creator", "donuts")
        self.assertEqual(xmp.count_array_items(NS_DC, "creator"), 4)
Пример #21
0
    def get_xmp(self):
        """ 
		Get XMP from file.
		
		:return: A new :class:`libxmp.core.XMPMeta` instance.
		:raises XMPError: in case of errors.
		"""
        xmpptr = _exempi.xmp_files_get_new_xmp(self.xmpfileptr)
        _check_for_error()

        if xmpptr:
            return XMPMeta(_xmp_internal_ref=xmpptr)
        else:
            return None
Пример #22
0
    def test_does_array_item_exist(self):
        """Tests XMPMeta method does_array_item_exist.  Issue #03"""
        filename = pkg_resources.resource_filename(__name__,
                                                   "samples/test1.xmp")
        with open(filename, 'r') as fptr:
            strbuffer = fptr.read()

        xmp = XMPMeta()
        xmp.parse_from_str(strbuffer)

        xmp.set_array_item(NS_DC, "creator", 2, "foo")
        xmp.append_array_item(NS_DC, "creator", "bar")

        self.assertTrue(xmp.does_array_item_exist(NS_DC, "creator", "foo"))
        self.assertFalse(xmp.does_array_item_exist(NS_DC, "creator", "blah"))
Пример #23
0
    def test_get_localized_text(self):
        """
        Verify that unicode string literals are properly interpreted.
        """
        xmp = XMPMeta()
        xmp.parse_from_str(xmpcoverage.RDFCoverage, xmpmeta_wrap=True)

        prop = xmp.get_property(xmpcoverage.NS1, "SimpleProp2")
        self.assertEqual(prop, u'Simple2 value')

        ltext = xmp.get_localized_text(xmpcoverage.NS1, "ArrayProp2", 'x-one',
                                       'x-one')
        self.assertEqual(ltext, u'Item2.1 value')

        del xmp
Пример #24
0
def test_python_xmp_validate_add(trivial):
    with trivial.open_metadata() as xmp:
        xmp['dc:creator'] = ['Bob', 'Doug']
        xmp['dc:title'] = 'Title'
        xmp['dc:publisher'] = {'Mackenzie'}

    xmp_str = str(xmp).replace('\n', '')
    assert '<rdf:Seq><rdf:li>Bob</rdf:li><rdf:li>Doug</rdf:li>' in xmp_str
    assert '<rdf:Bag><rdf:li>Mackenzie</rdf:li>' in xmp_str

    xmpmeta = XMPMeta(xmp_str=str(xmp))
    DC = XMP_NS_DC
    assert xmpmeta.does_array_item_exist(DC, 'creator', 'Bob')
    assert xmpmeta.does_array_item_exist(DC, 'creator', 'Doug')
    assert xmpmeta.get_localized_text(DC, 'title', None, 'x-default') == 'Title'
    assert xmpmeta.does_array_item_exist(DC, 'publisher', 'Mackenzie')
    def test_cannot_inject_xmp_info_pdf(self):
        """Verify behavior of not being able to inject XMP into barren PDF"""
        # See issue 40
        srcfile = pkg.resource_filename(__name__,
                                        os.path.join("fixtures", "zeros.pdf"))

        with tempfile.NamedTemporaryFile() as tfile:
            shutil.copyfile(srcfile, tfile.name)

            xmpf = XMPFiles()
            xmpf.open_file(tfile.name, open_forupdate=True)
            xmp = XMPMeta()
            xmp.set_property(NS_PHOTOSHOP, "ICCProfile", "foo")
            with self.assertRaises(XMPError):
                xmpf.put_xmp(xmp)
            xmpf.close_file()
Пример #26
0
def ocultar_informacion(self, img_name, tag, content):
    xmpfile = XMPFiles(file_path=img_name, open_forupdate=True)

    tipo = Image.open(img_name).format      # Obtenemos el tipo de la imagen.
        
    if tipo == 'JPEG':                      # Si la imagen es JPEG, almacenamos el contenido en los campos consts.XMP_NS_JPEG
        xmp = xmpfile.get_xmp()
        xmp.set_property(consts.XMP_NS_JPEG, tag, content)
        
    else:                                   # Si la imagen es PNG
        if xmpfile.get_xmp() is None:       # Comprobamos si tiene campos XMP, sino, creamos uno vacío.
            xmp = XMPMeta()
        else:                               # Si tiene campos XMP, los cogemos.
            xmp = xmpfile.get_xmp()
        
        xmp.set_property(consts.XMP_NS_PNG, tag, content)   # Almacenamos el contenido en los campos consts.XMP_NS_PNG
        
    xmpfile.put_xmp(xmp)
    xmpfile.close_file()
Пример #27
0
class XMPEmbedderImpl:
    def __init__(self):
        self._fc = Storage()

    def metadata_synch(self, component_id, changes):

        # get xmp

        # the filename is needed because the extension is unknown, the following line of code is
        # tmp code because c.ID will include extension file (not only basename)
        # in the new MediaDART release
        #print 'MediaDART resource path: ', md_res_path
        try:
            myxmpfilename = str(self._fc.abspath(component_id))
        except Exception, err:
            print '\n    found some problems getting filename, err: ', err, '\n'

        xmpfile = XMPFiles(file_path=myxmpfilename,
                           open_forupdate=files.XMP_OPEN_FORUPDATE)
        xmp = xmpfile.get_xmp()

        if not xmp:
            xmp = XMPMeta()

        for ns in changes.keys():
            #print 'Property ', str(i[0]),':', str(i[1])
            # first of all check if namespace str(i[0]) and property name str(i[1]) exist
            prefix = None
            try:
                prefix = xmp.get_prefix_for_namespace(str(ns))
            except XMPError, err:
                print 'Error in get_prefix_for_namespace: ', err
            if prefix == None:
                #print 'prefix ', prefix[:-1] , ' does not exist.'
                try:
                    log.debug('%s %s' % (str(ns), str(changes[ns]['prefix'])))
                    res = xmp.register_namespace(
                        str(ns), str(changes[ns]['prefix']))  # CHANGE ME
                    #print 'register_namespace gave res = ', res
                except XMPError, err:
                    print 'Error in register_namespace: ', err
Пример #28
0
    def get_img_info(self, filename):
        info_filename = filename.split('.')[0] + FileBackend.METADATA_EXTENSION
        info_path = os.path.join(FileBackend.METADATA_PATH, info_filename)

        # Regenerate the metadata file if it is missing.
        if not os.path.isfile(info_path):
            info = self.__img_info__(self.__img_path__(filename))
            info['filename'] = filename
            pickle.dump(info, \
                        open(os.path.join(FileBackend.METADATA_PATH, info_filename), 'wb'), \
                        protocol=pickle.HIGHEST_PROTOCOL)

        info = pickle.load(open(info_path, 'rb'))

        # an XMP object can't be pickled, so we serialize it when saving and
        # deserialize it when loading
        xmp = XMPMeta()
        xmp.parse_from_str(info['xmp'])
        info['xmp'] = xmp

        return info
    def test_can_inject_xmp_info_png(self):
        """Verify behavior of being able to inject XMP into barren PNG"""
        # See issue 40
        srcfile = pkg.resource_filename(__name__,
                                        os.path.join("fixtures", "zeros.png"))

        with tempfile.NamedTemporaryFile() as tfile:
            shutil.copyfile(srcfile, tfile.name)

            xmpf = XMPFiles()
            xmpf.open_file(tfile.name, open_forupdate=True)
            xmp = XMPMeta()
            xmp.set_property(NS_PHOTOSHOP, "ICCProfile", "foo")
            xmpf.put_xmp(xmp)
            xmpf.close_file()

            xmpf.open_file(tfile.name, usesmarthandler=True)
            xmp = xmpf.get_xmp()
            prop = xmp.get_property(NS_PHOTOSHOP, "ICCProfile")
            xmpf.close_file()

            self.assertEqual(prop, "foo")
Пример #30
0
    def test_2bytes_codepoint(self):
        """
        Verify that we can create and read back utf-8 where some characters
        takes 2 bytes to encode.
        """
        xmp = XMPMeta()
        rdf = xmpcoverage.RDFCoverage

        # Replace 'Simple2 value' with 'stürm'
        # ü has code point 252, so takes 5+1=6 bytes to encode.
        expectedValue = u'stürm'
        if sys.hexversion < 0x03000000:
            rdf = unicode(rdf[0:272]) + expectedValue + unicode(rdf[285:])
        else:
            rdf = rdf[0:272] + expectedValue + rdf[285:]

        xmp.parse_from_str(rdf, xmpmeta_wrap=True)

        prop = xmp.get_property(xmpcoverage.NS1, "SimpleProp2")
        self.assertEqual(prop, expectedValue)

        del xmp