如何在 C&num 中编辑 PDF;

查克尼特·宾
查克尼特·宾
2022年十月3日
更新 2024年十二月11日
分享:
This article was translated from English: Does it need improvement?
Translated
View the article in English

介绍

Iron Software在IronPDF库中简化了许多不同的PDF编辑功能,使方法易于阅读和理解。 无论是添加签名、添加HTML页脚、盖章水印还是添加注释。 IronPDF是为您提供的工具,它允许您拥有可读的代码、程序化PDF生成、简便的调试和轻松部署到任何支持的环境或平台。

IronPDF在编辑PDF时具有无数的功能。 在这篇教程文章中,我们将通过一些代码示例和解释来讲解其中的一些主要内容。

通过本文,您将了解如何使用IronPDF在C#中编辑您的PDF文件。

目录

编辑文档结构

操作页面

使用IronPDF在特定索引处添加PDF、按范围或逐个复制页面,以及从任何PDF中删除页面都非常简单,IronPDF会在幕后处理一切。

添加页面

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-1.cs
var pdf = new PdfDocument("report.pdf");
var renderer = new ChromePdfRenderer();
var coverPagePdf = renderer.RenderHtmlAsPdf("<h1>Cover Page</h1><hr>");
pdf.PrependPdf(coverPagePdf);
pdf.SaveAs("report_with_cover.pdf");

复制页

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-2.cs
var pdf = new PdfDocument("report.pdf");
// Copy pages 5 to 7 and save them as a new document.
pdf.CopyPages(4, 6).SaveAs("report_highlight.pdf");

删除页面

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-3.cs
var pdf = new PdfDocument("report.pdf");

// Remove the last page from the PDF and save again
pdf.RemovePage(pdf.PageCount - 1);
pdf.SaveAs("report_minus_one_page.pdf");

合并和拆分 PDF 文件

使用IronPDF直观的API,可以轻松地将多个PDF合并成一个PDF或拆分现有的PDF。

将多个现有 PDF 文件合并为一个 PDF 文档

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-4.cs
var pdfs = new List<PdfDocument>
{
    PdfDocument.FromFile("A.pdf"),
    PdfDocument.FromFile("B.pdf"),
    PdfDocument.FromFile("C.pdf")
};

PdfDocument mergedPdf = PdfDocument.Merge(pdfs);
mergedPdf.SaveAs("merged.pdf");

foreach (var pdf in pdfs)
{
    pdf.Dispose();
}

要查看代码示例页面上的两个或更多 PDF,请访问这里.

分割 PDF 文件并提取页面

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-5.cs
var pdf = new PdfDocument("sample.pdf");

// Take the first page
var pdf_page1 = pdf.CopyPage(0);
pdf_page1.SaveAs("Split1.pdf");

// Take the pages 2 & 3
var pdf_page2_3 = pdf.CopyPages(1, 2);
pdf_page2_3.SaveAs("Spli2t.pdf");

要查看代码示例页面中的拆分和提取页面,请访问这里.

编辑文档属性

添加和使用 PDF 元数据

您可以轻松使用IronPDF来浏览和编辑PDF元数据:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-6.cs
// Open an Encrypted File, alternatively create a new PDF from Html
var pdf = PdfDocument.FromFile("encrypted.pdf", "password");

// Edit file metadata
pdf.MetaData.Author = "Satoshi Nakamoto";
pdf.MetaData.Keywords = "SEO, Friendly";
pdf.MetaData.ModifiedDate = System.DateTime.Now;

// Edit file security settings
// The following code makes a PDF read only and will disallow copy & paste and printing
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key");
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserFormData = false;
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;

// Change or set the document encryption password
pdf.SecuritySettings.OwnerPassword = "top-secret"; // password to edit the pdf
pdf.SecuritySettings.UserPassword = "shareable";  // password to open the pdf
pdf.SaveAs("secured.pdf");

数字签名

IronPDF 支持使用 .pfx 和 .p12 X509Certificate2 数字证书对新的或现有的 PDF 文件进行数字签名。

一旦PDF文件被签名,未经证书验证便无法修改。 这确保了保真度。

要使用 Adobe Reader 免费生成签名证书,请阅读 https://helpx.adobe.com/acrobat/using/digital-ids.html

除了加密签名,还可以使用手写签名图像或公司印章图像通过IronPDF进行签名。

在一行代码中对现有的PDF文件进行加密签名。!

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-7.cs
using IronPdf;
using IronPdf.Signing;


