คู่มือการใช้งาน PDFsharp: สร้างไฟล์ PDF ด้วย MigraDoc และ PdfSharpCore
PDFsharp เป็นไลบรารีโอเพนซอร์สสำหรับ .NET ที่ใช้สร้างและแก้ไขเอกสาร PDF จากโค้ด C# คุณเพียงแค่เขียนข้อความ เส้น และรูปภาพลงบนหน้ากระดาษ จากนั้นเรียกฟังก์ชันบันทึก แล้วคุณก็จะได้ไฟล์ PDF โดยไม่ต้องใช้เอนจิ้นของเบราว์เซอร์หรือไบนารีแบบเนทีฟ โครงการนี้มีมาตั้งแต่ปี 2005 และใบแจ้งหนี้ รายงาน และใบรับรองจำนวนมากที่สร้างจากแบ็กเอนด์ .NET ในปัจจุบันก็ยังคงใช้ไลบรารีนี้ในการประมวลผลอยู่
ฉันเขียนบทความนี้สำหรับนักพัฒนาที่ต้องการใช้งานไฟล์ PDF บนเซิร์ฟเวอร์และต้องการทราบว่าพวกเขากำลังจะเจอกับอะไรบ้าง เราจะพูดถึงวิธีการทำงานร่วมกันของ PDFsharp และ MigraDoc เวอร์ชันที่จะติดตั้ง ไฟล์ต้นแบบที่ใช้งานได้จริง ปัญหาเรื่องฟอนต์บน Linux การเปลี่ยนแปลงใบอนุญาตล่าสุด และจุดที่คุณควรเลือกใช้โปรแกรมอื่น
PDFsharp คืออะไร และสามารถทำอะไรได้บ้าง?
เบื้องหลังไลบรารี PDFsharp คือ empira Software GmbH บริษัทซอฟต์แวร์ขนาดเล็กจากเยอรมนีที่ดูแลรักษาไลบรารีนี้มาเกือบยี่สิบปีแล้ว เวลาส่วนใหญ่ของคุณจะหมดไปกับคลาส XGraphics ถ้าคุณเคยใช้ System.Drawing.Graphics ในการวาดภาพบน WinForms มาก่อน คุณจะรู้สึกคุ้นเคยภายในสิบนาที: เลือกแบบอักษร แปรง แกน x และ y แล้วก็เริ่มได้เลย
เมื่อแกะกล่อง คุณจะได้รับ:
- สร้างเอกสาร PDF ตั้งแต่เริ่มต้น ด้วยข้อความ รูปทรงเวกเตอร์ เส้น และรูปภาพ
- เปิดไฟล์ PDF ที่มีอยู่แล้ว และเพิ่มเนื้อหาลงในแต่ละหน้า เช่น ตราประทับ ลายน้ำ หรือหมายเลขหน้า
- รวมและแยก เอกสารโดยการนำเข้าหน้าจากไฟล์หนึ่งไปยังอีกไฟล์หนึ่ง
- ฝังและเลือกแบบอักษรย่อย เพื่อให้ไฟล์แสดงผลเหมือนกันบนทุกเครื่อง
- เพิ่มบุ๊กมาร์ก ลิงก์ และข้อมูลเมตาของเอกสาร เช่น ชื่อเรื่อง ผู้เขียน และคำสำคัญ
- ปกป้องไฟล์ ด้วยรหัสผ่านและแฟล็กสิทธิ์การเข้าถึง
- ลงนามเอกสารแบบดิจิทัล (ตั้งแต่เวอร์ชัน 6.2 เป็นต้นไป)
การติดตั้งใช้งานนั้นน่าเบื่อ ซึ่งผมหมายความว่าเป็นการชมเชย ทุกอย่างเป็นโค้ดที่จัดการได้ ดังนั้นผู้ดูแลระบบของคุณจึงไม่ต้องติดตั้ง Chrome แบบไร้หน้าจอลงบนเครื่อง หรือตามหาไฟล์ DLL ของ Ghostscript ตอนตีสองอีกต่อไป คุณเพียงแค่เรียกใช้แพ็กเกจ NuGet ตัวเดียว พุชเข้าไป ก็เสร็จแล้ว
ทีนี้มาถึงข้อเสีย คุณจะได้แค่พื้นที่ทำงานเท่านั้น ไม่มีอะไรมากกว่านั้น ถ้าข้อความยาวเกินไปจนชนขอบล่าง ก็เป็นปัญหาของคุณ ถ้าตารางยาวเกินหน้าแรก ก็เป็นปัญหาของคุณเช่นกัน เว้นแต่คุณจะใช้ MigraDoc ช่วย
PDFsharp และ MigraDoc: คุณต้องการเลเยอร์ใด?
ผู้จำหน่ายรายเดียวกัน ตารางการออกผลิตภัณฑ์เดียวกัน แต่งานแตกต่างกันมาก MigraDoc Foundation อยู่บนชั้นบนของ PDFsharp แทนที่จะบอกมันว่าข้อความควรอยู่ตรงไหน คุณแค่ส่งส่วนต่างๆ ย่อหน้า ตาราง ส่วนหัว ส่วนท้าย สไตล์ และแผนภูมิบางส่วนให้มัน แล้วมันก็จะหาตำแหน่งที่เหมาะสมให้เอง ผลลัพธ์ที่ได้คือไฟล์ PDF หรือ RTF สำหรับเพื่อนร่วมงานที่ยืนยันว่าต้องเปิดทุกอย่างใน Word
คำย่อของผม: PDFsharp คือ "วางข้อความนี้ไว้ที่ x=40, y=120" ส่วน MigraDoc คือ "นี่คือ 30 แถวและส่วนหัวที่ซ้ำกัน คุณจัดเรียงหน้าเอาเอง"
| งาน | เหมาะสมที่สุด | ทำไม |
|---|---|---|
| ใบรับรองหรือตั๋วแบบหน้าเดียวพร้อมตำแหน่งที่กำหนดไว้ | PDFsharp | ควบคุมทุกพิกัดได้อย่างสมบูรณ์ |
| รายงานหลายหน้าพร้อมตารางและส่วนหัวที่แสดงเรียงตามลำดับ | ไมกราด็อก | การแบ่งหน้าและการจัดรูปแบบอัตโนมัติ |
| ใบแจ้งหนี้ที่มีจำนวนรายการสินค้าไม่แน่นอน | ไมกราด็อก | ตารางจะขยายและแตกออกข้ามหน้าต่างๆ |
| ใส่ตราประทับ ลายน้ำ หรือหมายเลขหน้าลงในไฟล์ PDF ที่มีอยู่แล้ว | PDFsharp | MigraDoc สร้างเอกสารใหม่เท่านั้น |
| รวมหรือแยกไฟล์ที่มีอยู่ | PDFsharp | การนำเข้าหน้าเป็นฟีเจอร์หนึ่งของ PDFsharp |
| แผนภูมิธุรกิจภายในรายงาน | ไมกราด็อก | รองรับการสร้างแผนภูมิในตัว |
| แบบผสม: รายงานที่สร้างขึ้นโดยอัตโนมัติ พร้อมปกที่ออกแบบเป็นพิเศษ | ทั้งคู่ | MigraDoc สามารถเรนเดอร์บนหน้า PDFsharp |
โปรเจกต์จริง ๆ มักจะใช้ทั้งสองอย่าง เช่น ข้อความหลักผ่าน MigraDoc ส่วนปกที่วาดด้วยมือหรือตราประทับบนไฟล์ PDF ของผู้ขายผ่านเลเยอร์ล่าง คุณไม่สามารถหลีกเลี่ยงการติดตั้ง PDFsharp ได้อยู่แล้ว เพราะแพ็กเกจ MigraDoc ดึงมันเข้ามาเป็นส่วนประกอบที่จำเป็น
คำอธิบายเกี่ยวกับการสร้างไฟล์ PDFsharp: การสร้างหลัก, GDI+ และ WPF
ผู้ใช้ใหม่มักจะติดอยู่ที่รายการแพ็กเกจถัดไปใน NuGet PDFsharp 6 มีให้เลือกสามเวอร์ชัน โดยแต่ละเวอร์ชันจะมี MigraDoc เวอร์ชันคู่ขนานเป็นของตัวเอง
| แพ็คเกจ NuGet | สร้าง | แพลตฟอร์ม | แบบอักษรและรูปภาพ |
|---|---|---|---|
| PDFsharp / PDFsharp-MigraDoc | แกนกลาง | วินโดวส์, ลินุกซ์, มอสซาเรลล่า | ต้องใช้ตัวแก้ไขแบบอักษร รองรับไฟล์ภาพ BMP, PNG, JPEG |
| PDFsharp-GDI / PDFsharp-MigraDoc-GDI | จีดีไอ+ | เฉพาะ Windows เท่านั้น | ใช้ฟอนต์ที่ติดตั้งไว้ผ่านทาง System.Drawing |
| PDFsharp-WPF / PDFsharp-MigraDoc-WPF | ดับเบิลยูเอฟพี | เฉพาะ Windows เท่านั้น | ใช้ฟอนต์ที่ติดตั้งไว้ผ่าน WPF |
แพ็กเกจปัจจุบันรองรับ .NET 8, 9 และ 10 รวมถึง .NET Standard 2.0 และ .NET Framework 4.6.2 ดังนั้นจึงครอบคลุมเกือบทุกอย่างที่ยังอยู่ในระหว่างการพัฒนา ตั้งแต่เครื่องมือ WinForms รุ่นเก่าไปจนถึง API ใหม่ล่าสุดของ ASP.NET Core
แอปคอนโซล, เว็บ API, Docker, Azure Functions, หรืออะไรก็ตามบน Linux? ใช้ Core build ดีกว่า GDI+ หรือ WPF จะมีประโยชน์ก็ต่อเมื่อใช้กับแอปเดสก์ท็อปบน Windows ที่ต้องการใช้ฟอนต์ของระบบหรือแสดงตัวอย่างในคอนโทรลแบบเนทีฟ เคยมีคนถามใน Stack Overflow ว่าแอปคอนโซลของเขาจำเป็นต้องใช้เวอร์ชัน WPF หรือไม่ คำตอบคือไม่จำเป็น

