php如何操作pdf文件_php生成和解析pdf文档

答案:PHP操作PDF依赖第三方库,生成常用Dompdf、TCPDF,解析多用Smalot/pdfparser。Dompdf适合HTML转PDF,支持动态数据嵌入、图片及字体(需配置),TCPDF适用于精确绘图,解析则面临文本顺序错乱、表格识别难等挑战,需结合OCR或外部工具处理扫描件和复杂布局。

php如何操作pdf文件_php生成和解析pdf文档

PHP操作PDF文件,无论是生成还是解析,主要依赖于第三方库。PHP本身并没有内置直接处理PDF的强大功能,但通过引入成熟的库,我们可以实现从简单的文本报告到复杂的动态PDF文档生成,以及从现有PDF中提取文本和数据。这其中,生成文档相对成熟且方案多样,而解析则复杂得多,需要根据具体需求和PDF结构来选择工具和策略。

生成PDF文档,通常我们会在服务器端通过PHP脚本将数据渲染成PDF格式。至于解析,则需要深入理解PDF的内部结构,并利用专门的解析库来抽取信息。这两种操作在实际项目中都非常常见,比如生成发票、报告,或者从收到的PDF文件中提取关键数据。

解决方案

在PHP中处理PDF文件,核心在于选择合适的第三方库。

PDF生成:对于PDF生成,我个人常用的是Dompdf和TCPDF。

Dompdf: 如果你的内容已经以HTML和CSS的形式存在,或者你可以很方便地将其组织成HTML,那么Dompdf是首选。它的优势在于,你几乎可以用前端开发的方式来设计PDF布局,因为它能将HTML/CSS渲染成PDF。这对于生成报表、合同、发票这类基于模板的文档非常方便。

立即学习“PHP免费学习笔记(深入)”;

set('defaultFont', 'SimHei'); // 假设你已经安装了SimHei字体$options->set('isHtml5ParserEnabled', true);$options->set('isRemoteEnabled', true); // 允许加载远程图片等资源$dompdf = new Dompdf($options);$html = '        我的PHP生成PDF            body { font-family: "SimHei", sans-serif; margin: 40px; }        h1 { color: #333; }        p { line-height: 1.6; }        .highlight { background-color: #f0f0f0; padding: 10px; border-radius: 5px; }        

欢迎来到我的PDF文档

这是一段由PHP和Dompdf生成的文本,包含一些加粗斜体的内容。

你也可以在这里嵌入动态数据,比如当前日期:' . date('Y-m-d H:i:s') . '

@@##@@';$dompdf->loadHtml($html);// 设置纸张大小和方向$dompdf->setPaper('A4', 'portrait'); // 'portrait' 竖向, 'landscape' 横向// 渲染HTML为PDF$dompdf->render();// 输出PDF到浏览器或保存到文件$dompdf->stream("my_document.pdf", ["Attachment" => false]); // Attachment为false表示在浏览器中预览// file_put_contents("my_document.pdf", $dompdf->output()); // 保存到文件?>

这里需要注意字体问题,特别是中文。Dompdf默认可能不支持某些中文字体,需要手动引入或配置。

TCPDF/FPDF: 如果你需要更底层的控制,比如精确绘制图形、线条、条形码,或者不需要HTML渲染的开销,那么TCPDF或FPDF是更好的选择。TCPDF功能更强大,支持Unicode、数字签名等,而FPDF则更轻量级,学习曲线也相对平缓。它们都是通过PHP代码直接“画”出PDF内容。

PDF解析:PDF解析通常比生成要复杂得多,因为PDF文件的结构是为了显示而设计的,而不是为了数据提取。

Smalot/pdfparser: 这是一个非常流行的PHP库,用于从PDF文件中提取文本、元数据和结构信息。它能处理大多数标准的PDF文件,但对于复杂的布局、表格或扫描件,可能会遇到挑战。

parseFile('path/to/your/document.pdf'); // 替换为你的PDF文件路径// 获取PDF的元数据$details = $pdf->getDetails();foreach ($details as $key => $value) {    if (is_array($value)) {        echo $key . ': ' . implode(', ', $value) . '
'; } else { echo $key . ': ' . $value . '
'; }}// 获取所有页面的文本$text = $pdf->getText();echo '

所有页面文本:

';echo '
' . htmlspecialchars($text) . '

';// 获取特定页面的文本$pages = $pdf->getPages();if (isset($pages[0])) { // 第一页 echo '

第一页文本:

'; echo '

' . htmlspecialchars($pages[0]->getText()) . '

';}?>

Smalot/pdfparser

在提取纯文本方面表现不错,但如果你需要提取表格数据或者处理复杂的布局,可能需要更多的自定义逻辑,甚至结合正则表达式或其他文本处理技术。

