jsPDF with Cordova - 添加图像

2024-03-01

我正在尝试使用 jsPDF 库生成 PDF(https://github.com/MrRio/jsPDF https://github.com/MrRio/jsPDF)从移动 Cordova 应用程序中。我目前正在 Android 4.0.4 设备上测试该应用程序,但它还需要在 Windows mobile 8 上运行。PDF 文档中的文本显示正确,但任何图像都是混乱的。见下图

我确实找到了这个页面(https://coderwall.com/p/nc8hia https://coderwall.com/p/nc8hia)这似乎表明 jsPDF 在 Cordova 中显示图像存在问题(请参阅评论),但作者从未发布后续内容。有谁能够将 jsPDF 与 Cordova 一起使用并正确地将图像添加到生成的 PDF 中吗?我的代码如下,任何帮助或建议将不胜感激。

function demoReceipt() {
    var img = new Image();

    img.onError = function() {
        alert('Cannot load image: "' + url + '"');
    };
    img.onload = function() {
        createPdf2(img);
    };
    img.src = 'img/testlogo.png';
}



function createPdf2(myLogo) {
    //  var doc = new jsPDF('p', 'pt', 'jontype');

    var doc = new jsPDF('p', 'pt', 'letter');

    doc.setProperties({
        title : 'Fueling Receipt',
        author : 'Jon Hoffman',
        creater : 'Jon Hoffman'
    });

    doc.addImage(myLogo, 'PNG', 5, 5, 140, 30);
    doc.setFontSize(12);
    doc.text(10, 40, 'Sample PDF receipt');
    doc.setFontSize(8);
    doc.text(10, 45, 'Smaller text - new');

    var pdfOutput = doc.output();

    //NEXT SAVE IT TO THE DEVICE'S LOCAL FILE SYSTEM
    //Requires  cordova plugin add org.apache.cordova.file
    console.log("file system...");
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {

        console.log(fileSystem.name);
        console.log(fileSystem.root.name);
        console.log(fileSystem.root.fullPath);

        fileSystem.root.getDirectory("myPDFs", {
            create : true,
            exclusive : false
        }, function(dir) {

            fileSystem.root.getFile("myPDFs/test.pdf", {
                create : true
            }, function(entry) {
                var fileEntry = entry;
                console.log(entry);

                entry.createWriter(function(writer) {
                    writer.onwrite = function(evt) {
                        console.log("write success");
                    };

                    console.log("writing to file");
                    writer.write(pdfOutput);
                }, function(error) {
                    console.log(error);
                });

            }, function(error) {
                console.log(error);
            });
        }, function(error) {
        });
    }, function(event) {
        console.log(evt.target.error.code);
    });
}

我在这篇博客文章的帮助下解决了这个问题:https://coderwall.com/p/nc8hia https://coderwall.com/p/nc8hia。该帖子中使用的 0.90 版本与我使用的版本之间似乎确实存在显着差异https://github.com/MrRio/jsPDF https://github.com/MrRio/jsPDF但解决方案几乎相同。 首先,在 MyRio 的版本中,您可以在不修复 Igor 帖子中指出的 Blob 问题的情况下生成 PDF。您所需要的只是通过调用“doc.ouput()”生成 PDF 输出,然后使用 Cordova 文件系统插件保存它。所以我认为我不必创建 Blob(这是我错的地方)。
Igor(来自 coderwall 帖子)用一些额外的代码回答了我的问题,但是当我从 MyRio 版本搜索 jspdf.js 文件时,我看到代码(更紧凑的版本)已经在第 734 – 738 行的代码中:

var data = buildDocument(), len = data.length,
    ab = new ArrayBuffer(len), u8 = new Uint8Array(ab);

while(len--) u8[len] = data.charCodeAt(len);
return new Blob([ab], { type : "application/pdf" });

但我也注意到,Igor 在他的第一篇文章中修复的 blob 创建代码位于该代码块的末尾。所以我注释掉了“return new Blob([ab], { type : “application/pdf”});”行并放入 Igor 帖子中的以下代码,并稍微更改变量名称:

try
{
    var blob = new Blob([ab], {type: "application/pdf"});
    console.debug("case 1");
    return blob;
 }
 catch (e)
 {
     window.BlobBuilder = window.BlobBuilder ||
                                          window.WebKitBlobBuilder ||
                                          window.MozBlobBuilder ||
                                          window.MSBlobBuilder;
     if (e.name == 'TypeError' && window.BlobBuilder)
     {
         var bb = new BlobBuilder();
         bb.append(ab);
         console.debug("case 2");
         return bb.getBlob("application/pdf");

      }
      else if (e.name == "InvalidStateError")
      {
          // InvalidStateError (tested on FF13 WinXP)
          console.debug("case 3");
          return new Blob([ab], {type: "application/pdf"});

       }
       else
       {
           // We're screwed, blob constructor unsupported entirely
           console.debug("Errore");
       }
 }

然后当我生成 pdfOutput 时,在我的代码中,我改变了

var pdfOutput = doc.output();

to

var pdfOutput = doc.output(“blob”);

它起作用了。 我希望这篇文章能够帮助遇到同样问题的其他人。

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

jsPDF with Cordova - 添加图像 的相关文章

随机推荐

  • 在 C# 中异步加载图像

    我正在开发一个 C WPF 应用程序 它加载大量图像并将其显示为缩略图 我想以多线程的方式来做 因此我尝试实现一个BackgroundWorker BackgroundWorker的DoWork 的代码 string files e Arg
  • 使用 @PreUpdate 的问题

    我有以下课程 MappedSuperclass public abstract class MappedModel Id GeneratedValue strategy GenerationType AUTO Column name id
  • 引用另一个矩阵后,numpy.ones 的第一行仍然被填充

    我有一个矩阵 A 其值如下所示 使用 numpy ones 创建矩阵 B 并通过索引 i 行和 j 列将值从 A 分配到 B 后 生成的 B 矩阵保留第一行 1 来自原始的 B 矩阵 我不确定为什么下面提供的代码会发生这种情况 命令行生成的
  • 如何以编程方式将单击事件分配给以编程方式创建的项目符号列表?

    我尝试以编程方式编写一个方法并将其分配为 onclick 事件调用的方法 但有些地方不对 该方法未被调用 BulletedList bulletList new BulletedList 我使用将项目添加到项目符号列表中bulletList
  • 为什么我的 ' 字符在发布到我的服务器时变成了 \'?

    我对HTML不是很强 每次都会遇到一些编码问题 在这里 我有一个类似的表格
  • 如何给子类提供静态字段?

    我有一个名为 operation java 的抽象超类和几个扩展该类并表示操作的子类 每个这样的子类应该包含一个规范化内容的数组 该数组应该是静态的 因为它全局保存 我有以下示例 abstract class Operation priva
  • Python继承:将所有参数从基类传递到超类

    我还不太习惯 Python 中的类继承 我想要做的只是在创建超类时将所有参数从基类传递给超类 class A def init self a b self a a self b b def do self c self a self b r
  • HTML 拖放 - 如何设置*传出*拖放(到桌面)的文件名

    我试图让用户可以将图标从网络浏览器拖动到桌面 并创建一个文本文件 我已经记下了内容部分 但我不知道如何设置文件名 我尝试过变异dataTransfer files但这是只读的 我不知道如何实现这一目标 class CrashReport e
  • 在 JMeter 的 BeanShell Sampler 中将字符串解析为整数

    我试图在 JMeter 中将字符串解析为整数 但由于以下错误而失败 如果我尝试打印 vars get 返回的字符串 它们看起来不错 2014 06 28 00 08 52 WARN jmeter assertions BeanShellAs
  • Hibernate:为什么使用或不使用类似天气的字段绑定显式@JoinColum注释?

    Is JoinColum当我们使用任何关联类型注释时隐式指定 例如 OneToOne OneToMany etc 这是摘自Student实体与Laptop实体 情况1 不使用显式 JoinColum OneToMany cascade Ca
  • boost::thread::id 的 tr1::hash 吗?

    我开始使用unordered set类来自tr1命名空间以加速对普通 基于树 STL 的访问map 但是 我想在 boost 中存储对线程 ID 的引用 boost thread id 并意识到这些标识符的 API 非常不透明 以至于您无法
  • 如何锁定和解锁 SQL SERVER 表?

    冒着过度解释我的问题的风险 我会错误地提供太多信息 我正在创建一个批量上传过程 将数据插入两个表中 这两个表大致如下所示 TableA是一个自引用表 允许 N 级引用 Parts self referencing table PartId
  • 语法错误,意外的 T_ENCAPSED_AND_WHITESPACE,期望 T_STRING 或 T_VARIABLE 或 T_NUM_STRING [重复]

    这个问题在这里已经有答案了 我已经盯着这个代码几个小时了 我不知道我的错误在哪里 我知道这种语法错误通常是由于缺少或不合适的大括号或单 双引号的一些问题而出现的 而且我不确定我的代码中是否存在这样的错误 我现在只是想修复我的语法 以便我可以
  • 模板部分专业化 - 有现实世界的例子吗?

    我正在思考partial specialization 虽然我理解这个想法 但我还没有看到这种技术在现实世界中的任何用法 Full specialization被用在很多地方STL所以我对此没有问题 你能告诉我一个现实世界的例子吗 part
  • 在 Mercurial 中进行合并时忽略空格

    在 Mercurial 中进行合并时 我们遇到了一个问题 其中空白更改会导致合并冲突 从而掩盖了我们可能遇到的任何 真实 冲突 并使合并成为一场噩梦 我们最近遵循了一种格式样式 该样式更改了某些分支中文件的缩进 并且从那时起合并几乎变得不可
  • 如何在Java字符类中表示空字符

    我想在 Java 中将空字符表示为 在字符串中 像那样char ch an empty character 其实我想替换一个字符而不留空格 我认为理解这意味着什么就足够了 没有字符 甚至没有空间 您可以分配 u0000 或 0 为此 请使用
  • 使用对话框框架的 primefaces 对话框未弹出

    我正在尝试使用 primefaces 对话框框架来简化我的代码 我已经按照 primefaces 4 0 用户指南中的示例进行操作 但它不起作用 我几乎逐字复制了该示例 创建了三个文件 一个包含对话框的文件 一个调用对话框的文件和一个支持
  • 在 R 中的命名空间中导入有什么好处?

    R 的命名空间机制允许人们export然后对用户可见的功能 此外 它还允许import来自其他包的函数 虽然出口的好处是显而易见的 但我在理解进口的好处时遇到了更多问题 一个好处似乎是 可以使用其他包中的功能 而无需附加包 从而节省内存 这
  • Objective-C/iOS:在后台保持蓝牙连接处于活动状态

    我已经研究了几天了 看起来当手机进入睡眠状态或应用程序在后台时 不可能保持蓝牙连接 然而 我发现一个应用程序声称它们可以一直运行 运行守护者应用程序 http itunes apple com ca app runkeeper id3002
  • jsPDF with Cordova - 添加图像

    我正在尝试使用 jsPDF 库生成 PDF https github com MrRio jsPDF https github com MrRio jsPDF 从移动 Cordova 应用程序中 我目前正在 Android 4 0 4 设备