วิธีการติดตั้ง PDFsharp จาก NuGet ใน Visual Studio
คุณอาจยังเจอโพสต์ในฟอรัมจากยุค WinForms ที่บอกให้คุณดาวน์โหลดไฟล์ ZIP ค้นหาไฟล์ DLL แล้วเพิ่มการอ้างอิงด้วยตัวเอง อย่าไปสนใจเลย ติดตั้ง PDFsharp ผ่าน NuGet ดีกว่า ตัวจัดการแพ็กเกจจะติดตามเวอร์ชันให้เอง คุณจึงไม่ต้องทำเอง
- เปิดโซลูชันของคุณใน Visual Studio แล้วคลิกขวาที่โปรเจ็กต์ใน Solution Explorer
- เลือก Manage NuGet Packages สลับไปที่แท็บ Browse แล้วค้นหา "PDFsharp"
- เลือก PDFsharp (Core build) หรือ PDFsharp-MigraDoc หากคุณต้องการการจัดรูปแบบเอกสารด้วย ตรวจสอบให้แน่ใจว่าผู้จัดจำหน่ายคือ empira Software GmbH
- คลิก ติดตั้ง และยอมรับข้อตกลงใบอนุญาต
- สร้างโปรเจ็กต์หนึ่งครั้งเพื่อตรวจสอบว่าแพ็กเกจได้รับการกู้คืนอย่างถูกต้องหรือไม่
ผู้ใช้งานเทอร์มินัลสามารถข้ามขั้นตอนการคลิกได้:
bash dotnet add package PDFsharp dotnet add package PDFsharp-MigraDoc
ภายใน Package Manager Console ก็ใช้คำสั่งเดียวกันคือ Install-Package PDFsharp และโปรดอย่าใช้เวอร์ชันที่แตกต่างกันปะปนกัน ผมเคยเห็นทีมงานเสียเวลาไปทั้งบ่ายเพราะปัญหาเรื่องประเภทข้อมูลขัดแย้งกัน เนื่องจากโปรเจกต์หนึ่งอ้างอิงถึง PDFsharp ในขณะที่โปรเจกต์ข้างเคียงดึง PDFsharp-GDI เข้ามาด้วย
เอกสาร PDF ฉบับแรกของคุณที่สร้างด้วย PDFsharp ใน C
ด้านล่างนี้คือโปรแกรมขนาดเล็กที่สุดที่สร้างไฟล์ PDF หนึ่งหน้า โปรแกรมนี้ทำงานบน Core build บนระบบปฏิบัติการใดก็ได้ ตราบใดที่ได้ตั้งค่าตัวแก้ไขฟอนต์ไว้แล้ว (ส่วนถัดไป)
```csharp
โดยใช้ PdfSharp.Drawing;
โดยใช้ PdfSharp.Pdf;
// PDFsharp 6.5 ขึ้นไป จำเป็นต้องเลือกใบอนุญาตก่อนใช้งานครั้งแรก
PdfSharpLicense.SetAgplLicense();
var document = new PdfDocument();
document.Info.Title = "สวัสดี PDFsharp";
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);
var font = new XFont("Arial", 20, XFontStyleEx.Bold);
gfx.DrawString("สวัสดี PDFsharp!", font, XBrushes.Black,
XRect ใหม่ (0, 0, page.Width.Point, page.Height.Point)
XStringFormats.Center);
document.Save("hello.pdf");
```
โปรแกรม PDFsharp ทุกโปรแกรมมีรูปแบบดังนี้: เอกสาร, หน้า, XGraphics, วาด, บันทึก หน่วยเป็นจุด (1/72 นิ้ว) และจุดกำเนิดอยู่ที่มุมบนซ้าย สำหรับเวอร์ชัน 6.2.x ให้ลบบรรทัดใบอนุญาตออก API นั้นเพิ่งปรากฏในเวอร์ชัน 6.5.0
และเวอร์ชัน MigraDoc:
```csharp
โดยใช้ MigraDoc.DocumentObjectModel;
โดยใช้ MigraDoc.Rendering;
var doc = new Document();
ส่วน section = doc.AddSection();
section.AddParagraph("สวัสดี MigraDoc!");
var renderer = PdfDocumentRenderer ใหม่ { Document = doc };
renderer.RenderDocument();
renderer.PdfDocument.Save("hello-migradoc.pdf");
```
ไม่มีพิกัดใดๆ ทั้งสิ้น ใส่ข้อความ 500 ย่อหน้าเข้าไป ก็จะได้จำนวนหน้าตามที่ต้องการ โดยไม่มีโค้ดสำหรับการแบ่งหน้าเลยแม้แต่น้อย
ปัญหาเกี่ยวกับฟอนต์ใน PDFsharp Core Build: ปัญหาของตัวแก้ไข (Resolver)
ลองถามคนรอบข้างดู แล้วคุณจะได้ยินคำบ่นเรื่องฟอนต์บ่อยที่สุด การสร้างด้วย GDI+ และ WPF จะอ่านเฉพาะฟอนต์ TrueType ที่ติดตั้งไว้ใน Windows เท่านั้น ส่วนการสร้างแบบ Core นั้นไม่สามารถคาดเดาอะไรได้ เพราะคอนเทนเนอร์ Linux ขนาดเล็กมักไม่มีฟอนต์ที่ใช้งานได้เลย ดังนั้นการใช้งาน Docker ครั้งแรกจึงมักจบลงด้วยข้อผิดพลาดเกี่ยวกับการไม่พบฟอนต์ที่เหมาะสม
วิธีแก้ปัญหาคือการใช้ตัวแก้ไขแบบอักษร (font resolver) ซึ่งเป็นคลาสที่ใช้งานอินเทอร์เฟซ IFontResolver โดยมีสองเมธอด:
- ResolveTypeface จะจับคู่ตระกูลและรูปแบบที่ร้องขอ (เช่น "Arial" ตัวหนา) กับชื่อแบบอักษร
- ฟังก์ชัน GetFont จะส่งคืนไบต์ดิบของไฟล์ TTF สำหรับชื่อแบบอักษรนั้น
ลงทะเบียนฟอนต์เพียงครั้งเดียวตอนเริ่มต้นระบบผ่าน GlobalFontSettings.FontResolver ก่อนที่จะสร้าง XFont ตัวแรก
```csharp
คลาสสาธารณะ AppFontResolver : IFontResolver
{
public FontResolverInfo? ResolveTypeface(string family, bool bold, bool italic)
=> new FontResolverInfo(bold ? "Inter-Bold" : "Inter-Regular");
public byte[]? GetFont(string faceName) => File.ReadAllBytes(Path.Combine(AppContext.BaseDirectory, "Fonts", faceName + ".ttf"));
}
GlobalFontSettings.FontResolver = new AppFontResolver();
```
สิ่งที่คุณควรรู้ก่อนลงมือทำด้วยตัวเอง:
- เก็บไฟล์ TTF ของคุณไว้ในโฟลเดอร์ Fonts ในโปรเจ็กต์ และตั้งค่าให้คัดลอกไปยังไดเร็กทอรีเอาต์พุต หรือฝังเป็นทรัพยากรเพื่อให้ภาพคอนเทนเนอร์มีไฟล์เหล่านั้นอยู่เสมอ
- เวอร์ชัน 6.2.0 ได้ลบ CoreBuildFontResolver เวอร์ชันเก่าออกไปแล้ว บน Windows หรือ WSL2 คุณสามารถเรียกคืนพฤติกรรมที่คล้ายกันได้โดยใช้ GlobalFontSettings.UseWindowsFontsUnderWindows แต่คำสั่งนี้จะไม่มีผลใดๆ บน Linux หรือ macOS
- คลังตัวอย่างอย่างเป็นทางการมี SubstitutingFontResolver ที่คุณสามารถคัดลอกเพื่อใช้เป็นจุดเริ่มต้นได้
- ตรวจสอบใบอนุญาตใช้งานฟอนต์ก่อนที่จะฝังฟอนต์เชิงพาณิชย์ลงในไฟล์ที่สร้างขึ้น ฟอนต์โอเพนซอร์ส เช่น Inter, Roboto หรือ Noto จะไม่มีปัญหาเรื่องนี้เลย
เมื่อติดตั้งตัวแก้ไขแล้ว ผลลัพธ์ที่ได้จะเหมือนกันทุกประการบน Windows, Linux และ macOS
การรวม การลงนาม และการรักษาความปลอดภัยไฟล์ด้วย PDFsharp 6
หลายทีมไม่เคยสร้างเอกสารใหม่ตั้งแต่ต้น พวกเขาใช้ไลบรารีเพื่อรวม ผสาน หรือล็อกไฟล์ที่มีอยู่แล้ว การรวมไฟล์ทำได้ง่ายๆ เพียงไม่กี่บรรทัด: เปิดแต่ละไฟล์ต้นฉบับในโหมดนำเข้า แล้วคัดลอกหน้าต่างๆ ลงไป
csharp var output = new PdfDocument(); foreach (var path in new[] { "part1.pdf", "part2.pdf" }) { using var input = PdfReader.Open(path, PdfDocumentOpenMode.Import); foreach (PdfPage p in input.Pages) output.AddPage(p); } output.Save("merged.pdf");
การแบ่งไฟล์เป็นการทำงานแบบเดียวกันแต่ทำย้อนกลับ โดยจะได้ไฟล์เอาต์พุตหนึ่งไฟล์ต่อหน้าหรือช่วงที่กำหนด เพื่อความปลอดภัย ไฟล์ document.SecuritySettings จะรับรหัสผ่านผู้ใช้ รหัสผ่านเจ้าของ และแฟล็กการอนุญาต (เช่น พิมพ์ คัดลอกข้อความ เป็นต้น)
สองฟีเจอร์ที่หลายคนเรียกร้องมานาน ในที่สุดก็ถูกเพิ่มเข้ามาในเวอร์ชัน 6.2 แล้ว:
- ลาย เซ็นดิจิทัล ที่ใช้ CMS ตัวลงนามเริ่มต้นจะมาพร้อมกับแอสเซมบลี PDFsharp.Cryptography แยกต่างหาก และคุณสามารถเสียบปลั๊กตัวลงนามของคุณเองได้โดยการใช้งาน IDigitalSigner การรองรับเซิร์ฟเวอร์ประทับเวลาใช้งานได้ใน .NET รุ่นใหม่ แต่ใช้งานไม่ได้ในเวอร์ชัน .NET Framework
- ไฟล์ PDF/A ที่ส่งออก สำหรับการจัดเก็บถาวร เอกสารทางการระบุว่าใช้งานได้ "โดยมีข้อจำกัดบางประการ" และยังอยู่ระหว่างการพัฒนา ดังนั้นควรตรวจสอบความถูกต้องของผลลัพธ์ด้วยโปรแกรมตรวจสอบ PDF/A ก่อนที่จะนำไปใช้เพื่อการปฏิบัติตามข้อกำหนด
การอัปเดตครั้งนั้นยังเพิ่มสัญลักษณ์อีโมจิสี และการใช้งาน MD5 แบบจัดการ ซึ่งมีความสำคัญหากคุณใช้งานภายใต้กฎ FIPS หรือใน Blazor
คลังเก็บข้อมูล PDFsharp, การแยกสาขา PdfSharpCore และเวอร์ชัน 1.x
ลองค้นหา PDFsharp บน GitHub คุณจะพบโปรเจ็กต์จำนวนมากที่มีชื่อคล้ายกันมาก โทษประวัติศาสตร์เถอะ
เวอร์ชัน 1.x เก่า (1.50, 1.51) ใช้งานได้เฉพาะบน .NET Framework เท่านั้น เมื่อ .NET Core ออกมา ผู้คนไม่อยากรอ จึงทำการพอร์ตโค้ดด้วยตนเอง PdfSharpCore ซึ่งเริ่มต้นโดย Stefan Steiger และได้รับการพัฒนาต่อยอดโดยผู้พัฒนาคนอื่นๆ ในภายหลัง เป็นเวอร์ชันที่คนส่วนใหญ่รู้จัก มันได้ตัด GDI+ ออกไปและทำให้โค้ดสามารถทำงานบน Linux ได้หลายปีก่อนการเปิดตัวอย่างเป็นทางการ
จากนั้น PDFsharp 6 ก็มาถึง: การเขียนใหม่ทั้งหมดบน .NET สมัยใหม่ พร้อมด้วย Core build อย่างเป็นทางการที่ใช้งานได้หลายแพลตฟอร์ม ทำให้เวอร์ชันที่แยกออกมานั้นหมดความจำเป็นไปโดยปริยาย
| โครงการ | ผู้ดูแลระบบ | แพลตฟอร์ม | สถานะ |
|---|---|---|---|
| PDFsharp 6.x (จากคลังข้อมูล empira/PDFsharp) | บริษัท เอ็มพีรา ซอฟต์แวร์ จำกัด | .NET 8–10, .NET Standard 2.0, .NET Framework 4.6.2 | มีการดูแลรักษาอย่างสม่ำเสมอ |
| PDFsharp 1.5x | บริษัท เอ็มพีรา ซอฟต์แวร์ จำกัด | เฉพาะ .NET Framework เท่านั้น | โค้ดต้นฉบับยังคงอยู่บน GitHub แต่ไม่มีการบำรุงรักษาอีกต่อไป |
| PdfSharpCore และเวอร์ชันที่แตกแขนงออกมา | ชุมชน | .NET Core / .NET Standard 2.0 | แตกต่างกันไปตามแต่ละเวอร์ชันที่แยกออกมา การอัปเดตจะช้าลง |
| PDFsharp-MigraDoc 6.x | บริษัท เอ็มพีรา ซอฟต์แวร์ จำกัด | เหมือนกับ PDFsharp 6 | มีการดูแลรักษาอย่างสม่ำเสมอ |
ดังนั้น กระทู้ "PdfSharp vs PdfSharpCore" ที่โผล่มาบ่อยๆ ใน Reddit ล่ะ? โปรเจกต์ใหม่ ใช้แพ็กเกจอย่างเป็นทางการ เก็บ fork ไว้เฉพาะในกรณีที่โค้ดเก่าๆ ยังพึ่งพาแพ็กเกจนี้อยู่ และการย้ายไปใช้เวอร์ชันใหม่ยังไม่คุ้มค่าในตอนนี้ และถ้าหากเอกสารประกอบยังไม่ครบถ้วน ลองไปดูที่คลังตัวอย่างแยกต่างหากของ empira ดู โฟลเดอร์และไฟล์ในนั้นเป็นตัวอย่างที่สามารถรันได้ ซึ่งดีกว่าการเดาเอาเอง
PDFsharp ฟรีหรือไม่? การเปลี่ยนแปลงด้านลิขสิทธิ์ใน PDFsharp 6.5
ใช่แล้ว ตลอดช่วงอายุการใช้งานส่วนใหญ่ ซอฟต์แวร์นี้ได้รับอนุญาตภายใต้ MIT License ซึ่งหมายความว่าสามารถใช้งานเชิงพาณิชย์ได้โดยแทบไม่มีข้อผูกมัดใดๆ ทุกเวอร์ชันจนถึง 6.2.4 ยังคงได้รับอนุญาตภายใต้ MIT License เช่นกัน
เวอร์ชัน 6.5.0 ได้เปลี่ยนแปลงสิ่งนั้นไปแล้ว ตอนนี้ไลบรารีมีการอนุญาตใช้งานแบบสองประเภท:
- AGPL (ฟรี) คุณสามารถเปิดใช้งานได้โดยการเรียกใช้ PdfSharpLicense.SetAgplLicense() ก่อนใช้งานไลบรารี AGPL กำหนดให้คุณต้องเปิดเผยซอร์สโค้ดของคุณให้ผู้ใช้เข้าถึงได้ รวมถึงผู้ใช้ที่ใช้งานซอฟต์แวร์ของคุณผ่านเครือข่าย ดังนั้นจึงไม่เหมาะสมกับ SaaS ที่เป็นซอฟต์แวร์ปิดแหล่งที่มา
- ใบอนุญาตเชิงพาณิชย์ คุณซื้อรหัสใบอนุญาตจากผู้ขายและโหลดด้วย PdfSharpLicense.LoadLicense(...) ซึ่งจะลบข้อผูกพันภายใต้ AGPL ออกไป
ตั้งแต่เวอร์ชัน 6.5.0 เป็นต้นไป โค้ดของคุณจะต้องเลือกอย่างใดอย่างหนึ่งอย่างชัดเจน เวอร์ชันพรีวิว 7.0 ก็ทำงานในลักษณะเดียวกัน
ในทางปฏิบัติ:
- โครงการโอเพนซอร์สที่เข้ากันได้กับ AGPL สามารถใช้งานเวอร์ชันล่าสุดได้ฟรีต่อไป
- ผลิตภัณฑ์โอเพนซอร์สสามารถเลือกที่จะซื้อใบอนุญาตเชิงพาณิชย์หรือใช้เวอร์ชัน 6.2.x ต่อไป ซึ่งยังคงอยู่ภายใต้ลิขสิทธิ์ MIT การใช้เวอร์ชันเดิมหมายถึงการพลาดการแก้ไขข้อบกพร่องในอนาคต ดังนั้นควรพิจารณาต้นทุนอย่างรอบคอบ
- ไม่ว่าคุณจะเลือกวิธีใด โปรดอ่านข้อความในสัญญาอนุญาตอย่างละเอียดและให้ทีมกฎหมายของคุณลงนามรับรอง คู่มือนี้ไม่ใช่คำแนะนำทางกฎหมาย

