C#结合html2canvas切割图片并导出到PDF

在C#中结合 html2canvas 切割图片并导出到 PDF,通常需要在前端使用 JavaScript 库(如 html2canvasjsPDF)来完成图片的捕获和 PDF 生成,然后将生成的 PDF 文件发送到后端(C#)进行处理或保存。以下是实现步骤:

图片[1]_C#结合html2canvas切割图片并导出到PDF_知途无界

1. 前端部分:使用 html2canvasjsPDF

在前端,使用 html2canvas 将 HTML 内容渲染为图片,然后使用 jsPDF 将图片导出为 PDF。

引入必要的库

在 HTML 文件中引入 html2canvasjsPDF

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>

编写 JavaScript 代码

以下是一个示例代码,将 HTML 内容转换为图片并导出为 PDF:

<div id="content-to-export">
<h1>Hello, World!</h1>
<p>This is a sample content to be exported to PDF.</p>
</div>
<button id="export-btn">Export to PDF</button>
<script>
document.getElementById('export-btn').addEventListener('click', function () {
const element = document.getElementById('content-to-export');
// 使用 html2canvas 将 HTML 内容渲染为图片
html2canvas(element).then(canvas => {
const imgData = canvas.toDataURL('image/png'); // 获取图片的 Base64 数据
const pdf = new jspdf.jsPDF(); // 创建 PDF 对象
// 将图片添加到 PDF 中
const imgWidth = 210; // A4 纸的宽度(单位:mm)
const imgHeight = (canvas.height * imgWidth) / canvas.width; // 按比例计算高度
pdf.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight);
// 保存 PDF 文件
pdf.save('exported-file.pdf');
// 如果需要将 PDF 发送到后端,可以将 PDF 转换为 Blob 并上传
const pdfBlob = pdf.output('blob');
uploadToServer(pdfBlob);
});
});
function uploadToServer(blob) {
const formData = new FormData();
formData.append('file', blob, 'exported-file.pdf');
// 使用 Fetch API 将文件发送到后端
fetch('/UploadPDF', {
method: 'POST',
body: formData
}).then(response => {
if (response.ok) {
alert('File uploaded successfully!');
} else {
alert('File upload failed.');
}
});
}
</script>
<div id="content-to-export">
    <h1>Hello, World!</h1>
    <p>This is a sample content to be exported to PDF.</p>
</div>
<button id="export-btn">Export to PDF</button>

<script>
    document.getElementById('export-btn').addEventListener('click', function () {
        const element = document.getElementById('content-to-export');

        // 使用 html2canvas 将 HTML 内容渲染为图片
        html2canvas(element).then(canvas => {
            const imgData = canvas.toDataURL('image/png'); // 获取图片的 Base64 数据
            const pdf = new jspdf.jsPDF(); // 创建 PDF 对象

            // 将图片添加到 PDF 中
            const imgWidth = 210; // A4 纸的宽度(单位:mm)
            const imgHeight = (canvas.height * imgWidth) / canvas.width; // 按比例计算高度
            pdf.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight);

            // 保存 PDF 文件
            pdf.save('exported-file.pdf');

            // 如果需要将 PDF 发送到后端,可以将 PDF 转换为 Blob 并上传
            const pdfBlob = pdf.output('blob');
            uploadToServer(pdfBlob);
        });
    });

    function uploadToServer(blob) {
        const formData = new FormData();
        formData.append('file', blob, 'exported-file.pdf');

        // 使用 Fetch API 将文件发送到后端
        fetch('/UploadPDF', {
            method: 'POST',
            body: formData
        }).then(response => {
            if (response.ok) {
                alert('File uploaded successfully!');
            } else {
                alert('File upload failed.');
            }
        });
    }
