iOS - 通过渲染从 UIView 生成 PDF 会降低质量

2024-02-20

我使用以下方法从 UIView 生成 PDF。它们都创建了 PDF,但质量下降了:

方法一:

@implementation UIView(PDFWritingAdditions)

- (void)renderInPDFFile:(NSString*)path
{
    CGRect mediaBox = self.bounds;
    CGContextRef ctx = CGPDFContextCreateWithURL((__bridge_retained CFURLRef)[NSURL fileURLWithPath:path], &mediaBox, NULL);
    CGPDFPageRef page;
    CGContextDrawPDFPage(ctx, page);

    CGPDFContextBeginPage(ctx, NULL);

    // Also tried following commented lines but no luck
    //    CGContextSetFlatness(ctx, 0.1);
    //    CGContextSetAllowsAntialiasing(ctx, YES);
    //    CGContextSetAllowsFontSmoothing(ctx, YES);
    //    CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
    CGContextScaleCTM(ctx, 1, -1);
    CGContextTranslateCTM(ctx, 0, -mediaBox.size.height);
    [self.layer renderInContext:ctx];
    CGPDFContextEndPage(ctx);
    CFRelease(ctx);
}

@end

方法二:

- (void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename
{
    // Creates a mutable data object for updating with binary data, like a byte array
    NSMutableData *pdfData = [NSMutableData data];

    // Points the pdf converter to the mutable data object and to the UIView to be converted
    UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil);
    UIGraphicsBeginPDFPage();
    CGContextRef pdfContext = UIGraphicsGetCurrentContext();


    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData

    [aView.layer renderInContext:pdfContext];

    // remove PDF rendering context
    UIGraphicsEndPDFContext();

    // Retrieves the document directories from the iOS device
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

    NSString* documentDirectory = [documentDirectories objectAtIndex:0];
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];

    // instructs the mutable data object to write its context to a file on disk
    [pdfData writeToFile:documentDirectoryFilename atomically:YES];
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
}

我想我可能缺少 pdf 上下文的一些设置,不确定。我还使用以下方法从 UIView 创建了 png 图像,其质量完全相同:

- (UIImage *)imageFromView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    // Retrieves the document directories from the iOS device
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

    NSString* documentDirectory = [documentDirectories objectAtIndex:0];
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:@"pdf.png"];

    // instructs the mutable data object to write its context to a file on disk
    [UIImagePNGRepresentation(img) writeToFile:documentDirectoryFilename atomically:YES];
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
    return img;
}

有人能看到我做错了什么吗? 谢谢。


这是使用视网膜显示器吗?这可能是一个 contentScale 的事情。看一下这个帖子 https://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-without-loss-of-quality-on-retina-display

EDIT好的,现在您已经发布了前后照片,我看到您希望发票 UIView 在 PDF 中呈现为漂亮、高质量、可打印的矢量数据。

我非常确定 [CALayer renderInContext] 始终会生成光栅数据,因此您最好手动构建 PDF。如果您谈论的是税务发票,您真的希望布局随着下一个 iOS 更新而改变吗?

