Python3使用pyobjc-framework-Quartz调用CGDataProviderCreateWithFilename报错如何解决
错误原因
- Python2与Python3的默认字符串类型存在本质差异:Python2中的
str类型是字节序列,刚好适配CGDataProviderCreateWithFilename底层C接口要求的char*类型,因此可以直接传参运行;Python3中的str类型为Unicode字符串,无法被PyObjC的类型转换逻辑识别为C字符类型,触发类型转换报错。 - 采用ctypes的
c_char_p转换路径不生效,是因为PyObjC框架有独立的Python-C类型映射规则,无法识别ctypes封装的指针对象,因此转换后仍然不符合接口传参要求。
解决方案
将路径字符串编码为UTF-8格式的字节串后传入即可,修改后的代码如下:
provider = Quartz.CGDataProviderCreateWithFilename(input_file_path.encode('utf-8')) pdf = Quartz.CGPDFDocumentCreateWithProvider(provider)
如果路径包含非ASCII字符,只需保证input_file_path本身是合法的Unicode字符串,编码为UTF-8字节串后即可正常被底层接口识别。
内容的提问来源于stack exchange,提问作者Ryan Loggerythm
相关产品推荐
相关产品推荐