new IronPdf.Signing.PdfSignature("Iron.p12", "123456").SignPdfFile("any.pdf");

控制能力更强的高级示例:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-8.cs
using IronPdf;

// Step 1. Create a PDF
var renderer = new ChromePdfRenderer();
var doc = renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>");

// Step 2. Create a Signature.
// You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.
// Read: https://helpx.adobe.com/acrobat/using/digital-ids.html
var signature = new IronPdf.Signing.PdfSignature("Iron.pfx", "123456")
{
    // Step 3. Optional signing options and a handwritten signature graphic
    SigningContact = "support@ironsoftware.com",
    SigningLocation = "Chicago, USA",
    SigningReason = "To show how to sign a PDF"
};

//Step 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.Sign(signature);

//Step 5. The PDF is not signed until saved to file, steam or byte array.
doc.SaveAs("signed.pdf");

PDF 附件

IronPDF 完全支持向您的 PDF 文档添加和删除附件。

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-9.cs
var Renderer = new ChromePdfRenderer();
var myPdf = Renderer.RenderHtmlFileAsPdf("my-content.html");

// Here we can add an attachment with a name and byte[]
var attachment1 = myPdf.Attachments.AddAttachment("attachment_1", example_attachment);

// And here is an example of removing an attachment
myPdf.Attachments.RemoveAttachment(attachment1);

myPdf.SaveAs("my-content.pdf");

压缩PDF

IronPDF支持PDF压缩。 减小PdfDocument内嵌图像的大小是减小PDF文件大小的一种方法。 在IronPDF中,我们可以调用CompressImages方法。

调整JPEG大小的方式是,100% 质量几乎没有损失,而1% 是非常低的输出图像质量。 一般来说,90%及以上被认为是高质量,80%-90%被认为是中等质量,70%-80%被认为是低质量。 将比例降低到70%以下将会产生低质量的图片,但这样做可以显著减少PdfDocument的总文件大小。

请尝试使用不同的值,以感受质量与文件大小之间的平衡范围,以找到符合您需求的最佳平衡。 显而易见的质量下降最终取决于输入的图像类型,有些图像的清晰度可能会比其他图像更明显地降低。

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-10.cs
var pdf = new PdfDocument("document.pdf");

// Quality parameter can be 1-100, where 100 is 100% of original quality
pdf.CompressImages(60);
pdf.SaveAs("document_compressed.pdf");

PDF文档中有第二个可选参数,可以根据图像在PDF中的可见大小调整图像分辨率。 请注意,这可能会导致某些图像配置出现失真:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-11.cs
var pdf = new PdfDocument("document.pdf");

pdf.CompressImages(90, true);
pdf.SaveAs("document_scaled_compressed.pdf");

编辑 PDF 内容

添加页眉和页脚

您可以轻松地为您的PDF添加页眉和页脚。 IronPDF有两种不同类型的“HeaderFooters”,分别是TextHeaderFooterHtmlHeaderFooter。 TextHeaderFooter可更好地处理仅包含文本的页眉和页脚,并且可能需要使用合并字段,例如"{页码}的{总页数}. HtmlHeaderFooter 是一个高级的页眉和页脚,可以与其中的任何 HTML 配合使用,并且格式整洁。

HTML 页眉和页脚

HTML头部和尾部将使用您的HTML的渲染版本作为PDF文档的头部或尾部,以实现像素完美的布局。

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-12.cs
var renderer = new ChromePdfRenderer();

// Build a footer using html to style the text
// mergeable fields are:
// {page} {total-pages} {url} {date} {time} {html-title} & {pdf-title}
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    MaxHeight = 15, //millimeters
    HtmlFragment = "<center><i>{page} of {total-pages}<i></center>",
    DrawDividerLine = true
};

// Build a header using an image asset
// Note the use of BaseUrl to set a relative path to the assets
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    MaxHeight = 20, //millimeters
    HtmlFragment = "<img src='logo.png'>",
    BaseUrl = new System.Uri(@"C:\assets\images").AbsoluteUri
};

有关包含多个使用案例的完整深入示例,请参阅以下教程:这里.

文本页眉和页脚

