公司做金融类的业务,需要用到一个关于电子签章问题,在电脑上,用正常的PDF阅读器.
服务器会使用使用一些第三方的电子签章,最后在app上显示.
image.png
先看看对比
正常的:
正常样式.png
非正常的:
非正常的.png
一些文章中介绍
iOS展示pdf签名时遇到的问题及解决办法
iOS下pdf无法显示签名的问题
如果直接用原生的UIWebView去加载这些添加了电子签章的PDF之后会无法显示.
stackoverflow上的解释是:
The signature you saw in the PDF file is the appearance of the signature field widget. The field widget is a specific PDF annotation.
The problem with the default PDF rendering engine in iOS (used by UIDocumentInteractionController, QuickLook framework, etc) is that it does not display the annotations on the PDF page, it displays only the main page content.
The only solution is to use a 3rd party PDF rendering engine, such as MuPDF, Foxit, PDFTron, etc.
中文意思:
(谷歌翻译)您在PDF文件中看到的签名是签名字段小部件的外观。 字段小部件是特定的PDF注释。
iOS中的默认PDF渲染引擎(由UIDocumentInteractionController,QuickLook框架等使用)的问题是它不会在PDF页面上显示注释,它只显示主页面内容。
唯一的解决方案是使用第三方PDF渲染引擎,如MuPDF,Foxit,PDFTron等。
尝试了用MuPDF,普遍都在指导使用这个,但是个人觉得缺点太多.
- 集成之后项目整个项目瞬间大了400M,app打包出来也打了一倍.
- 需要设置项目配置,调到你怀疑人生.
- 晰度太差,这个是最主要的.
找到一个不错的解决办法:
GitHub上找到别人写的不错的代码,里面有4中加载PDF的方式 : OpenPDFDemo
我是使用了QuickLook.framework解决了我的问题
简答粗暴,不需要集成. 预先准备一个加了电子签章的pdf,就叫"a.pdf"吧
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 100, 44);
btn.center = self.view.center;
[btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
[btn setTitle:@"btnClick" forState:UIControlStateNormal];
[btn setBackgroundColor:[UIColor redColor]];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[self.view addSubview:btn];
}
- (void)btnClick {
QLPreviewController *previewController = [[QLPreviewController alloc] init];
previewController.dataSource = self;
[self presentViewController:previewController animated:YES completion:nil];
}
#pragma - mark QLPreviewControllerDataSource
- (NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller
{
return 1;
}
- (id <QLPreviewItem>)previewController: (QLPreviewController *)controller previewItemAtIndex:(NSInteger)index
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"pdf"];
return [NSURL fileURLWithPath:path];
}
尝试结果 :
测试结果
网友评论