然而,你可以看看这个答案 https://stackoverflow.com/questions/7509999/ios-create-pdf-from-uiview,它不情愿地建议使用 UIView 作为 PDF 布局的模板系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS - 通过渲染从 UIView 生成 PDF 会降低质量 的相关文章

  • Grails 渲染 PDF 文件

    我正在尝试在网页中呈现 PDF 文件 但使用以下语法时 我得到了一个奇怪的字符组合 render file new File path to file pdf fileName myPdfFile pdf 有谁知道除了上面的行之外我还需要添
  • C# 3.0 使用MemoryStream将itextsharp pdf保存到数据库

    我正在尝试将 itextsharp 生成的 pdf 文件保存到数据库 但是 到目前为止我还没有成功 我正在使用 Linq to sql 这是代码 MemoryStream ms new MemoryStream Document d new
  • 如何在iOS社交框架中使用SLRequest获取facebook的电子邮件参数

    我尝试使用以下代码来获取登录 iOS 设置 Facebook 的人的电子邮件 请帮助我如何从 SLRequest 获取电子邮件 void getMyDetails if accountStore accountStore ACAccount
  • xib(Xcode8) 上 UIView/UIImageView 的大小变为 (1000, 1000)

    我在 xib 上使用自动布局来创建我的 UI 当我完成我的用户界面时 它在模拟器上运行良好 但是当我下次打开 Xcode8 时 xib 显示很奇怪 一些 UIView 和 UIImageView 变大 大小变为 1000 1000 即便如此
  • 更快地估计 CollectionView 中单元格高度的方法

    我的 UICollectionView 中有一个无限滚动 我注意到我估计单元格高度的方式是我的集合视图的瓶颈 我滚动收藏视图的次数越多 它就会导致一些长时间的延迟 有没有更好的方法来估计单元格的高度 这些单元格有不同的高度 因为我有一个UI
  • 从核心数据存储创建 .sqlite 文件?

    我在书籍和提供 sqlite 文件下载的网站上看到过教程 sqlite 文件用于核心数据 如何获取 sqlite 文件FROM应用程序或核心数据存储TO我的桌面 如果您要创建一个预填充的 sqlite 文件以与 Core Data 一起使用
  • 以编程方式将 UITextField 设置为编辑模式

    我有一个UITextField我想以编程方式设置为编辑模式 屏幕上的键盘和文本字段框中的光标 我知道当此视图出现在屏幕上时 用户将处于编辑模式 因此我希望用户不必点击文本字段 a 的 编辑 属性UITextField是只读的 所以这是行不通
  • iOS模拟器找不到SDK,可能需要重新安装SDK

    在这里 我遇到了另一个问题 今天正在开发一个 iOS 应用程序 当我运行 iPhone 5 0 模拟器的应用程序时 仅在该模拟器上遇到了一些奇怪的问题 当我尝试一次又一次地运行该模拟器时 我的 MacBook 屏幕上出现了两个弹出警报窗口
  • 将 NSData 视频文件合并为一个视频文件

    我有一堆视频文件想要合并成一个视频文件 我正在使用 NSMutableData 来完成该任务 NSMutableData concatenatedData NSMutableData alloc init for int i 0 i lt
  • IOS Swift 从数组中搜索表

    我刚刚开始学习 swift 我正在研究 tableview 和 searchbar 功能 下面我有我的数组 它是水果列表 var fruits String Apple Green Pear Green Banana Yellow Oran
  • 使用 Xcode 6 和(可能)cocoapods 生成错误

    在构建使用 cocoapods 和最新 Xcode 6 GM 版本的 iOS 项目时 我收到以下静态分析器错误 error error reading pic error no analyzer checkers are associate
  • 迁移大型 Core Data 数据库崩溃

    我有一个将产品存储在核心数据文件中的应用程序 这些产品包括作为 可转换 数据的图像 现在我尝试使用轻量级迁移添加一些属性 当我使用一个小型数据库对其进行测试时 它运行良好 但当我使用一个接近 500 MB 的大型数据库时 应用程序通常会因内
  • 如何在ios上定义可达性超时

    我使用 Reachability 类来了解我是否有可用的互联网连接 问题是当wifi可用但不能上网时 NetworkStatus currentReachabilityStatus方法花费太多时间 my code Reachability
  • 为什么 WebView 中的 dataWithPDFInsideRect 不能在 Mavericks 上创建高质量的 PDF?

    Run 示例项目 https github com tvarghese TestWebView并观察桌面上生成的输出 PDF 名为保存网页 pdf 粘贴感兴趣的代码片段 NSURL url NSBundle mainBundle URLFo
  • 如何以编程方式生成在图像顶部带有标签的维恩图图像?

    我正在尝试为 pdf 报告生成维恩图 其中文本位于不同区域的顶部 我们使用 htmldoc 生成 pdf 这会排除背景图像之上的文本 我们使用谷歌图表 API 来处理其他图像 但他们的维恩图不支持图表顶部的文本 据我所知 最简单的路径是使用
  • GIDSignIn 在提示前指定范围

    我在 iOS 上升级到 GoogleSignIn 6 0 但找不到在登录时指定登录范围的方法 我只能看到一个名为 addScopes 的 API 我可以在基本登录后指定范围 但这会导致两个单独的登录提示 这很奇怪 之前 我们可以简单地指定登
  • 我可以对图像进行动画处理吗 iOS8 LaunchScreen.xib

    问题 有没有方法可以为针对 iOS 8 1 部署的 Xcode 6 项目的 LaunchScreen xib 文件中的任何内容设置动画 Context 我正在寻找制作简单的动画来传达活动或在用户等待时分散他们的注意力 例子 加载栏 活动指示
  • Android 和 iPhone 应用程序可以使用同一个 Facebook 应用程序 ID 吗?

    我有两个具有相同名称和相同功能的应用程序 一款在安卓市场 一款在应用商店 目前仅通过 iPhone 应用程序 您可以使用我创建的 Facebook 应用程序将您的分数发布到 Facebook 墙上 我的问题是我可以使用相同的 Android
  • 使用 twitterkit 将图像发布到 Twitter

    我正在尝试使用 Twitter 的新 TwitterKit 和自定义 UI 发布图像和推文 他们提供的唯一文档是如何用他们的观点来做这件事 所以我可以弄清楚如何在没有图像的情况下做到这一点 NSMutableDictionary messa
  • Xcode 找不到我的静态库!

    这是链接器错误 i686 apple darwin10 gcc 4 2 1 Users william Documents SettingsLibrary build Debug iphonesimulator libSettingsLib

