iTextSharp将文档与表单合并

时间:2013-12-31 21:32:04

标签: c# itextsharp

所以我有一个相当基本的iTextSharp实现来创建PDF。作为其中的一部分,任何"附加文件"需要读取并合并到生成的文档中。这工作正常,除了我刚碰到一个附加的文件,打破了一切。 PDF仍然可以生成,但是出来的文档只显示第一页,而Adobe Reader每次尝试查看第2-7页时都会发出错误(如果对任何人都有意义,则为18)。

第8页是另一个在问题文档之前合并的文档,显示正常。然后导致问题的合并文档接下来(25页),IT显示正常。

但合并该文档的内容会破坏之前的页面。这真的很奇怪,因为我希望它能够打破在它之前合并的文件,以及第1页等等......

我在文档中看到的唯一不同的是,合并的问题文档的第2页上有一个填写的表单。我试图让一个知道PDF文件的人比我更好,让我得到一个没有那种形式的人,以确保这个问题,但它现在似乎是我最好的候选人...

我尝试了以下内容(添加"删除任何表单"部分),但我仍有问题。有什么想法吗?

var reader = new PdfReader(filePath);

// Remove any forms
if (reader.AcroForm != null)
{
    var memStream = new MemoryStream();
    var stamper = new PdfStamper(reader, memStream) { FormFlattening = true };
    stamper.Close();
    reader = new PdfReader(memStream.ToArray());
}

var numberOfPages = reader.NumberOfPages;

var cb = writer.DirectContent;

var i = 0;
while (i < numberOfPages)
{
    i++;
    document.SetPageSize(reader.GetPageSizeWithRotation(i));
    document.NewPage();

    var page = writer.GetImportedPage(reader, i);
    var rotation = reader.GetPageRotation(i);

    if (rotation == 90 || rotation == 270)
    {
        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
    }
    else
    {
        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
    }
}

reader.Close();

1 个答案:

答案 0 :(得分:1)

请阅读chapter 6 of my book,您会注意到使用PdfWriter连接(或合并)PDF文档是错误的。使用PdfCopy完成连接PDF。

如果要合并的文档包含AcroForm表单,则本书建议使用PdfCopyFields。在更新版本的iTextSharp中,不推荐PdfCopyFields使用此处所述的方法:copy pdf form with PdfCopy not working in itextsharp 5.4.5.0

没有例子,没有人能够给你更好的答案。您需要共享一些导致问题的PDF。