You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#实现上传PDF转前端图片以添加HTML/JS批注?

Alright, let's break down how to solve this problem. You need to convert PDFs to images using C# so you can render them in the browser (skipping the built-in PDF viewer) and add annotations with HTML/JS. Here's a step-by-step guide with practical solutions:

Core Idea

The browser’s built-in PDF viewer takes over when you directly embed a PDF, which blocks custom annotation workflows. By converting each PDF page to an image (like PNG/JPEG), you can display them using standard <img> tags. Then you can layer HTML elements (or use Canvas) on top to add, edit, and save annotations—giving you full control in your frontend code.

C# PDF-to-Image Conversion Solutions

Below are three reliable approaches, ordered by ease of use and flexibility:

Magick.NET is a .NET wrapper for ImageMagick, a robust image processing library. It handles most PDF types out of the box with minimal code.

First, install the NuGet package:

Install-Package Magick.NET-Q16-AnyCPU

Then use this code to convert PDF pages to images:

using ImageMagick;
using System.IO;

public void ConvertPdfToImages(string pdfFilePath, string outputFolder)
{
    // Configure settings: adjust density for clarity vs file size
    var readSettings = new MagickReadSettings
    {
        Density = new Density(200, 200), // 200 DPI is a good balance for web + annotations
        Format = MagickFormat.Png // PNG preserves transparency if needed
    };

    // Load the PDF and convert each page
    using (var imageCollection = new MagickImageCollection())
    {
        imageCollection.Read(pdfFilePath, readSettings);
        int pageNumber = 1;

        foreach (var pageImage in imageCollection)
        {
            string outputPath = Path.Combine(outputFolder, $"pdf_page_{pageNumber}.png");
            pageImage.Write(outputPath);
            pageNumber++;
        }
    }
}
  • Pro Tip: Increase Density to 300 if you need ultra-clear images for detailed annotations, but note this will increase file size and load time.

2. PdfSharp (Lightweight: No External Dependencies)

If you prefer a solution without relying on external libraries like ImageMagick, PdfSharp is a lightweight .NET library for PDF manipulation. It’s great for simple PDFs with standard fonts.

Install the NuGet package:

Install-Package PdfSharp

Conversion code example:

using PdfSharp.Drawing;
using PdfSharp.Pdf;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public void PdfSharpConvertToImages(string pdfPath, string outputDir)
{
    // Open the PDF document
    using (PdfDocument pdfDoc = PdfReader.Open(pdfPath, PdfDocumentOpenMode.Import))
    {
        for (int pageIndex = 0; pageIndex < pdfDoc.PageCount; pageIndex++)
        {
            PdfPage page = pdfDoc.Pages[pageIndex];
            
            // Create a graphics context for the page
            using (XGraphics gfx = XGraphics.FromPdfPage(page))
            {
                // Render the page to a bitmap
                Bitmap pageBitmap = new Bitmap((int)page.Width.Point, (int)page.Height.Point);
                using (Graphics g = Graphics.FromImage(pageBitmap))
                {
                    gfx.DrawImage(XImage.FromGdiPlusImage(pageBitmap), 0, 0);
                }
                
                // Save the bitmap as a JPEG
                string outputPath = Path.Combine(outputDir, $"page_{pageIndex + 1}.jpg");
                pageBitmap.Save(outputPath, ImageFormat.Jpeg);
            }
        }
    }
}
  • Note: PdfSharp may struggle with complex PDFs (e.g., embedded fonts, vector graphics) compared to Magick.NET.

3. Ghostscript (For Complex PDFs: Maximum Control)

Ghostscript is a powerful open-source tool for processing PDFs. Use it if you need to handle highly complex documents with special formatting. You’ll need to install Ghostscript first, then call it via C#.

  1. Download and install Ghostscript (make a note of the installation path).
  2. Use this code to trigger the conversion via command line:
using System.Diagnostics;
using System.IO;

public void GhostscriptPdfToImages(string pdfPath, string outputDir)
{
    string ghostscriptExePath = @"C:\Program Files\gs\gs10.02.1\bin\gswin64c.exe"; // Update this to your path
    string outputPattern = Path.Combine(outputDir, "page_%d.png"); // %d will be replaced with page number

    // Build command arguments
    string arguments = $"-dNOPAUSE -dBATCH -sDEVICE=png16m -r200 -sOutputFile=\"{outputPattern}\" \"{pdfPath}\"";

    // Configure process start info
    ProcessStartInfo psi = new ProcessStartInfo(ghostscriptExePath, arguments)
    {
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true
    };

    // Run the process
    using (Process process = Process.Start(psi))
    {
        process.WaitForExit();
        // Optional: Read output/error logs for debugging
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();
    }
}
  • Pro Tip: Adjust the -r flag to set DPI (e.g., -r300 for high resolution).
Frontend Annotation Workflow

Once you have the images, here’s a simple way to add annotations:

  1. Display each image in a container with position: relative.
  2. Add draggable/resizable <div> elements (or use Canvas) as annotations, positioned absolutely over the image.
  3. Save annotation data (position, size, content) to your backend so you can restore it later.

Example HTML structure:

<div class="pdf-page-container" style="position: relative; width: 800px; margin: 0 auto;">
  <img src="/path/to/pdf_page_1.png" class="pdf-image" style="width: 100%;" />
  <!-- Example annotation -->
  <div class="annotation" style="position: absolute; top: 100px; left: 150px; width: 200px; height: 100px; border: 2px solid #ff4444; background: rgba(255,68,68,0.2);"></div>
</div>

Use JavaScript libraries like interact.js to handle drag/resize functionality for annotations.

Key Considerations
  • Caching: Cache converted images to avoid reprocessing PDFs on every request.
  • Async Processing: For large PDFs, use background tasks (e.g., Hangfire) to convert pages without blocking user requests.
  • Image Format: Use PNG for transparency support, JPEG for smaller file sizes (good for text-heavy PDFs).

内容的提问来源于stack exchange,提问作者jefflahh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:18:37