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

标签 c# .net pdf itext tagging

我目前正在使用 ITEXTSHARP 5.5.6.0

我的目标是为每个页面添加一个键,并在我使用另一个应用程序再次阅读文档时让这些键保持不变。我希望能够单独跟踪每个页面( key 是唯一的,并且来自另一个来源)。

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

 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 文件,然后在另一个进程上读取时,该属性不再存在。

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

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

最佳答案

我对 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 名称 作为键。这是一个由您的开发人员前缀组成的 key - 应该注册它以便它是唯一的和私有(private)的部分。例如, key 可能如下所示:

FICL:PageNumber

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

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

希望这对您有所帮助。

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

关于c# - 使用 ItextSharp C# 标记 PDF 的各个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30244851/

相关文章:

c# - 如何在数据网格中将文本显示为粗体?

c# - 如何监控外部网络服务?

c# - 在 C#.NET 中执行 bool 逻辑运算的最有效方法是什么?

c# - System.Drawing.Color 结构体如何初始化颜色?

ruby-on-rails - 在 Rails 中强制内联呈现 PDF 文档

python - 如何使 pdf2image 与路径包含中文字符的 PDF 一起工作?

c# - 使用 silverlight 在 xaml 中分配枚举属性

c# - 验证列表已排序且项目具有特殊字符时获取 NUnit AssertionException

javascript - Powershell西里尔文通过node js输入编码

pdftk 和 qpdf 重置 PDF 注释安全性