使用iTextSharp将现有PDF从文件添加到未写入的文档

时间:2012-07-25 04:41:16

标签: c# pdf itextsharp itext

如何将现有磁盘上PDF文件中的页面正确添加到当前生成的内存中PDF文档中?

我们有一个使用iTextSharp生成PDF文档的类。这很好用。目前我们添加条款&条件作为最后一页的图像:

this.nettPriceListDocument.NewPage();
this.currentPage++;
Image logo = Image.GetInstance("/inetpub/Applications/Trade/Reps/images/TermsAndConditions.gif");
logo.SetAbsolutePosition(0, 0);
logo.ScaleToFit(this.nettPriceListDocument.PageSize.Width, this.nettPriceListDocument.PageSize.Height);
this.nettPriceListDocument.Add(logo);

我将此图像作为PDF文档,并且希望附加它。如果我能弄清楚这一点,就可以将我们可能需要的其他PDF文档追加到我正在生成的内容中。

我试过了:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf";
PdfReader reader = new PdfReader(tcfile);
PdfWriter writer = PdfWriter.GetInstance(this.nettPriceListDocument, this.nettPriceListMemoryStream);
PdfContentByte content = writer.DirectContentUnder;
for (int pageno = 1; pageno < reader.NumberOfPages + 1; pageno++)
{
    this.nettPriceListDocument.NewPage();
    this.currentPage++;
    PdfImportedPage newpage = writer.GetImportedPage(reader, pageno);
    content.AddTemplate(newpage, 1f, 1f);
}

导致writer.DirectContentUnder

处的“未打开文档”例外

我也试过了:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf";
PdfReader reader = new PdfReader(tcfile);
PdfConcatenate concat = new PdfConcatenate(this.nettPriceListMemoryStream);
concat.AddPages(reader);

这导致在文档的通常第一页上插入一个空白的,奇怪大小的页面。

我也试过了:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf";
PdfReader reader = new PdfReader(tcfile);
PdfCopy copier = new PdfCopy(nettPriceListDocument, nettPriceListMemoryStream);
for (int pageno = 1; pageno < reader.NumberOfPages + 1; pageno++)
{
    this.currentPage++;
    PdfImportedPage newpage = copier.GetImportedPage(reader, pageno);
    copier.AddPage(newpage);
}
copier.Close();
reader.Close();

导致copier.AddPage(newpage)处的NullReferenceException。

我也试过了:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf";
PdfReader reader = new PdfReader(tcfile);
PdfCopyFields copier = new PdfCopyFields(nettPriceListMemoryStream);
copier.AddDocument(reader);

这也导致copier.AddDocument(reader)处的NullReferenceException。

我从各种StackOverflow问题和答案中获得了大部分这些想法。没有人似乎要处理的一件事是将现有PDF文件中的新页面添加到尚未写入磁盘上的PDF文件的已存在的内存中文档。该文档已经打开并且已经写入了数据页面。如果我留下这个条款&amp;条件程序出来,或者只是写出一个图像(就像最初的那样),得到的PDF出来就好了。

要在我开始时完成:如何正确地将现有的磁盘PDF文件中的页面添加到当前生成的内存中PDF文档中?

感谢并提前感谢您对此的思考。如果我能提供进一步的信息,请告诉我。

1 个答案:

答案 0 :(得分:7)

这是一个简单的合并方法,可将PDF文件复制到一个PDF中。合并pdfs时我经常使用这种方法。我已经使用它来合并不同大小的页面,没有问题。希望它有所帮助。

public MemoryStream MergePdfForms(List<byte[]> files)
{
    if (files.Count > 1)
    {
        PdfReader pdfFile;
        Document doc;
        PdfWriter pCopy;
        MemoryStream msOutput = new MemoryStream();

        pdfFile = new PdfReader(files[0]);

        doc = new Document();
        pCopy = new PdfSmartCopy(doc, msOutput);

        doc.Open();

        for (int k = 0; k < files.Count; k++)
        {
            pdfFile = new PdfReader(files[k]);
            for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
            {
                ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
            }
            pCopy.FreeReader(pdfFile);
        }

        pdfFile.Close();
        pCopy.Close();
        doc.Close();

        return msOutput;
    }
    else if (files.Count == 1)
    {
        return new MemoryStream(files[0]);
    }

    return null;
}