如何在 DataTables 中使用 pdfhtml5 导出 标签

2023-12-03

我想导出<a>使用 DataTables 中的单元格内的标签或链接pdfhtml5.

截至目前,该链接显示为纯文本。如何打印它(包括其格式)?


这是一个两步过程:

Step 1

使用数据表exportOptions.format函数将完整的 HTML 文本传递给 PDF 制作者(而不仅仅是传递内部文本)。

exportOptions: {
  format: {
    body: function ( inner, rowidx, colidx, node ) {
      console.log( "in format" );
      return inner;
    }
  }
}

Step 2

处理 PDF 文档,转换为 HTML<a>标记为PDF建立链接.

您可以使用数据表customize为此功能。

customize: function ( doc ) {
  processDoc(doc);
}

The processDoc下面的可运行演示中提供了上面引用的函数。它使用 JavaScript 从 HTML 中提取链接并显示文本。它还添加了一些样式,使最终结果看起来更像是可点击的链接。

$(document).ready(function() {

  var table = $('#example').DataTable( {
    dom: 'Brftip',
    buttons: [
      { 
        extend: 'pdfHtml5', 

        exportOptions: {
          format: {
            body: function ( inner, rowidx, colidx, node ) {
              return inner;
            }
          }
        },

        customize: function ( doc ) {
          processDoc(doc);
        }

      }  
    ]
  } );

} );

function processDoc( doc ) {
  let tableBody = doc.content[1].table.body;
  tableBody.forEach(function( row ) {
    row.forEach(function( cell ) {
      let cellText = cell.text;
      if (cellText.startsWith( '<a href=' )) {

        let textStart = cellText.indexOf(">") +1;
        let textEnd = cellText.indexOf("<", textStart);
        let text = cellText.substring(textStart, textEnd);

        let linkStart = cellText.indexOf("\"") +1;
        let linkEnd = cellText.indexOf("\"", linkStart);
        let link = cellText.substring(linkStart, linkEnd);

        cell.text = text;
        cell.link = link;
        cell.color =  '#1a0dab';
        cell.decoration = 'underline';
      }
    });
  });
}
<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Demo</title>

  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.12.1/css/jquery.dataTables.css"/>
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/buttons/2.2.3/css/buttons.dataTables.css"/>
 
  <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jszip/2.5.0/jszip.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
  <script type="text/javascript" src="https://cdn.datatables.net/1.12.1/js/jquery.dataTables.js"></script>
  <script type="text/javascript" src="https://cdn.datatables.net/buttons/2.2.3/js/dataTables.buttons.js"></script>
  <script type="text/javascript" src="https://cdn.datatables.net/buttons/2.2.3/js/buttons.html5.js"></script>

  <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css">

</head>

<body>

<div style="margin: 20px;">

    <table id="example" class="display dataTable cell-border" style="width:100%">
        <thead>
            <tr>
                <th>Name</th>
                <th>Position</th>
                <th>Office</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Tiger Nixon</td>
                <td>System Architect</td>
                <td><a href="https://en.wikipedia.org/wiki/Edinburgh">Edinburgh</a></td>
            </tr>
            <tr>
                <td>Donna Snider</td>
                <td>Customer Support</td>
                <td><a href="https://en.wikipedia.org/wiki/New_York_City">New York</a></td>
            </tr>
        </tbody>
    </table>

</div>



</body>
</html>

上述演示的最终结果 PDF 如下所示:

generated PDF


注意:如果您不想处理其他列中的其他 HTML,那么您可能需要优化您的body函数 - 所以,类似:

if ($(node).children('a').length > 0) {
  return whatever you need here;
} else {
  return inner;
}

后续问题(来自评论):

如果一个单元格中有多个链接怎么办?我怎样才能导出它?

是的,您可以通过多种方式做到这一点。

由于您已经在使用 jQuery(用于 DataTables),因此您可以使用 jQuery 的parseHTML()功能。这会将 HTML 字符串(作为文本)转换为相关 HTML 节点的数组。