</script>
<div id="content-to-export"> <h1>Hello, World!</h1> <p>This is a sample content to be exported to PDF.</p> </div> <button id="export-btn">Export to PDF</button> <script> document.getElementById('export-btn').addEventListener('click', function () { const element = document.getElementById('content-to-export'); // 使用 html2canvas 将 HTML 内容渲染为图片 html2canvas(element).then(canvas => { const imgData = canvas.toDataURL('image/png'); // 获取图片的 Base64 数据 const pdf = new jspdf.jsPDF(); // 创建 PDF 对象 // 将图片添加到 PDF 中 const imgWidth = 210; // A4 纸的宽度(单位:mm) const imgHeight = (canvas.height * imgWidth) / canvas.width; // 按比例计算高度 pdf.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight); // 保存 PDF 文件 pdf.save('exported-file.pdf'); // 如果需要将 PDF 发送到后端,可以将 PDF 转换为 Blob 并上传 const pdfBlob = pdf.output('blob'); uploadToServer(pdfBlob); }); }); function uploadToServer(blob) { const formData = new FormData(); formData.append('file', blob, 'exported-file.pdf'); // 使用 Fetch API 将文件发送到后端 fetch('/UploadPDF', { method: 'POST', body: formData }).then(response => { if (response.ok) { alert('File uploaded successfully!'); } else { alert('File upload failed.'); } }); } </script>

2. 后端部分:C# 接收并保存 PDF 文件

在后端,使用 C# 接收前端上传的 PDF 文件并保存到服务器。

创建 API 接口

在 ASP.NET Core 中创建一个 API 接口来接收文件:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;
[ApiController]
[Route("api/[controller]")]
public class UploadPDFController : ControllerBase
{
[HttpPost]
public IActionResult UploadPDF(IFormFile file)
{
if (file == null || file.Length == 0)
{
return BadRequest("No file uploaded.");
}
// 保存文件到服务器
var filePath = Path.Combine("wwwroot/uploads", file.FileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
file.CopyTo(stream);
}
return Ok(new { message = "File uploaded successfully!", filePath });
}
}
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;

[ApiController]
[Route("api/[controller]")]
public class UploadPDFController : ControllerBase
{
    [HttpPost]
    public IActionResult UploadPDF(IFormFile file)
    {
        if (file == null || file.Length == 0)
        {
            return BadRequest("No file uploaded.");
        }

        // 保存文件到服务器
        var filePath = Path.Combine("wwwroot/uploads", file.FileName);
        using (var stream = new FileStream(filePath, FileMode.Create))
        {
            file.CopyTo(stream);
        }

        return Ok(new { message = "File uploaded successfully!", filePath });
    }
}
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.IO; [ApiController] [Route("api/[controller]")] public class UploadPDFController : ControllerBase { [HttpPost] public IActionResult UploadPDF(IFormFile file) { if (file == null || file.Length == 0) { return BadRequest("No file uploaded."); } // 保存文件到服务器 var filePath = Path.Combine("wwwroot/uploads", file.FileName); using (var stream = new FileStream(filePath, FileMode.Create)) { file.CopyTo(stream); } return Ok(new { message = "File uploaded successfully!", filePath }); } }

配置静态文件访问

Startup.cs 中配置静态文件访问,以便可以通过 URL 访问上传的文件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles(); // 启用静态文件访问
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseStaticFiles(); // 启用静态文件访问
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); // 启用静态文件访问 app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }

3. 运行流程

  1. 用户点击页面上的按钮,触发 JavaScript 代码。
  2. html2canvas 将 HTML 内容渲染为图片。
  3. jsPDF 将图片导出为 PDF 文件。
  4. 前端将生成的 PDF 文件通过 Fetch API 发送到后端。
  5. 后端接收文件并保存到服务器的指定目录。

注意事项

  1. 跨域问题:如果前端和后端不在同一个域名下,需要配置 CORS。
  2. 文件大小限制:如果需要上传较大的文件,可能需要调整服务器的文件大小限制。
  3. 安全性:确保上传的文件是 PDF 格式,并对文件进行必要的安全检查。

通过以上步骤,你可以实现将 HTML 内容切割为图片并导出为 PDF,同时将 PDF 文件上传到 C# 后端进行保存。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞5 分享
No matter how complicated your life is, you have to maintain your elegance.
不论生活如何复杂,总要保持自己的那一份优雅
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容