Swift - 将图像插入 PDF 不再适用于 iOS 13

2024-05-14

目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能。我有一个预览屏幕,可以在您保存 PDF 之前显示它。预览屏幕由带有 html 的 webView 组成,其中包含占位符。我能够成功地将图像插入到正确的占位符上,并将其显示在 PDF 上。但在 iOS 13 中,图像不再显示或显示太小。

折线图.html

<div class ="line-graph">
    <center class = "graph-header">Amortization Line Chart</center>
    <img class = "image" src="data:image/png;base64,#ImageData#" alt="Line Graph">
</div>

将图像转换为 Base-64 编码字符串并将其放入 #ImageData# 的代码

let isLineGraphSelected = lineGraphDictionary[.isSelectedString] as! Bool
self.lineGraphSnapshot = lineGraphDictionary[.snapshotString] as? UIImage
    if isLineGraphSelected && self.lineGraphSnapshot != nil{
        let data = self.lineGraphSnapshot.pngData()
        if let imageITData = data?.base64EncodedString() {
            LineGraphHTMLContent = LineGraphHTMLContent.replacingOccurrences(of: "#ImageData#", with: imageITData)
                    }
                } else {
                    LineGraphHTMLContent = ""
                }

如果您需要更多背景信息,请告诉我。

截图:

iOS 12.1

iOS 13.0


这是我的其他 HTML 文件的完整上下文

PDFSheet.HTML

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
            <style>
            .loan-box {
                max-width: 800px;
                margin: auto;
                padding: 30px;
                border: 1px solid #d9d9d9;
                font-size: 16px;
                line-height: 24px;
                font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;
                color: #555;
            }
            .graph-header {
                margin: auto;
                font-size: 45px;
                line-height: 45px;
                padding: 30px;
                font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
                font-weight: 300;
                color: #333;
            }
            .line-graph {
                max-width: 800px;
                margin: auto;
                padding: 30px;
            }
            .loan-box table {
                width: 100%;
                line-height: inherit;
                text-align: left;
            }

            .loan-box table td {
                padding: 5px;
                vertical-align: top;
            }

            .loan-box table tr td:nth-child(2) {
                text-align: right;
            }

            .loan-box table tr.top table td {
                padding-bottom: 20px;
                width: 100%;
                display: block;
                text-align: center;
            }

            .loan-box table tr.top table td.title {
                font-size: 45px;
                line-height: 45px;
                color: #333;
            }
            .loan-box table tr.top table td.date {
                font-size: 24px;
            }
            .loan-box table tr.heading td {
                background: #eee;
                border-bottom: 1px solid #ddd;
                font-weight: bold;
            }

            .loan-box table tr.item td{
                border-bottom: 1px solid #eee;
            }

            .loan-box table tr.item.last td {
                padding-bottom: 20px;
                border-bottom: none;
            }

            .loan-box table tr.item.last.results td{
                font-weight: bold;
            }
            .line-graph img {
                display: block;
                max-width: 800px;
                width: auto;
                height: auto;
            }

            * RTL *
            .rtl {
                direction: rtl;
                font-family: Tahoma, 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;
            }

            .rtl table {
                text-align: right;
            }

            .rtl table tr td:nth-child(2) {
                text-align: left;
            }
            </style>
    </head>

    <body>
        #RESULTS#
        #LINE_GRAPH#
    </body>
</html>

结果.HTML

