PdfLayer.GetTitle()始终返回null

时间:2019-01-18 17:32:59

标签: c# itext7

C#itext 7.1.4(NuGet版本)似乎无法正确解析OCG /图层标题。

下面的C#代码应阅读pdf,打印所有图层标题,关闭图层可见性并将其保存到dest文件中。

示例pdf文件:https://docdro.id/qI479di

using iText.Kernel.Pdf;
using System;

namespace PDFSetOCGVisibility
{
    class Program
    {
        static void Main(string[] args)
        {
            var src = @"layer-example.pdf";
            var dest = @"layer-example-out.pdf"; ;
            PdfDocument pdf = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
            var Catalog = pdf.GetCatalog();
            var ocProps = Catalog.GetOCProperties(false);
            var layers = ocProps.GetLayers();
            foreach(var layer in layers)
            {
                var title = layer.GetTitle();
                Console.WriteLine($"title: {title ?? "null"}");
                layer.SetOn(false);
            }
            pdf.Close();
        }
    }
}

预期输出为:

title: Layer 1
title: Layer 2

实际输出为:

title: null
title: null

写入具有禁用图层的文件效果很好,但是图层标题始终为空。

2 个答案:

答案 0 :(得分:0)

只需测试itext5版本:

using iTextSharp.text.pdf;
using System;
using System.IO;

namespace PDFSetOCGVisibility5
{
    class Program
    {
        static void Main(string[] args)
        {
            var src = @"layer-example.pdf";
            var dest = @"layer-example-out.pdf";
            var reader = new PdfReader(src);
            PdfStamper pdf = new PdfStamper(reader, new FileStream(dest, FileMode.Create));
            var layers = pdf.GetPdfLayers();
            foreach (var layer in layers)
            {
                var title = layer.Key;
                Console.WriteLine($"title: {title ?? "null"}");
                layer.Value.On = false;
            }
            pdf.Close();
            reader.Close();
        }
    }
}

它正在按预期方式工作,因此这似乎是itext7中的回归

答案 1 :(得分:0)

我不知道title / GetTitle()的目的是什么,但是要获取Name(如面板上显示的),可以使用以下代码:

var title = layer.GetPdfObject().GetAsString(PdfName.Name).ToUnicodeString();