基本的页眉和页脚是 TextHeaderFooter,请参见下面的示例。

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-13.cs
var renderer = new ChromePdfRenderer
{
    RenderingOptions =
    {
        FirstPageNumber = 1, // use 2 if a cover-page  will be appended

        // Add a header to every page easily:
        TextHeader =
        {
            DrawDividerLine = true,
            CenterText = "{url}",
            Font = IronSoftware.Drawing.FontTypes.Helvetica,
            FontSize = 12
        },

        // Add a footer too:
        TextFooter =
        {
            DrawDividerLine = true,
            Font = IronSoftware.Drawing.FontTypes.Arial,
            FontSize = 10,
            LeftText = "{date} {time}",
            RightText = "{page} of {total-pages}"
        }
    }
};

我们还有以下合并字段,这些字段的值将在渲染时被替换: .{页码}, {总页数}, {网址}, {日期}, {时间}, {html-title}, {pdf标题}

查找和替换 PDF 中的文本

在您的PDF中创建占位符并以编程方式替换它们,或使用我们的 ReplaceTextOnPage 方法替换所有文本短语的实例。

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-14.cs
// Using an existing PDF
var pdf = PdfDocument.FromFile("sample.pdf");

// Parameters
int pageIndex = 1;
string oldText = ".NET 6"; // Old text to remove
string newText = ".NET 7"; // New text to add

// Replace Text on Page
pdf.ReplaceTextOnPage(pageIndex, oldText, newText);

// Placeholder Template Example
pdf.ReplaceTextOnPage(pageIndex, "[DATE]", "01/01/2000");

// Save your new PDF
pdf.SaveAs("new_sample.pdf");

要查看代码示例页面上的查找和替换文本示例,请访问这里

大纲和书签

PDF中的大纲或“书签”提供了一种导航到关键页面的方式。 在Adobe Acrobat Reader中,这些书签(可嵌套)显示在应用程序左侧边栏中。 IronPDF将自动导入PDF文档中现有的书签,并允许添加、编辑和嵌套更多书签。

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-15.cs
// Create a new PDF or edit an existing document.
PdfDocument pdf = PdfDocument.FromFile("existing.pdf");

// Add bookmark
pdf.Bookmarks.AddBookMarkAtEnd("Author's Note", 2);
pdf.Bookmarks.AddBookMarkAtEnd("Table of Contents", 3);

// Store new bookmark in a variable to add nested bookmarks to
var summaryBookmark = pdf.Bookmarks.AddBookMarkAtEnd("Summary", 17);

// Add a sub-bookmark within the summary
var conclusionBookmark = summaryBookmark.Children.AddBookMarkAtStart("Conclusion", 18);

// Add another bookmark to end of highest-level bookmark list
pdf.Bookmarks.AddBookMarkAtEnd("References", 20);

pdf.SaveAs("existing.pdf");

要查看代码示例页面上的大纲和书签示例,请访问这里.

添加和编辑注释

IronPDF拥有众多PDF注释的自定义选项。 请参考下面的示例,展示它的功能:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-16.cs
// create a new PDF or load and edit an existing document.
var pdf = PdfDocument.FromFile("existing.pdf");

// Create a PDF annotation object
var textAnnotation = new IronPdf.Annotations.TextAnnotation(PageIndex: 0)
{
    Title = "This is the major title",
    Contents = "This is the long 'sticky note' comment content...",
    Subject = "This is a subtitle",
    Opacity = 0.9,
    Printable = false,
    Hidden = false,
    OpenByDefault = true,
    ReadOnly = false,
    Rotatable = true,
};

// Add the annotation "sticky note" to a specific page and location within any new or existing PDF.
pdf.Annotations.Add(textAnnotation);

pdf.SaveAs("existing.pdf");

PDF注释允许在PDF页面上添加类似“便利贴”的评论。 TextAnnotation 类允许以编程方式添加注释。 支持的高级文本注释功能包括调整大小、不透明度、图标和编辑。

添加背景和前景

使用IronPDF,我们可以轻松地合并2个PDF文件,将其中一个用作背景或前景:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-17.cs
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
pdf.AddBackgroundPdf(@"MyBackground.pdf");
pdf.AddForegroundOverlayPdfToPage(0, @"MyForeground.pdf", 0);
pdf.SaveAs(@"C:\Path\To\Complete.pdf");

烫印和水印

能够进行盖章和水印是任何PDF编辑器的基本功能。 IronPDF拥有一个出色的API,可用于创建多种印章,如图像印章和HTML印章。 这些都具有高度可定制的位置,使用对齐和偏移可以在这里看到:

烫印和水印

