使用ItextSharp C#标记PDF的各个页面

时间:2015-05-14 18:39:22

标签: c# .net pdf itextsharp tagging

我目前正在使用ITEXTSHARP 5.5.6.0

我的目标是为每个页面添加一个密钥,并在我再次使用其他应用程序读取文档时保持这些密钥。我希望能够单独跟踪每个页面(密钥是唯一的,来自其他来源)。

这是我的导入/写入代码:

 using (PdfReader reader = new PdfReader(sourcePdfPath))
 {

        using (Document document = new Document(reader.GetPageSizeWithRotation(pageNumber)))
        {

            PdfCopy pdfCopyProvider = new PdfCopy(document, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create));
            pdfCopyProvider.SetTagged();
            pdfCopyProvider.PdfVersion = PdfWriter.VERSION_1_7;

            PdfImportedPage importedPage = pdfCopyProvider.GetImportedPage(reader, pageNumber, true);
            importedPage.SetAccessibleAttribute(PdfName.ALT, new PdfString("MYKEY"));
            pdfCopyProvider.AddPage(importedPage);               
        }
 }

这是我的阅读代码:

using (MemoryStream ms = new MemoryStream())
        {
            Document document = new Document();
            PdfCopy copy = new PdfCopy(document, ms);
            copy.SetTagged();
            document.Open();
            for (int i = 0; i < pdfs.Count; ++i)
            {
                var pdf = File.ReadAllBytes(pdfs[i]);
                PdfReader reader = new PdfReader(pdf);
                int n = reader.NumberOfPages;
                for (int page = 0; page < n; )
                {
                    var importPage = copy.GetImportedPage(reader, ++page, true);
                    var MyKey = importPage.GetAccessibleAttribute(PdfName.ALT);
                    if (MyKey != null)
                        //Do Something with KEY
                    copy.AddPage(importPage);
                }
            }
            document.Close();
            copy.Close();


            return ms.ToArray();
        }

我正在尝试添加辅助功能ALT文本。目前,我在图像上使用该属性,并且所有应用程序都设置为保持这些属性不受影响。

问题在于,当我以这种方式添加属性时,将其保存为PDF文件,然后在另一个进程上读取该属性,该属性不再存在。

我对其他选项持开放态度,以解决每页都有主键的问题,我可以分配,阅读和删除

尝试以避免在每个页面上添加隐藏字段。

2 个答案:

答案 0 :(得分:4)

我没有使用iText编程或使用c#的经验,所以我很乐意回答你的问题:)

首先,如果您要做的只是标记页面然后再找到它,请不要使用 PDF中的辅助功能。辅助设备是可访问性的,滥用这些功能并不好。

特别是因为 - 如果我理解你想做什么 - 没有必要这样做。如果要标记页面,则应查找页面字典,例如:

PdfReader reader = new iTextSharp.text.pdf.PdfReader(file_content);
PdfDictionary pageDict = reader.GetPageN(i);

复制自:http://goobbe.com/questions/8099416/how-to-get-the-userunit-property-from-a-pdffile-using-itextsharp-pdfreader

一旦你有了这个词,就可以在那里插入你自己的私钥:

public void put(PdfName key, PdfObject object);

您指定的值取决于您,但如果您想遵守规则,则必须使用第二类PDF名称作为关键字。这是一个由您的开发人员前缀组成的密钥 - 应该进行注册,以便它是唯一的和私有部分。例如,密钥可能如下所示:

FICL:PageNumber

在这种情况下,“FICL”是您的开发人员前缀,“PageNumber”是您要添加的数据的标识。

要注册开发人员前缀,请参阅Adobe网站,例如:http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdfregistry_v3.pdf

希望这有帮助。

PS:如果有人在这里知道谁拥有“FICL”前缀以及这些字母来自哪里,我会给你买啤酒:)

答案 1 :(得分:2)

大卫的回答是正确的,这是应该接受的答案。但是,为了完整起见,我正在添加一个额外的答案。

OP的问题是如何在PDF中的现有页面的页面字典中添加额外的键。如果要将键添加到使用iText从头开始构建的PDF,可以使用PdfWriter中的addPageDictEntry()方法。这将为PdfWriter实例创建的下一页对象的页面字典添加一个条目。

可以通过使用页面事件自动化,例如,如果您想通过向使用iText创建的每个页面的页面字典添加自定义条目,为每个页面提供唯一ID。

(这不符合OP的问题,因为他没有使用PdfWriter,但这个答案可能对于从头开始创建PDF的上下文中具有相同问题的其他人有用。)