使用 itext7 .NET 设置标记层(自由文本)PDF
Set layer for markup (FreeText) PDF using itext7 .NET
如何使用 itext7 .NET 为现有标记 (FreeText) PDF 设置图层?我使用下面的代码,但它不起作用。请帮忙。谢谢
public void SetLayerMarkup()
{
string inPDF = @"C:\in PDF.pdf";
string outPDF = @"C:\out PDF.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfReader(inPDF), new PdfWriter(outPDF));
PdfLayer notPrint = new PdfLayer("Non Print", pdfDoc);
int numberOfPages = pdfDoc.GetNumberOfPages();
for (int i = 1; i <= numberOfPages; i++)
{
PdfDictionary page = pdfDoc.GetPage(i).GetPdfObject();
PdfArray annotArray = page.GetAsArray(PdfName.Annots);
if (annotArray == null)
{
continue;
}
int size = annotArray.Size();
for (int x = 0; x < size; x++)
{
PdfDictionary curAnnot = annotArray.GetAsDictionary(x);
if (curAnnot.GetAsString(PdfName.Contents) != null)
{
string contents = curAnnot.GetAsString(PdfName.Contents).ToString();
if (contents != "" && contents.Contains("old content")) //set layer for a FreeText with this content
{
PdfDictionary layer = new PdfDictionary();
layer.Put(PdfName.Type, PdfName.OCG);
layer.Put(PdfName.Name, new PdfString("Non Print"));
curAnnot.Put(PdfName.OC, layer);
}
}
}
}
pdfDoc.Close();
}
或者如何修复上面的代码以匹配此图像(在 iText RUPS 5.5.9 中)?:
附加源 PDF 文件:here
因此您的原始文档没有任何图层:
首先,我们需要用助手 API:
创建一个
PdfLayer layer = new PdfLayer("Non Print", pdfDocument);
代码现在可以更简单一些(我的示例在 Java 但转换到 C# 应该非常简单):
PdfDocument pdfDocument = new PdfDocument(new PdfReader("in PDF.pdf"),
new PdfWriter("out PDF.pdf"));
PdfLayer layer = new PdfLayer("Non Print", pdfDocument);
int numberOfPages = pdfDocument.getNumberOfPages();
for (int i = 1; i <= numberOfPages; i++) {
PdfDictionary page = pdfDocument.getPage(i).getPdfObject();
PdfArray annotArray = page.getAsArray(PdfName.Annots);
if (annotArray == null) {
continue;
}
int size = annotArray.size();
for (int x = 0; x < size; x++) {
PdfDictionary curAnnot = annotArray.getAsDictionary(x);
if (curAnnot.getAsString(PdfName.Contents) != null) {
String contents = curAnnot.getAsString(PdfName.Contents).toString();
if (!contents.isEmpty() && contents.contains("old content")) //set layer for a FreeText with this content
{
curAnnot.put(PdfName.OC, layer.getPdfObject());
}
}
}
}
pdfDocument.close();
因此,您得到一个包含图层的文档:
如果单击图层名称旁边的眼睛图标,图层的内容将隐藏:
根据您的代码,我修改了如下代码,效果很好,谢谢。
PdfDictionary layer = new PdfDictionary();
layer.Put(PdfName.Type, PdfName.OCG);
layer.Put(PdfName.Name, new PdfString("Non Print"));
curAnnot.Put(PdfName.OC, layer);
至:
curAnnot.Put(PdfName.OC, notPrint.GetPdfObject());
如何使用 itext7 .NET 为现有标记 (FreeText) PDF 设置图层?我使用下面的代码,但它不起作用。请帮忙。谢谢
public void SetLayerMarkup()
{
string inPDF = @"C:\in PDF.pdf";
string outPDF = @"C:\out PDF.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfReader(inPDF), new PdfWriter(outPDF));
PdfLayer notPrint = new PdfLayer("Non Print", pdfDoc);
int numberOfPages = pdfDoc.GetNumberOfPages();
for (int i = 1; i <= numberOfPages; i++)
{
PdfDictionary page = pdfDoc.GetPage(i).GetPdfObject();
PdfArray annotArray = page.GetAsArray(PdfName.Annots);
if (annotArray == null)
{
continue;
}
int size = annotArray.Size();
for (int x = 0; x < size; x++)
{
PdfDictionary curAnnot = annotArray.GetAsDictionary(x);
if (curAnnot.GetAsString(PdfName.Contents) != null)
{
string contents = curAnnot.GetAsString(PdfName.Contents).ToString();
if (contents != "" && contents.Contains("old content")) //set layer for a FreeText with this content
{
PdfDictionary layer = new PdfDictionary();
layer.Put(PdfName.Type, PdfName.OCG);
layer.Put(PdfName.Name, new PdfString("Non Print"));
curAnnot.Put(PdfName.OC, layer);
}
}
}
}
pdfDoc.Close();
}
或者如何修复上面的代码以匹配此图像(在 iText RUPS 5.5.9 中)?:
附加源 PDF 文件:here
因此您的原始文档没有任何图层:
首先,我们需要用助手 API:
创建一个PdfLayer layer = new PdfLayer("Non Print", pdfDocument);
代码现在可以更简单一些(我的示例在 Java 但转换到 C# 应该非常简单):
PdfDocument pdfDocument = new PdfDocument(new PdfReader("in PDF.pdf"),
new PdfWriter("out PDF.pdf"));
PdfLayer layer = new PdfLayer("Non Print", pdfDocument);
int numberOfPages = pdfDocument.getNumberOfPages();
for (int i = 1; i <= numberOfPages; i++) {
PdfDictionary page = pdfDocument.getPage(i).getPdfObject();
PdfArray annotArray = page.getAsArray(PdfName.Annots);
if (annotArray == null) {
continue;
}
int size = annotArray.size();
for (int x = 0; x < size; x++) {
PdfDictionary curAnnot = annotArray.getAsDictionary(x);
if (curAnnot.getAsString(PdfName.Contents) != null) {
String contents = curAnnot.getAsString(PdfName.Contents).toString();
if (!contents.isEmpty() && contents.contains("old content")) //set layer for a FreeText with this content
{
curAnnot.put(PdfName.OC, layer.getPdfObject());
}
}
}
}
pdfDocument.close();
因此,您得到一个包含图层的文档:
如果单击图层名称旁边的眼睛图标,图层的内容将隐藏:
根据您的代码,我修改了如下代码,效果很好,谢谢。
PdfDictionary layer = new PdfDictionary();
layer.Put(PdfName.Type, PdfName.OCG);
layer.Put(PdfName.Name, new PdfString("Non Print"));
curAnnot.Put(PdfName.OC, layer);
至:
curAnnot.Put(PdfName.OC, notPrint.GetPdfObject());