现有PDF到PDF / A“转换”

时间:2013-10-02 08:59:53

标签: pdf itextsharp

我正在尝试将现有的pdf制作成pdf / a-1b。据我所知,itext无法将pdf转换为pdf / a,因为它符合pdf / a标准。但它绝对可以将文档标记为pdf / a。但是,我查看了各种示例,我似乎无法弄清楚如何做到这一点。主要问题是

writer.PDFXConformance = PdfWriter.PDFA1B;

不再起作用了。第一个PDFA1B无法识别,其次,pdfwriter似乎已被重写,并且没有太多关于此的信息。 似乎唯一的(在itext java版本中)方式是:

PdfAWriter writer = PdfAWriter.getInstance(document, new FileOutputStream(filename), PdfAConformanceLevel.PDF_A_1B);

但这需要文档类型,即。它可以在从头开始创建pdf时使用。

有人可以举例说明pdf到pdf /使用当前版本的itextsharp进行转换吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

我无法想象这样做的正当理由,但显然你有一个。

iText中的一致性设置旨在与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 ,只是一个说它符合的文件。