然后,您可以迭代该数组以一次处理每个链接(并且还处理可能位于同一数据单元格中的任何其他文本)。

一个基本的例子:

我们假设一个 DataTable 单元格包含以下内容:

Some text <a href="whateverA">Edinburgh</a> and then <a href="whateverB">New York</a> the end.

The parseHTML()函数会将其拆分为一个包含以下 5 个单独节点的数组 - 然后您可以将其作为 5 个单独的字符串进行处理:

Some text 
<a href="whateverA">Edinburgh</a>
 and then 
<a href="whateverB">New York</a>
 the end.

这是一个演示:

let str = 'Some text <a href="whateverA">Edinburgh</a> and then <a href="whateverB">New York</a> the end.'
let nodes = $.parseHTML( str );
nodes.forEach(function( node ) {
  if ( node.nodeType === Node.TEXT_NODE ) {
    console.log( node.data ); // handle as PDF plain string
  } else {
    console.log( node.outerHTML ); // handle as PDF link
  }
})
<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>New tab</title>
        <script src="https://code.jquery.com/jquery-3.6.0.js"></script>
    </head>
    <body>
        <div>See the results in the console, below.</div>
    </body>
</html>

最后步骤:

现在,您需要创建一个包含 5 个 PDF 元素的数组,而不是创建仅包含单个 PDF 格式链接的 PDF 单元格(请参阅示例)here),并将该数组添加到单元格中。

myPdfCellContent: [ 
  'Some text ',
  { text: 'Edinburgh', link: 'whateverA' },
  ' and then ',
  { text: 'New York', link: 'whateverB' },
  ' the end.'
]

您可以将此方法集成到现有的 DataTables 解决方案中,以处理一个单元格中的多个链接。

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

