我无法想象这样做的正当理由,但显然你有一个。
iText 中的一致性设置旨在与 a 一起使用,PdfWriter
并且该对象(通常)仅旨在与新文档一起使用。由于 iText 从来没有打算将文档转换为一致性,这正是它的构建方式。
要执行您想做的事情,您可以打开原始文档并更新文档字典中的相应标签,或者您可以创建一个具有相应条目集的新文档,然后导入您的旧文档。下面的代码显示了后一种路线,它首先创建一个常规的不合格 PDF,然后创建第二个文档,说明它是否符合,即使它可能符合也可能不符合。有关详细信息,请参阅代码注释。这针对 iTextSharp 5.4.2.0。
//Folder that we're working from
var workingFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
//Create a regular non-conformant PDF, nothing special below
var RegularPdf = Path.Combine(workingFolder, "File1.pdf");
using (var fs = new FileStream(RegularPdf, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (var doc = new Document()) {
using (var writer = PdfWriter.GetInstance(doc, fs)) {
doc.Open();
doc.Add(new Paragraph("Hello world!"));
doc.Close();
}
}
}
//Create our conformant document from the above file
var ConformantPdf = Path.Combine(workingFolder, "File2.pdf");
using (var fs = new FileStream(ConformantPdf, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (var doc = new Document()) {
//Use PdfSmartCopy to get every page
using (var copy = new PdfSmartCopy(doc, fs)) {
//Set our conformance levels
copy.SetPdfVersion(PdfWriter.PDF_VERSION_1_3);
copy.PDFXConformance = PdfWriter.PDFX1A2001;
//Open our new document for writing
doc.Open();
//Bring in every page from the old PDF
using (var r = new PdfReader(RegularPdf)) {
for (var i = 1; i <= r.NumberOfPages; i++) {
copy.AddPage(copy.GetImportedPage(r, i));
}
}
//Close up
doc.Close();
}
}
}
只是为了 100% 清楚,这不会产生符合标准的 PDF,只是一个说明它符合的文件。