iTextSharp AcroForm - 多字段不复制

时间:2015-04-14 22:12:51

标签: c# itextsharp

我有一个带有按钮的pdf,可以带你到网页链接。我使用iTextSharp将这些分成每个外部要求的单独PDF(每页1个)。问题:任何有多个位置的按钮都会丢失动作。

问题:有谁知道如何更新这些操作?我可以打开新文件,但我不知道如何使用PdfStamper在此Annotation中添加AA

因此,在打开原始文件时,您可以通过以下方式进入“附加操作”:

var r = new PdfReader(f.FullName);
var positionsOfThisButton = r.AcroFields.GetFieldPositions("14");
var field = r.AcroForm.GetField("14")
var targetObject = PdfReader.GetPdfObject(field.Ref);
var kids = targetObject.GetAsArray(PdfName.KIDS);
foreach (var k in kids){
    var ko = (PdfDictionary)(k.IsIndirect() ? PdfReader.GetPdfObject(k) : k);
    var aaObj = ko.Get(PdfName.AA);
    //(aaObj is NULL in the new file)

    var aa = (PdfDictionary)(aaObj.IsIndirect() ? PdfReader.GetPdfObject(aaObj) : aaObj);
    var dObj = aa.Get(PdfName.D);
    var d = (PdfDictionary)(dObj.IsIndirect() ? PdfReader.GetPdfObject(dObj) : dObj);

    Debug.WriteLine("S:" + d.GetAsName(PdfName.S).ToString() );
    //returns S:/Uri

    Debug.WriteLine("URI:" + d.GetAsString(PdfName.URI).ToString() );
    //returns URI:http://www.somesite.com/etc
}

感谢您的帮助。

仅供参考 - 以下是我拆分文件的方法:

List<byte[]> Get(FileInfo f) {
    List<byte[]> outputFiles = new List<byte[]>();
    var reader = new PdfReader(f.FullName);
    int n = reader.NumberOfPages;
    reader.Close();

    for (int i = n; i > 0; i--) {
        reader = new PdfReader(f.FullName);

        using (var document = new Document(reader.GetPageSizeWithRotation(1))) {
            using (var outputStream = new MemoryStream()) {
                using (var writer = new PdfCopy(document, outputStream)) {
                    writer.SetMergeFields();
                    writer.PdfVersion = '6';

                    document.Open();
                    writer.AddDocument(reader, new List<int> { i });
                    document.Close();
                    writer.Close();
                }

                outputFiles.Insert(0, outputStream.ToArray());
            }
        }
        reader.Close();
    }

    return outputFiles;
}

0 个答案:

没有答案