<div class="loan-box">
    <table cellpadding="0" cellspacing="0">
        <tr class="top">
            <td colspan="2">
                <table>
                    <tr>
                        <td class="title">
                            #LOAN_NAME#
                        </td>

                        <td class="date">
                            #DATE_CREATED#
                        </td>
                    </tr>
                </table>
            </td>
        </tr>

        <tr class="heading">
            <td>
                Loan information
            </td>

            <td></td>
        </tr>

        <tr class="item">
            <td>
                Loan amount
            </td>

            <td>
                #LOAN_AMOUNT#
            </td>
        </tr>

        <tr class="item">
            <td>
                Interest rate
            </td>

            <td>
                #INTEREST_RATE#
            </td>
        </tr>

        <tr class="item">
            <td>
                Number of payments
            </td>

            <td>
                #NUM_OF_PAYMENTS#
            </td>
        </tr>

        <tr class="item">
            <td>
                Extra payments
            </td>

            <td>
                #EXTRA_PAYMENTS#
            </td>
        </tr>

        <tr class="item last">
            <td>
                Estimated payoff date
            </td>

            <td>
                #PAYOFF_DATE#
            </td>
        </tr>

        <tr class="heading">
            <td>
                Results
            </td>

            <td></td>
        </tr>

        <tr class="item">
            <td>
                Monthly Payments
            </td>

            <td>
                #MONTHLY_PAYMENTS#
            </td>
        </tr>

        <tr class="item">
            <td>
                Total interest
            </td>

            <td>
                #TOTAL_INTEREST#
            </td>
        </tr>

        <tr class="item">
            <td>
                Interest Savings
            </td>

            <td>
                #INTEREST_SAVINGS#
            </td>
        </tr>
        <tr class="item">
            <td>
                Time saved
            </td>

            <td>
                #TIME_SAVED#
            </td>
        </tr>
        <tr class="item last results">
            <td>
                Total loan amount
            </td>

            <td>
                #TOTAL_LOAN#
            </td>
        </tr>
    </table>
</div>

我用来捕获图像的功能也可能在 iOS 13 中受到影响。我注意到,当我在 CSS 中将图像的宽度增加到疯狂的数量时,图像的分辨率非常低。这让我觉得 iOS 13 中生成的图像非常小。为什么?我没有什么神圣的想法。

func takeScreenshot() -> UIImage {

        // Begin context
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale)

        // Draw view in that context
        drawHierarchy(in: self.bounds, afterScreenUpdates: true)

        // And finally, get image
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        if (image != nil)
        {
            return image!
        }
        return UIImage()
    }

新发现

我相信问题出在上面的 takeScreenshot 函数中。我打印了图像变量,这就是我发现的。

iOS 12

Optional(<UIImage: 0x6000016fc070> size {575.33333333333337, 350} orientation 0 scale 3.000000)

iOS 13

Optional(<UIImage:0x6000013637b0 anonymous {575.33333333333337, 350}>)

为什么尺寸被匿名取代,为什么方向和比例缺失?如果我能回答这个问题,那么我就能解决这个恼人的问题。


Solved

我发现了这个问题。我的解决方案发布在下面。


要解决此问题,您可以添加/分配高度并使用两种方式,一种是在中分配高度和宽度line-graph类或第二个在内联样式方法中按百分比(%)或像素(px)分配高度和宽度<div>标签见下面的代码。

<style>
div.line-graph {
 width:100px;
  height:100%;  
}
</style>

OR

<div class ="line-graph" style="height:100px; width:100%; background:#ffffff">
    <center class = "graph-header">Amortization Line Chart</center>
    <img class = "image" src="data:image/png;base64,#ImageData#" alt="Line Graph">
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift - 将图像插入 PDF 不再适用于 iOS 13 的相关文章