如何在 DataTables 中使用 pdfhtml5 导出 标签 的相关文章

  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • IE 中的 jQuery .width(val) 错误 - 无效参数

    通过ajax加载内部div book table 后 我想调整正文的宽度以适应更大的内容 var new width parseInt book table css width 407 body width new width 在 FF 和
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • jquery-ui 1.9.1 ui-draggable 不适用于 ie9 和 ie10

    我在 IE 9 和 10 中无法使 draggable 工作 主要使用的 javascript 包有 jquery ui 1 9 1 min js 和 jquery 1 8 2 min js 代码基本上是这样的 creation texts
  • wp_unregister 和 wp_enqueue

    有人建议我使用 wp unregister 和 wp enqueue 将 wordpress jquery 库替换为 google 托管的库 因为 wordpress 有一些问题 然而 当我尝试将这些插入我的 WordPress 网站时 它
  • jquery:$().animate() 不是函数

    我已经做了很多搜索 但无法找到我的问题的答案 所以这里是 我正在尝试创建一个滑出切换菜单本教程 http alijafarian com jquery horizontal slideout menu 我收到一个错误slideoutMenu
  • 如何在Jquery-Select2中设置多值选择中的选定值?

    我正在绑定我的下拉菜单Jquery Select2 它工作正常 但现在我需要绑定我的多值selectBox通过使用Jquery Select2 我的下拉菜单 div class divright div
  • 仅使用 Jquery 验证的字母

    我尝试了文章中的每个解决方案one https stackoverflow com questions 4115372 jquery validate plugin adding a custom validator to accept l
  • 文件上传后如何隐藏上传按钮?

    我使用 blueimp 和 jquery UI 进行文件上传 我想在上传文件后隐藏此按钮 并在照片被删除时再次显示它 我该怎么做呢 这是我的 HTML
  • 如果我拒绝确认,如何防止更改选择框值

    我正在使用国家 地区选择框 当用户选择一个国家 地区时 会出现添加分支链接 并且用户在该国家 地区下添加分支 但是当用户想要更改国家 地区时 则应销毁有关该国家 地区的所有分支 在更改国家 地区之前 会出现一个确认框并显示警告 一切正常 但
  • 在jqGrid中查找当前页码

    如何在 jqGrid 中找到当前页码 当然使用 jQuery 另外我怎么知道总共有多少页 这应该可以做到 sp 1 text total pages ui pg input val current page Edit 我发现了一个更好的方法
  • 在 WCF 服务上启用 CORS。获取 HTTP 405:不允许的方法

    我正在尝试在 WCF 服务上启用 CORS 当我尝试从客户端发送请求时 该请求是使用OPTIONS动词 我总是得到一个HTTP 405 Method not allowed error 如果我尝试使用 Fiddler 并使用以下命令创建相同
  • jQuery 验证:如何不显示错误?或者如何将错误显示为工具提示?

    我希望我的错误浮动在未验证的输入字段上方 左对齐 我怎样才能做到这一点 如果不能 我怎样才能关闭错误 我仍然希望字段能够验证 并在错误时突出显示 但不希望显示实际的错误消息 我似乎无法在 jQuery 文档中找到任何可以让我打开 关闭它们的
  • 是否可以禁用特定 jQuery Ajax 调用的 Turbolinks 以防止页面刷新和滚动?

    我有一个 Rails 5 应用程序 非常想使用 Turbolinks 在应用程序中 有几个 PATCH ajax 调用 它们只是用新数据更新服务器 但不需要担心更新页面的状态 每当这些 ajax 请求返回时 Turbolinks 就会刷新页
  • Jquery ajax请求,等待最新请求完成

    我有一个文本框 每次用户输入一个字母时 我都会使用 ajax 请求进行搜索 并为用户 实时 显示结果 通常 当用户键入字母时 发出请求所需的时间比用户输入新字母所需的时间更长 因此在第一个请求结束之前发出新请求 如果第一个请求能够在我执行下
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • jQuery 选择下一个

    我有一个简单的div布局html 有一个函数 当鼠标悬停在className为 personal icon email 的div上时 我将调用JS函数并显示className为 img info mask 的隐藏div div class
  • Jquery,清除/清空 tbody 元素的所有内容?

    我认为这会相当简单 但似乎空方法无法清除我拥有的 tbody 如果有人知道执行此操作的正确方法 我将不胜感激 我只想删除 tbody 中包含的所有内容 到目前为止我正在尝试 tbodyid empty HTML table tbody tr
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一