随机推荐

  • 如何在 nant 构建脚本中进行错误处理?

    我正在编写一个 NAnt 构建脚本 它负责将一些文件部署到 iss 服务器 作为其中的一部分 我想向我的脚本添加错误处理 这是我以前从未使用过的 引入错误处理不可避免地会导致对构建文件结构的思考 我认为结构是目标中逻辑的分组以及这些逻辑之间
  • helm init failed 不是有效的图表存储库或无法访问:无法获取 403 Forbidden

    不是有效的图表存储库或无法访问 无法获取https kubernetes charts storage googleapis com index yaml https kubernetes charts storage googleapis
  • 在 C++11 上下文中使用 std::Optional

    我正在编写一个小型 C 11 库 我相信其中std optional在某些可以返回的函数中将是一个很好的补充nullptr 然而 std optional是 C 17 的一项功能 由于 C 11 是一项要求 我正在寻找使用方法std opt
  • 获取数据后reactjs useEffect清理功能

    我已经阅读了一些使用 useEffect 的 Reactjs 良好实践 我遇到一种情况 我将函数分开来获取数据并在 useEffect 挂钩上调用它 在这种情况下我怎样才能做一些清理功能呢 我见过一些像这样的 useEffect 清理 us
  • Google Data Studio 中社区连接器配置的多个选项

    无论如何 在配置过程中是否可以根据第一个分组中的内容生成一个列表 例如 我知道 Google Analytics 连接器有 帐户 gt 属性 gt 视图 您必须在设置之前选择它 我想创建一个连接器 如果您输入一个网址 它会拉入 json 文
  • PHP 接受所有组合

    我看到了这个算法将采用数字或单词并找到所有可能的组合 https stackoverflow com questions 1256117 algorithm that will take numbers or words and find
  • 如何使用OpenCV在Android中调整图像亮度?

    我创建了一个在 Android 中调整亮度的示例图像 我使用Bitmap来调整亮度 但是运行时间很长 相反 我想使用 OpenCV 在 Android 中设置图像亮度 这是我的示例代码 但它只改变图像的颜色 Bitmap bmp Bitma
  • 如何在reactJS中的嵌套状态对象中使用reduce函数?

    我的状态值为 this state content text tag1 line data1 tag2 line data2 我怎样才能使用JavaScriptreduce 函数来改变值line两者的tag1 and tag2 to cha
  • 安装节点版本高于当前系统节点版本的 NPM 包时,如何抛出“包中发现较低节点版本”错误?

    如果该模块支持的节点版本低于 高于系统 服务器节点版本 我想在安装 NPM 包时抛出错误 我的用例是 我不想安装任何支持 8 及以下版本的 npm 模块 任何帮助表示赞赏 尽管文档相反 但此功能显然不起作用 无论如何我都无法让它触发 如果您
  • 如何在 Excel VSTO 插件中将 WPF 窗口居中

    问题是 WPF 窗口仅采用 system form window 因此我无法将 Excel 设置为 VSTO 应用程序中的所有者对象 因为 VSTO 插件仅公开 Excel 的 hwnd 或其活动窗口作为本机窗口 因为它是COM 这意味着当
  • CLR 如何定位 pdb 符号文件

    我想知道 CLR 如何定位 pdb 符号文件 以及是否可以覆盖此行为 我上网查看 MSDN 和其他资源 但找不到好的答案 在我的应用程序中 我将 DLL 放置在主 EXE 路径的几个子目录中 我想要一个 Symbols 目录 其中包含我的应
  • 在 R 中具有负值的 3d 黄土平滑上设置上限 0

    我有一个有点奇怪的问题 但希望有人能帮助我 我正在尝试创建湖底的表面图 然后添加一些显示植物频率的点 以便直观地了解整个湖中水生植物的分布情况 现在 我正在分别使用 R 中的 scatterplot3d 和lattice 包在 scatte
  • SceneKit - 向场景添加新的 SCNNode 会导致严重的滞后

    我发现向场景中添加 SCNNode 使用 SCNGeometry 会导致严重的滞后峰值 根据时间分析器 它必须生成几何图形 至少函数 方法是这样调用的 它是在节点添加到场景时执行的 而不是在创建节点时执行的 因此 使用 SCNNode 创建
  • 保存下载但不带文件引用

    无论如何 是否可以使用 URLLoader 下载文件 然后将其保存到磁盘而不使用文件引用或任何使用对话框的内容 这是我拥有但不起作用的 public function onDownloadComplete e Event void Down
  • Golang 中 logrus 的 CustomFormatter 显示文件名和行号

    我在用github com sirupsen logrus用于登录我的 golang 脚本 但是我想获取记录消息的文件名和行号 我可以使用下面的代码得到它 package main import fmt os runtime strings
  • Monodevelop 2.8、XCode 3.2.6、界面生成器:出口和操作

    编辑 由于我还没有安装 XCode 4 我想知道 MD 2 8 是否与 XCode 3 2 6 完全兼容 特别是 我是否能够将插座和操作与中描述的新过程连接起来机器翻译文档 http docs xamarin com ios tutoria
  • 如何在 swift 3+ 中调整键盘的滚动视图

    如何调整滚动视图以垂直补偿键盘 继续阅读 是的 我知道这是一些基本信息 但今天我随机注意到 我看到的关于这个主题的所有答案都充满了信息 版本和 或到处使用刘海 但对于 Swift 来说没有什么可靠的3 斯威夫特 4 2 代替滚动视图对于 U
  • Android ExpandableListView:单击时设置所选项目的背景颜色

    当用户单击我的子项目时 我试图为项目设置背景颜色expandableListView 这是代码 expListView setOnChildClickListener new OnChildClickListener Override pu
  • 在 FluentValidation 中覆盖默认 ASP.NET MVC 消息

    我收到验证消息 值 xxx 对于 yyy 无效 当我为双精度类型发布错误的值时 就会发生这种情况 我不知道如何改变它 不幸的是 FluentValidation 无法覆盖这一点 MVC 验证的可扩展性模型在许多地方都受到一定限制 而且我无法
  • iOS - 通过渲染从 UIView 生成 PDF 会降低质量

    我使用以下方法从 UIView 生成 PDF 它们都创建了 PDF 但质量下降了 方法一 implementation UIView PDFWritingAdditions void renderInPDFFile NSString pat