随机推荐

  • Mysql获取特定表的最后一个id

    我必须从特定的插入表中获取最后的插入 ID 可以说我有这个代码 INSERT INTO blahblah test1 test 2 VALUES test1 test2 INSERT INTO blahblah2 test1 test 2
  • GoogleDrive + Alamofire:上传具有属性的文件

    我正在尝试通过 Swift 2 Alamofire 将文件 参数上传到 Google Drive 在下面的代码中 我更改了以下行 https www googleapis com upload drive v3 files uploadTy
  • Mongo按动态字段排序

    所以我传入了一个动态变量 它是我想要排序的字段的名称 假设下面的 sortVariable 可能等于 price createdAt name 等 这不起作用 我该怎么做 function findStuff sortVariable va
  • SQL Server 不使用索引将日期时间与非空进行比较

    我有一个与其他任何表都不相关的简单表 它有一个非 PK 列 它是一个日期 我已经为该列创建了一个非聚集索引 如果我提出这个查询 select from table where datecolumn is not null 但如果我删除 no
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 在 Scala 中将元素追加到列表末尾

    我无法添加 type 元素T到一个列表中List T 我尝试过myList myElement但它似乎创建了一个奇怪的对象并访问myList last始终返回放入列表中的第一个元素 我怎么解决这个问题 List 1 2 3 4 Result
  • 无需构建树即可预测霍夫曼压缩比

    我有一个二进制文件 我知道其中每个符号出现的次数 如果我要使用霍夫曼算法压缩它 我需要预测压缩文件的长度 我只对假设的输出长度感兴趣 而不对单个符号的代码感兴趣 因此构建霍夫曼树似乎是多余的 作为一个例子 我需要得到类似的东西 包含 4 个
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 子类 B 继承自模板类 A [重复]

    这个问题在这里已经有答案了 我最近偶然发现了如下代码 但我无法理解它 template
  • Winform 上的 C# ComboBox 是否有 BeforeUpdate

    我来自 VBA 世界 记得有一个BeforeUpdate我可以在组合框上进行调用 现在我使用 C 并且喜欢它 我想知道是否有一个BeforeUpdate呼吁ComboBox在 Winform 上 我可以制作一个不可见的文本框并在那里存储我需
  • 生成一个新终端并写入其标准输出

    我有一个应用程序 它使用 GUI 来完成与用户的大部分界面 不过 我想要一个单独的终端窗口 我可以写入一些错误检查 原始值等 我知道我可以使用以下命令生成一个新终端system 命令 但我不知道是否可以进行交互 在最好的情况下 我希望有一个
  • 定时任务应该放在哪一层?

    我正在尝试使用分层架构来实现 DDD 应用程序 我有 基础设施层 实现应用程序的技术特定部分的层 领域层 包含领域模型的层 应用层 包含与领域模型交互的干扰的层 接口层 从外部接收事件的层 经典的 3 层 基础设施 架构非常清晰 但我的应用
  • 对 URL 进行编码 C#

    所以我有一个看起来像这样的 URL http www test com folder1 id 3 但基本上 当他们单击按钮时 我想在 URL 栏中显示与该 id 关联的值的名称 例如 id 3 是名为 Rollex 的手表 所以我想要读取
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • CouchDB 中的分页?

    我将如何实现分页所需的查询 基本上 当请求第 1 页时 获取前 5 个条目 对于第 2 页 获取接下来的 5 页 依此类推 我计划通过 couchdb python 模块使用它 但这不会对实现产生任何影响 The CouchDB 指南 ht
  • 如何解构 React props 并仍然访问其他 props?

    我很好奇如果我想要所有的 props 但也想要解构单个属性 那么组件的参数 props 是否可以像导入一样解构 我想这更像是一个 JavaScript 问题 而不是一个 React 问题 但是举个例子 import React useEff
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 为什么 C11 标准不删除不安全的 strcat()、strcpy() 函数?

    C11 C 14标准已经下降gets 本质上不安全的函数会导致安全问题 因为它不会在缓冲区溢出时执行边界检查结果 那么为什么C11标准不下降strcat strcpy 功能 strcat 函数不会检查第二个字符串是否适合第一个数组 strc
  • 用于从某些标记生成 ASCII 图表的工具?

    有没有一种工具可以从某种标记生成 ASCII 图表 用例 能够快速创建和编辑可嵌入 javadoc 或任何其他注释 中的图表 类似于允许我们编写一些标记的内容 A HAS gt B B HAS gt C 该工具将生成可视化结果 A HAS
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF