从文件添加现有的PDF使用iTextSharp的一个不成文的文件(Add an existing P

2019-07-30 15:02发布

如何正确地从现有的磁盘上的PDF文件添加的页面(S),以当前的福利产生的内存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();

这将导致一个NullReferenceException在copier.AddPage(newpage)

我也试过:

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

这也导致在一个NullReferenceException copier.AddDocument(reader)

我已经得到了大多数的这些想法来自不同StackOverflow的问题和答案。 有一两件事,似乎没有人来处理,从现有的PDF文件添加新的页面(S), 到尚未写入到磁盘上的PDF文件已经存在于内存中的文档 。 该文件已经被打开,不得不写入其数据页。 如果我离开这个条款的程序进行,或只写它的图像(如原),生成的PDF出来就好了。

要完成我开始:如何正确地从现有的磁盘上的PDF文件添加的页面(S),以当前的福利产生的内存PDF文档?

提前为您对此的沉思感谢和赞赏。 请让我知道如果我能提供进一步的信息。

Answer 1:

这里有一个简单的合并方法是复制的PDF文件成一个PDF。 合并PDF时,我用这个方法经常。 我已经使用这个合并不同尺寸的页面也没有问题。 希望能帮助到你。

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;
}


文章来源: Add an existing PDF from file to an unwritten document using iTextSharp