PHP生成PDF文档时,我应该选择哪种库?Dompdf、TCPDF还是FPDF?

选择PDF生成库,这确实是个让人头疼的问题,因为每种库都有其侧重点和适用场景。我通常会从我的“源数据”和“需求复杂性”这两个维度来考量。

首先,如果你手头已经有一套成熟的HTML/CSS模板,或者你的项目天然就是基于Web前端技术栈来构建内容,那么Dompdf几乎是你的不二之选。它的核心优势在于能够将HTML和CSS渲染成PDF。这意味着你可以利用你熟悉的前端技能,比如Flexbox、Grid布局(虽然Dompdf对CSS3的支持不如现代浏览器那么完善,但基本够用),甚至直接把网页内容稍作调整就生成PDF。对于生成像发票、报告、合同这类格式相对固定、内容动态填充的文档,Dompdf能大幅提升开发效率。我个人经验是,当客户对PDF的视觉效果有较高要求,且前端团队能够提供高质量的HTML模板时,Dompdf总能让我省心不少。不过,它也有缺点,比如对复杂CSS的支持有限,生成大型或复杂PDF时可能会有性能瓶颈,以及处理中文字体需要额外配置。

其次,如果你的需求是需要对PDF的每一个元素进行像素级的精确控制,比如绘制复杂的图表、条形码、二维码,或者需要处理数字签名、加密等高级功能,那么TCPDF会是更好的选择。TCPDF是一个功能非常强大的库,它直接通过PHP代码来“画”出PDF内容,提供了丰富的API来控制文本、图形、图片、表格的每一个细节。它的学习曲线相对陡峭一些,你需要习惯它特有的坐标系统和绘图方法。我记得有一次项目需要生成带有多种条形码和自定义水印的物流标签,Dompdf就显得力不从心了,最终还是TCPDF出色地完成了任务。它对Unicode的支持也非常好,处理多语言文档时更省心。

最后,如果你只是需要生成一些非常简单的、纯文本的PDF文档,对样式要求不高,或者项目对库的体积和性能有严格要求,那么FPDF可能就足够了。FPDF是一个非常轻量级的库,它的API相对简单直观,上手快。虽然功能不如TCPDF强大,但对于基础的文本输出、图片插入等操作,它能高效完成。我通常在一些内部工具或者数据导出功能中用到它,因为它足够简单,不会引入太多不必要的依赖。

总结一下我的选择逻辑:

HTML/CSS模板 -> Dompdf (省心,前端友好)精确控制/高级功能 -> TCPDF (强大,但学习成本高)简单/轻量级 -> FPDF (高效,基础功能)

没有哪个库是“最好的”,只有最适合你当前项目的。我建议在项目初期,根据你的主要需求和团队技能栈,先做个小范围的PoC(概念验证),看看哪个库能更顺畅地解决你的问题。

解析PDF文档在PHP中面临哪些常见挑战,有没有可靠的解决方案?

PHP解析PDF文档,这可比生成PDF要“硬核”得多,也更容易让人感到挫败。PDF文件格式的初衷是“所见即所得”,它更关注内容的显示效果,而非数据的结构化存储。这就导致了在PHP中进行PDF解析时,我们不得不面对一系列棘手的挑战。

最大的挑战莫过于PDF内部结构的复杂性和多样性。PDF文件可以由各种工具生成,每个工具在生成时可能都有自己独特的优化方式,比如字体嵌入、图片压缩、文本编码等。这使得PDF文件看起来千变万化。你可能会遇到:

文本提取困难: 这是最常见的痛点。PDF中的文本可能不是按阅读顺序存储的,而是根据排版需求分散在页面各处。比如,一个段落的文字可能被拆分成多个独立的文本块,甚至一个单词的字母都可能分开存储。更糟糕的是,字体嵌入、字符编码(如CID字体)问题,常常导致提取出的文本乱码或不完整。表格数据提取: 如果说文本提取是“难”,那表格提取就是“地狱模式”。PDF没有内置“表格”的概念,它只是通过线条和文本的位置来模拟表格。这意味着你需要通过复杂的算法去识别线条、文本块,然后推断出表格的行和列结构,这极其容易出错,尤其是在表格样式不规则、跨页或者有合并单元格的情况下。图片和图形提取: 虽然一些库可以提取图片,但通常只能得到原始图片文件,要理解图片内容则需要额外的图像识别技术。扫描件PDF: 如果PDF是扫描件,那里面根本就没有可供程序提取的文本,只有一张张图片。这时候,任何基于文本解析的库都无能为力,必须先进行OCR(光学字符识别)处理。内存和性能问题: 大型PDF文件,特别是包含大量图片或复杂矢量图形的,在解析时可能会消耗大量的内存和CPU资源,导致PHP脚本超时或内存溢出。

