Các lớp tiện ích và trợ giúp
Các lớp Tiện ích và Trợ giúp
Hướng dẫn này chỉ ra cách sử dụng các lớp trợ giúp nhỏ, tập trung mà Aspose.PDF FOSS cho .NET cung cấp cho các nhiệm vụ cấp thấp phổ biến: toán học số nguyên được các primitive bảo mật sử dụng, cấu hình tìm kiếm regex, đánh giá hàm PostScript, khám phá phông chữ bên ngoài, trích xuất đường dẫn phụ của vector, đo lường văn bản vật lý, chỉnh sửa luồng nội dung được đệm, các luồng bộ nhớ lớn, và báo cáo phiên bản thư viện. Các lớp này không phải là điểm vào độc lập, nhưng chúng hỗ trợ các hoạt động tài liệu, văn bản và render ở mức cao hơn trên toàn bộ API.
Trợ giúp toán học số nguyên
MathExtensions là một trợ giúp tĩnh nhỏ được sử dụng nội bộ bởi các primitive bảo mật của thư viện, nhưng nó khả dụng cho việc sử dụng chung bất cứ khi nào bạn cần một phép modulo luôn trả về kết quả không âm.
// Unlike the C# % operator, Mod never returns a negative value.
int wrapped = MathExtensions.Mod(-3, 5); // 2Cấu hình tìm kiếm Regex
RegexManager là một lớp tĩnh cấu hình động cơ biểu thức chính quy được sử dụng trong các thao tác tìm kiếm văn bản như TextFragmentAbsorber. Đặt MatchTimeout để giới hạn thời gian một mẫu được phép chạy, và bật NonBacktracking để sử dụng động cơ regex không quay lại cho các tìm kiếm nhạy cảm về hiệu năng.
using var doc = Document.Open(pdfBytes);
// Guard against runaway regex patterns.
RegexManager.MatchTimeout = TimeSpan.FromSeconds(5);
RegexManager.NonBacktracking = true;
var absorber = new TextFragmentAbsorber(@"\d{3}-\d{4}", true);
doc.Pages[1].Accept(absorber);Đánh giá các hàm PostScript
PostScriptEvaluator là một lớp tĩnh đánh giá các hàm PDF loại 4 (PDF32000 §7.10.5) — các chương trình máy tính PostScript được nhúng trong PDF, chẳng hạn như những chương trình được sử dụng trong một số định nghĩa không gian màu và độ bóng.
double[] inputs = { 0.5 };
// Evaluate a PostScript calculator program against the input array.
var outputs = PostScriptEvaluator.Evaluate("{ 2 mul }", inputs);Đường dẫn tìm kiếm phông chữ bên ngoài
ExternalFontCache quản lý các thư mục được tìm kiếm cho các phông chữ TrueType/OpenType bên ngoài (không nhúng) trong quá trình render và chuyển đổi. Sử dụng Instance để truy cập singleton, GetDefaultFontsFolders để kiểm tra các vị trí tìm kiếm tích hợp, và SetFontsFolders để thêm hoặc thay thế chúng.
var cache = ExternalFontCache.Instance;
var defaultFolders = cache.GetDefaultFontsFolders();
// reset: false appends to the existing search paths instead of replacing them.
cache.SetFontsFolders(new[] { @"C:\Fonts\Custom" }, reset: false);Trích xuất các đoạn con vectơ
GraphicsAbsorber duyệt một trang và trích xuất các sub-path vectơ đã được vẽ của nó dưới dạng các phần tử SubPath, mỗi phần tử mang khung giới hạn Rectangle trong không gian trang của riêng nó. Điều này hữu ích để kiểm tra hoặc đo lường tác phẩm vectơ mà không cần phân tích luồng nội dung bằng tay.
using var doc = Document.Open(pdfBytes);
var absorber = new GraphicsAbsorber();
absorber.Visit(doc.Pages[1]);
Console.WriteLine($"Elements found: {absorber.Elements.Count}");
foreach (var element in absorber.Elements)
{
if (element is SubPath subPath)
{
Rectangle bounds = subPath.Rectangle;
Console.WriteLine($"Sub-path bounds: [{bounds.LLX}, {bounds.LLY}, {bounds.URX}, {bounds.URY}]");
}
}Đo lường đoạn văn bản vật lý
PhysicalTextSegment là phép chiếu trong không gian trang của một TextSegment đã được hấp thụ. Truy cập nó qua TextSegment.PhysicalSegment để đo một chuỗi ký tự hoặc đọc TextState đã được giải quyết của nó.
using var doc = Document.Open(pdfBytes);
var absorber = new TextFragmentAbsorber();
doc.Pages[1].Accept(absorber);
foreach (TextFragment fragment in absorber.TextFragments)
{
foreach (TextSegment segment in fragment.Segments)
{
PhysicalTextSegment physical = segment.PhysicalSegment;
var width = physical.MeasureSegment(segment.StartCharIndex, segment.EndCharIndex, true);
TextState state = physical.TextState;
}
}Đệm các chỉnh sửa luồng nội dung
ContentsAppender, được truy cập qua Page.ContentsAppender, lưu đệm các toán tử để chèn vào đầu hoặc cuối luồng nội dung của trang và cam kết chúng trong một lần với UpdateData.
using var doc = Document.Open(pdfBytes);
Page page = doc.Pages[1];
page.ContentsAppender.AppendToBegin(new GSave());
page.ContentsAppender.AppendToEnd(new GRestore());
page.ContentsAppender.UpdateData();Luồng bộ nhớ lớn
OptimizedMemoryStream là một luồng bộ nhớ có thể mở rộng cho phép vượt qua giới hạn 2 GB một mảng duy nhất của MemoryStream bằng cách lưu trữ dữ liệu trong các khối kích thước cố định. Nó kế thừa từ Stream, vì vậy nó hỗ trợ các thao tác đọc, ghi và di chuyển con trỏ thông thường.
using var stream = new OptimizedMemoryStream();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("large payload");
stream.Write(buffer, 0, buffer.Length);
bool canSeek = stream.CanSeek;
byte[] allBytes = stream.ToArray();Thông tin phiên bản thư viện
BuildVersionInfo là một lớp tĩnh cung cấp tên sản phẩm và số phiên bản của thư viện tại thời gian chạy — hữu ích cho việc chẩn đoán và yêu cầu hỗ trợ.
Console.WriteLine(BuildVersionInfo.Product);
Console.WriteLine(BuildVersionInfo.AssemblyVersion);
Console.WriteLine(BuildVersionInfo.FileVersion);Mẹo và Thực hành Tốt nhất
- Đặt
RegexManager.MatchTimeouttrước khi thực hiện tìm kiếm trên các mẫu không tin cậy hoặc do người dùng cung cấp để tránh backtracking thảm khốc. - Gọi
ExternalFontCache.SetFontsFoldersvớireset: truekhi bạn muốn thay thế hoàn toàn các đường dẫn tìm kiếm mặc định thay vì thêm vào chúng. - Ưu tiên
OptimizedMemoryStreamhơnMemoryStreamkhi đệm các tài liệu rất lớn hoặc dữ liệu hình ảnh có thể vượt quá 2 GB. - Luôn luôn hoàn thành một lô các chỉnh sửa
ContentsAppenderbằngUpdateData()— các toán tử được đệm sẽ không được cam kết vào luồng nội dung cho đến thời điểm đó. GraphicsAbsorber.Elementscó thể chứa các thể hiệnGraphicElementkhácSubPath; hãy kiểm tra kiểu trước khi ép kiểu.
Các vấn đề thường gặp
| Vấn đề | Nguyên nhân | Cách khắc phục |
|---|---|---|
| Tìm kiếm Regex bị treo với các mẫu phức tạp | Chưa cấu hình thời gian chờ trên RegexManager | Đặt RegexManager.MatchTimeout trước khi chạy các tìm kiếm TextFragmentAbsorber |
Các chỉnh sửa luồng nội dung từ ContentsAppender không xuất hiện trong tệp đã lưu | UpdateData() không bao giờ được gọi | Gọi UpdateData() sau lần gọi cuối cùng của AppendToBegin/AppendToEnd |
| Phông chữ tùy chỉnh không được nhận diện trong quá trình render | Thư mục phông chữ chưa được đăng ký, hoặc reset: true đã xóa các mặc định dự kiến | Gọi ExternalFontCache.SetFontsFolders với danh sách thư mục đúng và giá trị reset |
OutOfMemoryException khi đệm đầu ra rất lớn | MemoryStream đã đạt giới hạn 2 GB cho một mảng đơn | Sử dụng OptimizedMemoryStream, nó lưu trữ dữ liệu thành các khối có kích thước cố định |
FAQ
Tại sao MathExtensions.Mod lại khác với toán tử % của C#?
MathExtensions.Mod luôn trả về phần dư không âm, trong khi toán tử % tích hợp có thể trả về giá trị âm khi số chia là âm.
Làm thế nào để ngăn một tìm kiếm văn bản dựa trên regex chạy quá lâu?
Đặt RegexManager.MatchTimeout thành TimeSpan trước khi xây dựng hoặc chạy một TextFragmentAbsorber sử dụng mẫu regex.
Liệu SetFontsFolders có thay thế hay thêm vào các đường dẫn tìm kiếm hiện có không?
Điều này phụ thuộc vào đối số reset: truyền true để thay thế danh sách thư mục hiện tại, hoặc false để thêm các thư mục mới vào danh sách.
Thực tế GraphicsAbsorber trích xuất gì?
Nó trích xuất các sub-path vector được tô màu của một trang dưới dạng các phần tử SubPath, mỗi phần tử có một Rectangle bao quanh trong không gian trang, thông qua GraphicsAbsorber.Visit.
Khi nào tôi nên sử dụng OptimizedMemoryStream thay vì MemoryStream?
Khi dữ liệu được đệm có thể tiếp cận hoặc vượt quá 2 GB, vì MemoryStream được hỗ trợ bởi một mảng duy nhất với giới hạn cứng đó.
API Reference Tóm tắt
| Lớp / Phương thức | Mô tả |
|---|---|
MathExtensions.Mod | Trợ giúp modulo số nguyên không âm được sử dụng bởi các primitive bảo mật |
RegexManager.MatchTimeout | Thời gian chờ áp dụng cho các tìm kiếm văn bản dựa trên regex |
RegexManager.NonBacktracking | Kích hoạt engine regex không backtracking |
PostScriptEvaluator.Evaluate | Đánh giá hàm máy tính PostScript PDF Loại 4 |
ExternalFontCache.Instance | Truy cập singleton tới bộ nhớ đệm phông chữ bên ngoài |
ExternalFontCache.GetDefaultFontsFolders | Trả về các thư mục tìm kiếm phông chữ bên ngoài mặc định |
ExternalFontCache.SetFontsFolders | Thêm hoặc thay thế các thư mục tìm kiếm phông chữ bên ngoài |
GraphicsAbsorber.Visit | Trích xuất các phần tử đồ họa vector từ một trang |
GraphicsAbsorber.Elements | Bộ sưu tập các mục GraphicElement/SubPath đã được trích xuất |
SubPath.Rectangle | Hình chữ nhật bao quanh trong không gian trang của một đoạn con đã được trích xuất |
PhysicalTextSegment.MeasureSegment | Đo khoảng ký tự của một đoạn văn bản vật lý |
PhysicalTextSegment.TextState | Trạng thái định dạng đã được giải quyết của một đoạn văn bản vật lý |
ContentsAppender.AppendToBegin | Đệm một toán tử để chèn vào đầu luồng nội dung của trang |
ContentsAppender.AppendToEnd | Đệm một toán tử để nối vào luồng nội dung của trang |
ContentsAppender.UpdateData | Đẩy các toán tử đã đệm vào luồng nội dung |
OptimizedMemoryStream | Luồng bộ nhớ trong có thể mở rộng vượt quá giới hạn 2 GB MemoryStream |
BuildVersionInfo.Product | Tên sản phẩm của thư viện đang chạy |
BuildVersionInfo.AssemblyVersion | Phiên bản Assembly của thư viện đang chạy |
BuildVersionInfo.FileVersion | Phiên bản tệp của thư viện đang chạy |