使用ITextSharp从PDF文件中提取页面

时间:2015-06-08 08:15:16

标签: c# pdf pdf-generation itextsharp itext

是否可以使用IText从完整的PDF文档复制PDF页面并根据表单字段名称返回部分文档?例如,我需要复制pdf文档的开头并在某个名为[STOP_HERE]的文本字段处停止,因此在需要提取此字段之前的任何内容时,[STOP_HERE]字段可以位于每个文档的不同页面上,所以使用页码在这里不会有帮助。

我在线搜索,我只能找到一种方法来复制文档中的表单字段,而不是整个文档元素,包括具有确切位置和样式的图像文本。

IText可以在这里完成这项工作吗?

编辑:更多详情

[STOP_HERE]是一个AcroForms文本字段,由PDF设计人员放置在文档中,表示此元素之前的所有内容都应该原样复制到另一个文档中。该字段本身并不重要,我不想填写或做任何事情,它只是用作信号让文档解析器停在那里并复制所有以前(上)内容,我只是在此字段之前,我不知道如何阅读所有内容(不更改样式,内容等)。

1 个答案:

答案 0 :(得分:1)

  

是否可以使用IText从完整的PDF文档复制PDF页面并根据表单字段名称返回部分文档?例如,我需要复制pdf文档的开头并停在名为[STOP_HERE]的某个文本字段

不幸的是,OP没有告诉是否包含表单字段[STOP_HERE]的页面。因为这仅仅是+/- 1的问题,我只是假设要包含该页面。

因此,任务可以这样实现:

PdfReader reader = new PdfReader(srcFile);

AcroFields.Item field = reader.AcroFields.Fields["[STOP_HERE]"];
if (field != null)
{
    int firstPage = reader.NumberOfPages + 1;
    for (int index = 0; index < field.Size; index++)
    {
        int page = field.GetPage(index);
        if (page > 0 && page < firstPage)
            firstPage = page;
    }

    if (firstPage <= reader.NumberOfPages)
    {
        reader.SelectPages("1-" + firstPage);
        PdfStamper stamper = new PdfStamper(reader, new FileStream(dstFile, FileMode.Create, FileAccess.Write));
        stamper.Close();
    }
}

reader.Close();

代码在PdfReader中打开源文件,首先查找该字段。如果它存在,则迭代该字段的所有外观并确定具有该字段外观的最早页面。如果有这样的页面,则代码会将阅读器限制在该页面之前的页面,并使用PdfStamper存储此限制。