那么,有没有可靠的解决方案呢?我的经验是,没有一劳永逸的“银弹”,但我们可以结合多种策略和工具来应对。

对于文本和元数据提取

Smalot/pdfparser

无疑是PHP生态中最成熟和常用的开源库。它能很好地处理大部分标准PDF的文本和元数据。它会尝试将页面上的文本块重新组合,并处理一些常见的编码问题。对于大部分只需要获取PDF文字内容的应用场景,它是一个非常可靠的起点。但正如我前面提到的,对于复杂的排版,你可能需要对提取出的文本进行后处理,比如用正则表达式清理、重新排序。

对于表格数据提取,这通常需要更高级的工具,甚至结合机器学习。在PHP中,你可能需要:

自定义逻辑: 基于

Smalot/pdfparser

提取出的文本块及其坐标信息,尝试编写自己的算法来识别表格区域和单元格。这需要大量的试错和对特定PDF格式的深入理解。结合Python或Java工具: 像Python的

camelot

tabula-py

,或者Java的

PDFBox

,在表格提取方面通常有更强的能力。你可以在PHP中调用这些外部脚本或服务来处理PDF,然后将结果返回给PHP。这虽然增加了系统复杂度,但往往能获得更好的效果。商业API/SDK: 如果预算允许且需求严格,一些商业服务(如Adobe PDF Services API、PDFTron等)提供了非常强大的PDF解析能力,包括智能表格提取。它们通常会提供PHP的SDK或RESTful API。

对于扫描件PDF,唯一的可靠解决方案是OCR(光学字符识别)。你可以:

自建OCR服务: 使用

Tesseract

等开源OCR引擎,在服务器上部署,然后PHP调用命令行或封装成服务。云端OCR服务: 比如Google Cloud Vision AI、Amazon Textract、百度AI开放平台等,它们提供了强大的OCR能力,通过API调用即可。

性能优化方面,处理大型PDF时,可以考虑:

增加PHP内存限制和执行时间:

memory_limit

max_execution_time

分批处理: 如果PDF可以逻辑上拆分,尝试分批处理。异步处理: 对于非常大的文件,将PDF解析任务放入消息队列,由后台工作进程异步处理,避免阻塞前端请求。选择高效的库: Smalot/pdfparser已经相对高效,但对于极端的性能要求,可能需要考虑C/C++编写的PDF库(如Poppler),然后通过PHP扩展或外部调用来集成。

总而言之,PDF解析是一个充满挑战的领域。我的建议是,先用

Smalot/pdfparser

尝试,看它能解决多少问题。如果遇到瓶颈,特别是表格提取或扫描件,不要害怕引入外部工具或服务。设定切合实际的期望值也很重要,PDF解析很少能做到100%完美,尤其是在面对各种奇形怪状的PDF文件时。

如何在PHP生成的PDF中嵌入图片、字体和动态数据?

在PHP生成的PDF中嵌入图片、字体和动态数据,这是构建实用PDF文档的核心需求。无论你选择Dompdf、TCPDF还是FPDF,这些操作都是可以实现的,只是API和实现方式略有不同。我将主要以Dompdf和TCPDF为例,因为它们代表了两种不同的生成哲学。

嵌入动态数据:这通常是最直接和最简单的部分,因为PHP本身就是处理动态数据的。

Dompdf(HTML/CSS方式):你只需像构建普通HTML页面一样,将PHP变量直接插入到HTML字符串中即可。

 '商品A', 'qty' => 2, 'price' => 100],    ['name' => '商品B', 'qty' => 1, 'price' => 250],];$totalAmount = array_sum(array_map(fn($item) => $item['qty'] * $item['price'], $items));$html = '    

发票

客户姓名: ' . htmlspecialchars($userName) . '

发票编号: ' . htmlspecialchars($invoiceNumber) . '

';foreach ($items as $item) { $html .= ' ';}$html .= '
商品数量单价总计
' . htmlspecialchars($item['name']) . ' ' . htmlspecialchars($item['qty']) . ' ' . htmlspecialchars($item['price']) . ' ' . htmlspecialchars($item['qty'] * $item['price']) . '
总金额:' . htmlspecialchars($totalAmount) . '
';$dompdf->loadHtml($html);// ... 渲染和输出代码 ...?>

通过字符串拼接或模板引擎(如Twig、Blade)将PHP变量嵌入到HTML中,这是最常见且高效的方式。

TCPDF/FPDF(程序绘制方式):这些库提供

Cell()

Text()

等方法来输出文本。你直接将PHP变量作为参数传递给这些方法即可。

AddPage();$userName = "李四";$productName = "超级产品";$price = 99.99;$pdf->SetFont('dejavusans', '', 12); // 使用支持中文的字体$pdf->Write(0, '尊敬的客户 ' . $userName . ':', '', 0, 'L', true, 0, false, false, 0);$pdf->Ln(10); // 换行$pdf->Write(0, '您购买的商品是:' . $productName . ',价格为:' . $price . ' 元。', '', 0, 'L', true, 0, false, false, 0);// ... 输出PDF ...?>

