Cách làm việc với Quản lý Tài liệu Core trong .NET
Aspose.PDF FOSS for .NET cung cấp lớp Document làm điểm vào trung tâm cho tất cả các thao tác PDF. Cài đặt gói bằng dotnet add package Aspose.Pdf.Foss --version 0.1.0-alpha và sử dụng Document.Create(), Document.Open(), Document.Save() và Document.Merge() để quản lý tài liệu PDF một cách lập trình trên .NET 8+.
Hướng Dẫn Từng Bước
Bước 1: Cài đặt gói
Thêm Aspose.PDF FOSS vào dự án của bạn:
dotnet add package Aspose.Pdf.Foss --version 0.1.0-alphaXác minh tham chiếu trong .csproj của bạn:
<PackageReference Include="Aspose.Pdf.Foss" Version="0.1.0-alpha" />Bước 2: Nhập các lớp cần thiết
Thêm các chỉ thị using cần thiết vào đầu tệp của bạn:
using Aspose.Pdf;
using Aspose.Pdf.Annotations;Bước 3: Tạo tài liệu PDF mới
Sử dụng Document.Create() để tạo một tài liệu trống trong bộ nhớ:
using var doc = Document.Create();
// The document has no pages yet; add pages before saving
using var ms = new MemoryStream();
doc.Save(ms);
byte[] pdfBytes = ms.ToArray();Bước 4: Mở một PDF hiện có
Document.Open chấp nhận một mảng byte, đường dẫn tệp hoặc luồng. Sử dụng using để đảm bảo tài liệu được giải phóng sau khi sử dụng:
// From a file path
using var doc = Document.Open("input.pdf");
var page = doc.Pages[1];
// From a byte array loaded elsewhere
byte[] data = File.ReadAllBytes("input.pdf");
using var doc2 = Document.Open(data);Bước 5: Truy cập các trang
Thuộc tính Document.Pages trả về một PageCollection. Các trang được đánh số bắt đầu từ 1:
using var doc = Document.Open("input.pdf");
int pageCount = doc.Pages.Count;
var firstPage = doc.Pages[1];
double width = firstPage.Width;
double height = firstPage.Height;Bước 6: Lưu tài liệu
Lưu vào luồng bằng Document.Save(), hoặc tuần tự hoá thành mảng byte bằng Document.ToArray():
using var doc = Document.Open("input.pdf");
var page = doc.Pages[1];
var action = PdfAction.CreateUri("https://aspose.com/test");
page.Annotations.AddLinkAnnotation(new Rectangle(50, 700, 200, 720), action);
using var ms = new MemoryStream();
doc.Save(ms);
ms.Position = 0;
byte[] savedBytes = ms.ToArray();Bước 7: Hợp nhất nhiều tài liệu
Sử dụng Document.Merge() để kết hợp nhiều thể hiện Document thành một:
using var doc1 = Document.Open("part1.pdf");
using var doc2 = Document.Open("part2.pdf");
var merged = Document.Merge(new[] { doc1, doc2 });
merged.Save("combined.pdf");Document.MergeDocuments() là một overload tương đương cho phép chấp nhận mảng đường dẫn tệp trực tiếp.
Các vấn đề thường gặp và cách khắc phục
Pages collection is empty after Document.Create()Document.Create() trả về một tài liệu không có trang. Bạn phải thêm một trang một cách rõ ràng trước khi truy cập doc.Pages[1]. Cố gắng truy cập một chỉ mục không tồn tại sẽ ném ra một IndexOutOfRangeException.
InvalidOperationException khi gọi Document.Open trên tệp bị hỏng
Nếu mảng byte PDF hoặc tệp bị cắt ngắn hoặc không hợp lệ, Document.Open sẽ ném ra. Xác thực rằng mảng byte nguồn là một PDF đầy đủ (bắt đầu bằng %PDF-) trước khi truyền nó cho Open.
Document not disposed — memory leak in high-throughput scenarios
Luôn bao bọc các lời gọi Document.Open và Document.Create trong một câu lệnh using. Lớp Document triển khai IDisposable; nếu không giải phóng nó sẽ khiến luồng cơ sở và bảng tham chiếu chéo vẫn còn trong bộ nhớ.
Lưu(ms) sau khi ms.Position không được đặt lại
Khi đọc lại từ MemoryStream sau doc.Save(ms), hãy đặt lại ms.Position = 0 trước khi đọc. Bỏ qua bước này sẽ khiến trình đọc gặp phải PDF rỗng hoặc chỉ một phần.
Merge produces a document with unexpected page count
Đảm bảo tất cả các tài liệu nguồn được tải đầy đủ trước khi truyền chúng cho Document.Merge. Việc giải phóng một tài liệu nguồn trước khi gọi merge có thể dẫn đến cây trang không đầy đủ.
Câu hỏi thường gặp
Tôi có thể mở PDF được bảo vệ bằng mật khẩu không?
Có. Sử dụng Document.Open(data, password) hoặc Document.Open(path, password) để cung cấp mật khẩu chủ sở hữu hoặc người dùng làm đối số thứ hai.
Document.ToArray() có khác với việc lưu vào MemoryStream không?
Document.ToArray() là một phương thức tiện lợi mà bên trong lưu vào một MemoryStream và trả về mảng byte kết quả. Cả hai đường dẫn đều tạo ra đầu ra PDF giống nhau.
Kiểu dữ liệu của thuộc tính Pages là gì?
Document.Pages là loại PageCollection. Nó được đánh chỉ số bắt đầu từ 1; doc.Pages[1] là trang đầu tiên.
Tôi có thể lưu tài liệu nhiều lần không?
Có. Bạn có thể gọi doc.Save() hoặc doc.ToArray() nhiều lần trên cùng một thể hiện tài liệu. Mỗi lần gọi sẽ tuần tự hoá trạng thái hiện tại của tài liệu.
Làm thế nào để tôi kiểm tra xem tài liệu có được cấp phép hay không?
Document.IsLicensed trả về một bool cho biết trạng thái cấp phép nội bộ. Đối với Aspose.PDF FOSS, điều này chỉ mang tính thông tin — không cần kích hoạt.