使用 ItextSharp C# 标记 PDF 的各个页面
Tagging individual pages of a PDF with ItextSharp C#
我目前正在使用 ITEXTSHARP 5.5.6.0
我的目标是为每个页面添加一个键,并在我使用另一个应用程序再次阅读文档时让这些键保持不变。我希望能够单独跟踪每个页面(密钥是唯一的,并且来自另一个来源)。
这是我的 import/write 代码:
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);
一旦你有了这个字典,你就可以在其中插入你自己的私钥:
public void put(PdfName key, PdfObject object);
你分配的值由你决定,但如果你想遵守规则,你必须使用一个第二个class PDF 名称 作为键。这是一个由您的开发人员前缀组成的密钥 - 应该注册它以便它是唯一的和私有的部分。例如,密钥可能如下所示:
FICL:PageNumber
在这种情况下,"FICL" 是您的开发人员前缀,"PageNumber" 是您对要添加的数据的标识。
要注册开发人员前缀,请参阅 Adobe 网站,例如此处:http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdfregistry_v3.pdf
希望这对您有所帮助。
PS:如果这里有人知道 "FICL" 前缀的真正所有者以及这些字母的来源,我请你喝啤酒 :)
大卫的回答是正确的,这是应该被接受的答案。但是,为了完整起见,我添加了一个额外的答案。
OP 的问题是关于向 PDF 中 现有 页面的页面字典添加一个额外的键。如果要为使用 iText 从头开始构建的 PDF 添加密钥,可以使用 PdfWriter
中的 addPageDictEntry()
方法。这将向 PdfWriter
实例创建的下一个页面对象的页面字典中添加一个条目。
这可以通过使用页面事件实现自动化,例如,如果您想通过向使用 iText 创建的每个页面的页面字典添加自定义条目来为每个页面提供唯一 ID。
(这没有回答 OP 的问题,因为他没有使用 PdfWriter
,但这个答案可能对其他在从头开始创建 PDF 时遇到相同问题的人有用。)
我目前正在使用 ITEXTSHARP 5.5.6.0
我的目标是为每个页面添加一个键,并在我使用另一个应用程序再次阅读文档时让这些键保持不变。我希望能够单独跟踪每个页面(密钥是唯一的,并且来自另一个来源)。
这是我的 import/write 代码:
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);
一旦你有了这个字典,你就可以在其中插入你自己的私钥:
public void put(PdfName key, PdfObject object);
你分配的值由你决定,但如果你想遵守规则,你必须使用一个第二个class PDF 名称 作为键。这是一个由您的开发人员前缀组成的密钥 - 应该注册它以便它是唯一的和私有的部分。例如,密钥可能如下所示:
FICL:PageNumber
在这种情况下,"FICL" 是您的开发人员前缀,"PageNumber" 是您对要添加的数据的标识。
要注册开发人员前缀,请参阅 Adobe 网站,例如此处:http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdfregistry_v3.pdf
希望这对您有所帮助。
PS:如果这里有人知道 "FICL" 前缀的真正所有者以及这些字母的来源,我请你喝啤酒 :)
大卫的回答是正确的,这是应该被接受的答案。但是,为了完整起见,我添加了一个额外的答案。
OP 的问题是关于向 PDF 中 现有 页面的页面字典添加一个额外的键。如果要为使用 iText 从头开始构建的 PDF 添加密钥,可以使用 PdfWriter
中的 addPageDictEntry()
方法。这将向 PdfWriter
实例创建的下一个页面对象的页面字典中添加一个条目。
这可以通过使用页面事件实现自动化,例如,如果您想通过向使用 iText 创建的每个页面的页面字典添加自定义条目来为每个页面提供唯一 ID。
(这没有回答 OP 的问题,因为他没有使用 PdfWriter
,但这个答案可能对其他在从头开始创建 PDF 时遇到相同问题的人有用。)