Stamper抽象类

Stamper 抽象类用作 IronPDF 所有印章方法的参数。

每个用例都有许多类:

Stamper 类属性

abstract class Stamper

└─── int : Opacity
└─── int : Rotation

└─── double : Scale

└─── Length : HorizontalOffset
└─── Length : VerticalOffset

└─── Length : MinWidth
└─── Length : MaxWidth

└─── Length : MinHeight
└─── Length : MaxHeight

└─── string : Hyperlink

└─── bool : IsStampBehindContent (default : false)

└─── HorizontalAlignment : HorizontalAlignment
│   │   Left
│   │   Center (default)
│   │   Right
│
└─── VerticalAlignment : VerticalAlignment
    │   Top
    │   Middle (default)
    │   Bottom

印章示例

我们在下面展示了Stamper的每一个子类以及相应的代码示例。

在 PDF 上印上文字

创建两种不同方式的文本印章并同时应用它们:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-18.cs
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Example HTML Document!</h1>");

TextStamper stamper1 = new TextStamper
{
    Text = "Hello World! Stamp One Here!",
    FontFamily = "Bungee Spice",
    UseGoogleFont = true,
    FontSize = 100,
    IsBold = true,
    IsItalic = true,
    VerticalAlignment = VerticalAlignment.Top
};

TextStamper stamper2 = new TextStamper()
{
    Text = "Hello World! Stamp Two Here!",
    FontFamily = "Bungee Spice",
    UseGoogleFont = true,
    FontSize = 30,
    VerticalAlignment = VerticalAlignment.Bottom
};

Stamper[] stampersToApply = { stamper1, stamper2 };
pdf.ApplyMultipleStamps(stampersToApply);
pdf.ApplyStamp(stamper2);

将图像印到 PDF 上

将图片印章应用于现有PDF文档的各种页面组合:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-19.cs
var pdf = new PdfDocument("/attachments/2022_Q1_sales.pdf");

ImageStamper logoImageStamper = new ImageStamper("/assets/logo.png");

// Apply to every page, one page, or some pages
pdf.ApplyStamp(logoImageStamper);
pdf.ApplyStamp(logoImageStamper, 0);
pdf.ApplyStamp(logoImageStamper, new[] { 0, 3, 11 });

在 PDF 上加印 HTML

编写您自己的HTML用作印章:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-20.cs
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<p>Hello World, example HTML body.</p>");

HtmlStamper stamper = new HtmlStamper($"<p>Example HTML Stamped</p><div style='width:250pt;height:250pt;background-color:red;'></div>")
{
    HorizontalOffset = new Length(-3, MeasurementUnit.Inch),
    VerticalAlignment = VerticalAlignment.Bottom
};

pdf.ApplyStamp(stamper);

在 PDF 上加印条形码

创建和盖章条形码的示例:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-21.cs
BarcodeStamper bcStamp = new BarcodeStamper("IronPDF", BarcodeEncoding.Code39);

bcStamp.HorizontalAlignment = HorizontalAlignment.Left;
bcStamp.VerticalAlignment = VerticalAlignment.Bottom;

var pdf = new PdfDocument("example.pdf");
pdf.ApplyStamp(bcStamp);

在 PDF 上加盖 QR 码

创建和盖章二维码的示例:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-22.cs
BarcodeStamper qrStamp = new BarcodeStamper("IronPDF", BarcodeEncoding.QRCode);

qrStamp.Height = 50; // pixels
qrStamp.Width = 50; // pixels

qrStamp.HorizontalAlignment = HorizontalAlignment.Left;
qrStamp.VerticalAlignment = VerticalAlignment.Bottom;

var pdf = new PdfDocument("example.pdf");
pdf.ApplyStamp(qrStamp);

为 PDF 添加水印

水印是一种可以使用 ApplyWatermark 方法轻松应用于每一页的印章类型:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-23.cs
var pdf = new PdfDocument("/attachments/design.pdf");
string html = "<h1> Example Title <h1/>";
int rotation = 0;
int watermarkOpacity = 30;

pdf.ApplyWatermark(html, rotation, watermarkOpacity);

要查看代码示例页面上的水印示例,请访问这里.

在 PDF 上应用印章

有几种重载 ApplyStamp 方法的方式,可以用来将您的印章应用到 PDF 上。

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-24.cs
var pdf = new PdfDocument("/assets/example.pdf");

// Apply one stamp to all pages
pdf.ApplyStamp(myStamper);