ข้อจำกัดของ PDFsharp และควรใช้งานร่วมกับโปรแกรมอะไร
ห้องสมุดทำหน้าที่ได้ดี เพียงแต่ขอบเขตงานค่อนข้างแคบ และช่องว่างเดิมๆ ก็ปรากฏขึ้นในทุกกระทู้ในฟอรัม
- ไม่มีฟังก์ชันแปลง HTML เป็น PDF PDFsharp ไม่แสดงผล HTML หรือ CSS มีส่วนเสริมจากชุมชนชื่อ HtmlRenderer.PdfSharp แต่รองรับเฉพาะ HTML 4.01 และ CSS ระดับ 2 เท่านั้น ดังนั้นเลย์เอาต์สมัยใหม่ที่ใช้ flexbox หรือ grid จะใช้งานไม่ได้ ทีมที่ต้องการเทมเพลต HTML มักจะเลือกใช้ตัวเรนเดอร์แบบ headless-browser แทน
- ไม่มี JavaScript แผนภูมิหรือเนื้อหาที่สร้างขึ้นฝั่งไคลเอ็นต์จะไม่สามารถบันทึกได้
- ไม่สามารถแปลงไฟล์ PDF เป็นรูปภาพได้ PDFsharp ไม่สามารถแปลงหน้า PDF เป็นไฟล์ PNG สำหรับภาพขนาดย่อหรือภาพตัวอย่างได้ คุณต้องใช้โปรแกรมแปลงไฟล์เป็นภาพ (rasterizer) แยกต่างหาก
- การดึงข้อความมีข้อจำกัด คุณสามารถไล่ดูเนื้อหาได้ แต่ไม่มี API ระดับสูงที่ส่งคืนข้อความที่สะอาดพร้อมตำแหน่ง PdfPig ซึ่งเป็นไลบรารีโอเพนซอร์สแยกต่างหาก ถูกสร้างขึ้นมาโดยเฉพาะสำหรับการอ่านและดึงข้อความ
- รองรับเฉพาะแบบฟอร์มบางส่วนเท่านั้น การกรอกแบบฟอร์ม AcroForm แบบง่ายๆ ทำได้ แต่แบบฟอร์มที่ซับซ้อนซึ่งมีสคริปต์นั้นเป็นอีกเรื่องหนึ่ง
- ตารางต้องใช้ MigraDoc หากใช้ PDFsharp แบบธรรมดา คุณต้องคำนวณความสูงของแต่ละแถวด้วยตนเอง
นั่นไม่ได้หมายความว่ามันเป็นตัวเลือกที่ไม่ดี เอกสารที่ขับเคลื่อนด้วยข้อมูล เช่น ใบแจ้งหนี้ ใบเสร็จรับเงิน ฉลาก และใบรับรอง คือจุดแข็งที่สุดของมัน และขนาดไฟล์ก็เล็กมาก แต่การคัดลอกหน้าเว็บแบบเป๊ะทุกพิกเซลนั้นไม่ใช่แบบนั้น
PDFsharp สำหรับใบแจ้งหนี้และใบเสร็จรับเงินคริปโต
ใบเสร็จรับเงินน่าจะเป็นสิ่งที่คนส่วนใหญ่สร้างด้วย PDFsharp มากที่สุด ใบเสร็จรับเงินคริปโตนั้นซับซ้อนกว่าใบเสร็จบัตรเครดิตเล็กน้อย แต่ข่าวดีก็คือ เมื่อเกตเวย์ส่งข้อมูลไปยัง webhook ของคุณ (การเรียกกลับ HTTP ที่ส่งเมื่อสถานะการชำระเงินเปลี่ยน) คุณก็จะได้ข้อมูลทั้งหมดแล้ว ไม่ต้องค้นหาข้อมูลเพิ่มเติมใดๆ
ถ้าจะใส่อะไรลงไปในนั้น ฉันจะใส่ไว้ดังนี้:
- รหัสคำสั่งซื้อหรือใบแจ้งหนี้ และรายละเอียดของร้านค้า
- จำนวนเงินในสกุลเงินดิจิทัลและมูลค่าเทียบเท่าในสกุลเงินทั่วไป ณ เวลาที่ชำระเงิน
- ความแตกต่างระหว่างเหรียญและเครือข่าย (ตัวอย่างเช่น USDT บน TRON เทียบกับ USDT บน Ethereum)
- แฮชของธุรกรรม เพื่อให้ลูกค้าสามารถตรวจสอบได้บนตัวสำรวจบล็อก
- ที่อยู่กระเป๋าเงินรับแบบย่อและเวลาการยืนยัน
- รหัส QR ที่เชื่อมโยงไปยังหน้าธุรกรรมหรือใบแจ้งหนี้
ใช้ฟอนต์ Monospace สำหรับแฮชแท็กและที่อยู่ ลูกค้าต้องเพ่งสายตาอ่านทีละตัวอักษร และในฟอนต์ Arial เลขศูนย์กับตัว O พิมพ์ใหญ่จะดูเหมือนฝาแฝด ถ้าแฮชแท็กกว้างเกินไป ให้ตัดบรรทัด ฟอนต์ขนาด 6pt ไม่ช่วยอะไรใครเลย ฝังฟอนต์ลงในไฟล์ บันทึกไฟล์พร้อมกับใบสั่งซื้อ และเซ็นชื่อหากนักบัญชีของคุณขอใบเสร็จรับเงิน
ทั้งหมดนั้นยังไม่รวมถึงขั้นตอนการรับเงินจริง ๆ สำหรับส่วนนั้น คุณจะต้องใช้เกตเวย์อย่าง Plisio มันรับ BTC, USDT และสกุลเงินอื่น ๆ อีกมากมาย สร้างใบแจ้งหนี้ และเรียกใช้เอนด์พอยต์ของคุณทุกครั้งที่สถานะเปลี่ยนแปลง ตัวจัดการของคุณจะส่งข้อมูลไปยัง MigraDoc และผู้ซื้อจะได้รับใบเสร็จที่มีโลโก้ของคุณอยู่บนนั้นในขณะที่พวกเขายังอยู่ในหน้าขอบคุณ
บทสรุป
ผมกลับมาใช้ PDFsharp ซ้ำแล้วซ้ำเล่าด้วยเหตุผลเดียวคือ มันมีขนาดเล็กและไม่เกะกะ เวอร์ชัน Core สามารถทำงานได้ทุกที่ที่มี .NET และ MigraDoc จะช่วยจัดวางเลย์เอาต์เมื่อพื้นที่แสดงผลไม่เพียงพอ มีสามสิ่งที่คุณควรตัดสินใจตั้งแต่เนิ่นๆ คือ เลือกใช้เวอร์ชันใด วิธีการโหลดฟอนต์ และใบอนุญาตที่คุณใช้หลังจากเวอร์ชัน 6.5 เปลี่ยนเป็น AGPL แล้ว พิมพ์ข้อมูล ไม่ใช่หน้าเว็บ แล้วมันจะใช้งานได้นานหลายปี