随机推荐

  • 将自定义计算添加到 magento 中的购物车总计和总计

    我正在网站上工作 我想在购物车总额和总计中添加 减去费用 我正在触发此事件以捕获购物车详细信息 sales order save after 在观察者中我使用此代码获得了价格 public function modifyPrice Vari
  • 使用 awk 或 sed 基于公共列合并两个 csv 文件 [重复]

    这个问题在这里已经有答案了 我有一个两个 CSV 文件 两个文件中有一个公共列 并且一个文件中有重复项 如何使用 awk 或 sed 合并两个 csv 文件 CSV 文件 1 5 1 20 user mark Type1 445566 5
  • 如何为for循环中除最后一项之外的每一项添加分隔符

    在下面的循环中 如何从循环中的latt键中删除逗号 var result These are the results jQuery each item keyterms terms function i kw for key in keyw
  • 访问 wpf c# 应用程序中其他类中 XAML 的按钮和复选框的值

    我正在开发 WPF Kinect 项目 它是 Windows Kinect 的开发人员工具包示例之一 称为 Kinect Explorer 您可以从 Kinect 开发者工具包 SDK 1 5 版下载它 在 kinectwindow xam
  • Angular:使用 Renderer2 添加 CSS 变量

    是否可以使用添加内联样式CSS变量Renderer2 我尝试了以下方法 但它不起作用 import Component OnChanges Output ViewChild Renderer2 ElementRef ViewEncapsul
  • Node CLI 工具评估字符串

    有没有办法使用 NodeJS CLI 工具来评估一串 Javascript 代码 例如 使用 Perl 将会是perl e code 使用Pythonpython c code 与红宝石ruby e code 并且使用 PHP php r
  • width:auto 对于 字段

    CSS新手问题 我想width auto for a display block元素的意思是 填充可用空间 然而对于一个
  • 从数据属性将字符串解析为对象[重复]

    这个问题在这里已经有答案了 我在使用 jQuery 验证插件时遇到了很多麻烦 解决这个问题的唯一方法是使用 submitHandler属性并在其中做一些技巧 其中检查触发器的父级是否是字段集以及是否有data submit handler属
  • Android布局文件夹可以包含子文件夹吗?

    现在 我将每个 XML 布局文件存储在 res layout 文件夹中 因此管理小型项目是可行且简单的 但是当存在大型且繁重的项目时 则应该有一个层次结构和布局文件夹内需要的子文件夹 for e g layout layout person
  • 意外的括号“[” - PHP [重复]

    这个问题在这里已经有答案了 我正在为我的小应用程序团队的 Java 代码编写一个小型存储库 但我的代码中到处都是这个错误 base explode class 0 仅此问题出现one每次都一行代码 据我所知 上面是正确的PHP语法 那么这是
  • 使用 SentiWordNet 获取不正确的分数

    我正在使用 SentiWordNet 进行一些情感分析 我参考了这里的帖子如何使用 SentiWordNet 然而 尽管尝试了各种输入 我还是得到了 0 0 分 我在这里做错了什么吗 谢谢 import java io BufferedRe
  • 使用 Boost 库的 CMake Windows 10 库未正确找到

    像许多其他人一样 我在 Windows 上使用 boost 库时遇到问题 在 Ubuntu 16 04 上 它与 libboost all dev 配合得很好 但在 Windows 上我遇到了很多问题 我尝试构建一个 cryptonote
  • 用于子集索引搜索的数据结构

    我正在研究一个时间 2019 03 17 标签 c jqueryimplementation我正在尝试找出一种有效的算法来在整个 DOM 的子集中定位元素 例如子选择器 目前 我正在构建 DOM 时创建常用选择器的索引 class id 和
  • emu8086 上的 Dos 指令 3Bh 更改工作目录

    我最近开始学习x8086指令 对指令的了解比较少 我试图使用 dos 函数 3Bh 更改当前工作目录 然后使用 39h 在该目录上创建一个名为 test2 的文件夹 不明白问题是什么 还是 emu8086 的问题 MODEL SMALL C
  • 通过公式更改单元格时的时间戳 (Excel)

    我需要一种方法来为相邻单元格添加时间戳 该单元格的值通过公式发生变化 使用this例如 我需要工作表 1 上与 A1 相邻的单元格来标记单元格值更改时的日期和时间 当单元格值通过公式更改时 我链接到上面的示例会启动一个消息框 当单元格值包含
  • CSS 边框向内弯曲

    I want to build the container with bended borders inside the element Is it possible to do using only css If it is contai
  • Angular 2 表单“找不到控件”

    我正在尝试使用 Angular 2 Forms 进行验证 但是当我尝试添加多个控件时 似乎它只是被忽略了 我遵循了许多不同的指南 看看其他人是如何做的 但这些方法似乎都不起作用 我一直在我的模板中做的是
  • 使用 QT 设计器创建的 PyQt5 程序从终端打开时不显示任何窗口

    我使用 QT Designer 没有任何问题 但今天我开始了一个新的 ubuntu 18 04 安装 但这一次当我从终端运行 PyQt5 程序时 它们没有显示任何窗口 从atom runner运行时也有同样的问题 它甚至没有显示任何窗口 错
  • 如何将用户信息从登录页面传递到主页?

    Error An object reference is required for the non static field method or property User Picture 如何将用户信息从登录页面传递到主页 线上错误Pic
  • 如何在 DataTables 中使用 pdfhtml5 导出 标签

    我想导出 a 使用 DataTables 中的单元格内的标签或链接pdfhtml5 截至目前 该链接显示为纯文本 如何打印它 包括其格式 这是一个两步过程 Step 1 使用数据表exportOptions format函数将完整的 HTM