// Apply one stamp to a specific page
pdf.ApplyStamp(myStamper, 0);

// Apply one stamp to specific pages
pdf.ApplyStamp(myStamper, new[] { 0, 3, 5 });

// Apply a stamp array to all pages
pdf.ApplyMultipleStamps(stampArray);

// Apply a stamp array to a specific page
pdf.ApplyMultipleStamps(stampArray, 0);

// Apply a stamp array to specific pages
pdf.ApplyMultipleStamps(stampArray, new[] { 0, 3, 5 });

// And some Async versions of the above
await pdf.ApplyStampAsync(myStamper, 4);
await pdf.ApplyMultipleStampsAsync(stampArray);

// Additional Watermark apply method
string html = "<h1> Example Title <h1/>";
int rotation = 0;
int watermarkOpacity = 30;
pdf.ApplyWatermark(html, rotation, watermarkOpacity);

长度类

Length 类有两个属性:UnitValue。 一旦您决定使用 MeasurementUnit 枚举中的哪个单位(默认为页面的 `百分比)然后选择 "值",以决定使用基本单位倍数的长度量。

长度类属性

class Length

└─── double : Value (default : 0)

└─── MeasurementUnit : Unit

   Inch

   Millimeter

   Centimeter

   Percentage (default)

   Pixel

   Points

长度示例

创建长度

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-25.cs
new Length(value: 5, unit: MeasurementUnit.Inch); // 5 inches

new Length(value: 25, unit: MeasurementUnit.Pixel);// 25px

new Length(); // 0% of the page dimension because value is defaulted to zero and unit is defaulted to percentage

new Length(value: 20); // 20% of the page dimension

使用长度作为参数

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-26.cs
HtmlStamper logoStamper = new HtmlStamper
{
    VerticalOffset = new Length(15, MeasurementUnit.Percentage),
    HorizontalOffset = new Length(1, MeasurementUnit.Inch)
    // set other properties...
};

在 PDF 文件中使用表单

创建和编辑表格

使用IronPDF创建一个包含嵌入式表单字段的PDF:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-27.cs
// Step 1.  Creating a PDF with editable forms from HTML using form and input tags
const string formHtml = @"
    <html>
        <body>
            <h2>Editable PDF  Form</h2>
            <form>
              First name: <br> <input type='text' name='firstname' value=''> <br>
              Last name: <br> <input type='text' name='lastname' value=''>
            </form>
        </body>
    </html>";

// Instantiate Renderer
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
renderer.RenderHtmlAsPdf(formHtml).SaveAs("BasicForm.pdf");

// Step 2. Reading and Writing PDF form values.
var formDocument = PdfDocument.FromFile("BasicForm.pdf");

// Read the value of the "firstname" field
var firstNameField = formDocument.Form.FindFormField("firstname");

// Read the value of the "lastname" field
var lastNameField = formDocument.Form.FindFormField("lastname");

要查看代码示例页面上的 PDF 表单示例,请访问这里.

填写现有表格

使用IronPDF,您可以轻松访问PDF中的所有现有表单字段并填写它们以便重新保存:

:path=/static-assets/pdf/content-code-examples/tutorials/csharp-edit-pdf-complete-28.cs
var formDocument = PdfDocument.FromFile("BasicForm.pdf");

// Set and Read the value of the "firstname" field
var firstNameField = formDocument.Form.FindFormField("firstname");
firstNameField.Value = "Minnie";
Console.WriteLine("FirstNameField value: {0}", firstNameField.Value);

// Set and Read the value of the "lastname" field
var lastNameField = formDocument.Form.FindFormField("lastname");
lastNameField.Value = "Mouse";
Console.WriteLine("LastNameField value: {0}", lastNameField.Value);

formDocument.SaveAs("FilledForm.pdf");

要查看代码示例页面上的 PDF 表单示例,请访问这里.

结论

上述示例清单表明,IronPDF 具有关键功能,可以在编辑 PDF 时开箱即用。

如果您想提出功能请求或对IronPDF或许可有任何一般性问题,请联系我们的支持团队. 我们将非常乐意为您提供帮助。

查克尼特·宾
软件工程师
Chaknith 负责 IronXL 和 IronBarcode 的工作。他在 C# 和 .NET 方面拥有深厚的专业知识,帮助改进软件并支持客户。他从用户互动中获得的洞察力,有助于提升产品、文档和整体体验。