嵌入图片:

Dompdf:和HTML中嵌入图片的方式完全一样,使用

@@##@@

标签。Dompdf可以处理本地图片路径和远程URL。

@@##@@@@##@@

需要注意的是,如果图片是本地路径,Dompdf需要能够访问到这个路径。对于远程图片,你需要确保

$options->set('isRemoteEnabled', true);

被设置为

true

TCPDF/FPDF:这些库提供了专门的

Image()

方法来插入图片,你可以精确控制图片的位置、大小和透明度等。

// TCPDF$pdf->Image('/path/to/your/logo.png', 15, 15, 30, 0, 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false);// 参数含义:文件路径, x, y, 宽度, 高度(0表示按比例), 类型, 链接, 对齐, 缩放, 边框, 忽略裁剪, 调整, 旋转, 透明度, 遮罩, 可视性// FPDF$pdf->Image('/path/to/your/header.jpg', 10, 10, 190);// 参数含义:文件路径, x, y, 宽度, 高度(可选), 类型(可选)

嵌入字体:字体是PDF生成中一个比较复杂但又非常重要的环节,特别是涉及中文。

Dompdf:Dompdf处理字体的方式与浏览器类似,通过CSS的

@font-face

规则。准备字体文件: 你需要TTF格式示例图片php如何操作pdf文件_php生成和解析pdf文档本地图片远程图片

以上就是php如何操作pdf文件_php生成和解析pdf文档的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1293511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何在PHP在线执行中实现数据加密?使用PHP加密函数的完整教程
上一篇 2025年12月11日 09:09:27
什么是PHP在线执行的代码高亮?实现代码高亮显示的配置与实践
下一篇 2025年12月11日 09:09:33

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    700
  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    900
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    300
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    300
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    300
  • 获取日期中的周数:CodeIgniter 教程

    本教程旨在帮助开发者在 CodeIgniter 框架中,从日期字符串中准确提取周数。我们将使用 PHP 内置的 DateTime 类,并提供详细的代码示例和注意事项,确保您能够轻松地在项目中实现此功能。 使用 DateTime 类获取周数 PHP 的 DateTime 类提供了一种便捷的方式来处理日…

    2026年5月10日
    100
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • HTML如何隐藏滚动条或去除滚动条

    滚动条可以存在也可以不存在,本文主要介绍了html 隐藏滚动条和去除滚动条的方法的相关资料,大家一起来学习一下html隐藏滚动条或去除滚动条的方法吧。 1. html 标签加属性 XML/HTML Code复制内容到剪贴板 2.body中加入以下代码 立即学习“前端免费学习笔记(深入)”; html…

    用户投稿 2026年5月10日
    100
  • Golang gRPC流式请求异常处理

    在Golang的gRPC流式通信中,必须通过context.Context处理异常。应监听上下文取消或超时,及时释放资源,设置合理超时,避免连接长时间挂起,并在goroutine中通过context控制生命周期。 在使用 Golang 和 gRPC 实现流式通信时,异常处理是确保服务健壮性的关键部分…

    2026年5月10日
    000
  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • css max-height属性怎么用

    max-height 属性设置元素的最大高度。 说明 该属性值会对元素的高度设置一个最高限制。因此,元素可以比指定值矮,但不能比其高。不允许指定负值。 注意:max-height 属性不包括外边距、边框和内边距。 立即学习“前端免费学习笔记(深入)”; 值描述none 默认。定义对元素被允许的最大高…

    2026年5月10日
    100
  • vscode上怎么运行html_vscode上运行html步骤【指南】

    首先保存文件为.html格式,再通过浏览器或Live Server插件打开预览;推荐安装Live Server实现本地服务器运行与实时刷新,提升开发体验。 在 VS Code 上运行 HTML 文件并不需要复杂的配置,只需几个简单步骤即可预览页面效果。VS Code 本身是一个代码编辑器,不直接运行…

    2026年5月10日
    100
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    300
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    100
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 页面中文本域的值怎么设置

    标签定义多行的文本输入控件。 文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier)。 可以通过 cols 和 rows 属性来规定 textarea 的尺寸,不过更好的办法是使用 CSS 的 height 和 width 属性。 注释:在文本输入区内的文本行间,用 …

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • php常量怎么用_PHP常量(define/const)定义与使用方法

    PHP中可通过define函数和const关键字定义常量,用于存储不可变值。define适用于全局作用域,支持动态名称和条件定义,如define(‘SITE_NAME’, ‘MyWebsite’);const在编译时生效,语法简洁但限制多,只能在类或全…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信