iTextSharp - 移动 Acrofield

2023-12-19

我有一个将内容表插入现有 Acroform 的流程,并且我能够跟踪需要从何处开始该内容。但是,我现有的 Acrofields 低于该点,需要根据我插入的表格的高度向上或向下移动。那么,我怎样才能改变 Acrofield 的位置呢?下面是我可以用来“获取”位置的代码......但现在我还需要能够“设置”它。

....

            // Initialize Stamper ("output" is a MemoryStream object)
            PdfStamper stamper = new PdfStamper(pdf_rdr, output);

            // Get Reference to PDF Document Fields
            AcroFields fields = stamper.AcroFields;

            //call method to get the field's current position
            AcroFields.FieldPosition pos = GetFieldPosition(fields, "txt_footer");

// ** 需要在此处明确设置该字段的新位置

            //assuming a call to "RegenerateField" will be required
            fields.RegenerateField(txt_footer);

....

    //helper method for capturing the position of a field
    private static AcroFields.FieldPosition GetFieldPosition(AcroFields fields, string field_nm)
    {

        ////////////////////////////////////////////////////////////////////////////////////
        //get the left margin of the page, and the "top" location for starting positions
        //using the "regarding_line" field as a basis
        IList<AcroFields.FieldPosition> fieldPositions = fields.GetFieldPositions(field_nm);

        AcroFields.FieldPosition pos = fieldPositions[0];

        return pos;

    }

首先是有关字段及其在一页或多页上的表示的一些信息。 PDF 表单可以包含多个字段。字段具有唯一的名称,即具有一个特定名称的特定字段具有一个和一个值。字段是使用定义的字段字典.

每个字段在文档中可以有零个、一个或多个表示。这些视觉表示被称为小部件注释它们是使用注释词典.

知道这一点,你的问题需要重新表述:如何更改特定字段的特定小部件注释的位置?

我用 Java 制作了一个名为改变字段位置 http://itextpdf.com/sandbox/acroforms/ChangeFieldPosition回答这个问题。将其移植到 C# 取决于您(也许您可以在此处发布 C# 答案以供进一步参考)。

您已经拥有了AcroFields实例:

 AcroFields form = stamper.getAcroFields();

你现在需要的是Item特定字段的实例(在我的示例中:对于名称为"timezone2"):

    Item item = form.getFieldItem("timezone2");

该位置是小部件注释的属性,因此您需要询问item为其小部件。在下面的行中,我获取第一个小部件注释的注释字典(索引为0):

    PdfDictionary widget = item.getWidget(0);

在大多数情况下,只有一个小部件注释:每个字段只有一种视觉表示。

注释的位置是一个数组,有四个值:llx、lly、urx 和 ury。我们可以这样得到这个数组:

    PdfArray rect = widget.getAsArray(PdfName.RECT);

在下面的行中,我更改了右上角的 x 值(索引2与 urx 对应):

    rect.set(2, new PdfNumber(rect.getAsNumber(2).floatValue() - 10f));

结果,字段的宽度缩短了 10pt。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iTextSharp - 移动 Acrofield 的相关文章

随机推荐

  • 我怎样才能传递 UIColor 的名字

    我想知道如何将 UIColor 的名称传递给特定方法 EDIT id setLabel NSString text WithColorName NSString nameOfColor FontName NSString f name Fo
  • 检查 JComboBox 中是否已存在某个项目?

    除了迭代 JComboBox 之外 是否有一种简单的方法来检查 JComboBox 中是否已存在某个项目 这就是我想做的 Item item boolean exists false for int index 0 index lt myC
  • React Native Firebase DataSnapshot

    我正在尝试使用以下代码将 firebase 实现到我的 React Native 应用程序中 import as firebase from firebase var fireBaseconfig apiKey MY KEY authDom
  • Spring JPA:使用@Transactional和@PersistenceContext的应用程序管理持久性上下文

    目前 我正在尝试应用程序管理的持久性上下文 方法是手动创建实体管理器并存储它们 以在 JSE 应用程序中启用跨多个请求调用 可能类似于扩展持久性上下文 的事务 但是 我想知道是否可以通过使用 spring 的 PersistenceCont
  • 暂停和恢复 setInterval

    window setInterval function do stuff milisec 有没有办法随意停止这个间隔 并从它持续的地方恢复它 比如说 代码每 5 秒运行一次 我在第二秒中间停止它 当恢复时 我希望它运行剩余的 3 秒 然后每
  • iPhone 8 和 iPhone X 的型号名称是什么? [复制]

    这个问题在这里已经有答案了 谁可以使用 iPhone 8 和 iPhone X 告诉我型号名称吗 可以通过以下方式访问它UIDevice current modelName Anbu提到的信息是 iPhone 8 iPhone10 1 和
  • Java containsAll 在给定列表时不返回 true

    我想检查一个数组是否是另一个数组的子集 程序打印错误 但我期望正确 为什么 containsAll 不返回 true int subset subset new int 3 subset 0 10 subset 1 20 subset 2
  • Rails 多态关联(遗留数据库)

    我使用的是旧数据库 因此我对数据模型没有任何控制权 他们使用很多多态链接 连接表 就像这样 create table person per ident name create table person links per ident obj
  • python 中的 import 关键字实际上是如何工作的?

    假设我有 3 个文件 a py from d import d class a def type self return a def test self try x b except print EXCEPT IN A from b imp
  • 将 Kivy 设置为全屏时出现问题

    我正在尝试编写一个全屏运行 kivy 的应用程序 但这些是我的问题 1 当我运行命令时 Config set graphics fullscreen 1 然后 kivy 似乎已完全运行 但窗口的背景图像周围有很多黑色空间 即使我拉长图像 k
  • 它相当于 llvm 中的 size_t

    某些系统库 例如 malloc strlen 需要或返回 size t 作为参数 LLVM IR 中与这些函数交互的正确选择是什么 选择是编译器的任务吗 LLVM IR 有 size t 类型吗 在LLVM级别 size t不存在 它是为了
  • TBB,一项任务的线程数固定,其他任务的线程数默认

    我想在一组块上并行执行 for 循环 使用 TBB 其中每个块将使用用户提供的函数进行处理 通常 我会使用tbb parallel for 由于各种原因 我希望能够将处理块的线程数量限制为规定的数量 称之为j 通常 我会使用tbb task
  • XF - SignaturePad 仅在触摸结束时显示笔划

    我在用着签名板 https github com xamarin SignaturePad with Xamarin Forms即使在基本的硬件设备上它也能正常工作 但我在仅使用一台设备时就遇到了奇怪的行为 三星 Galaxy Tab E
  • Mongodb聚合组按逻辑还是?

    我想尝试根据文档中两个布尔字段的逻辑或进行分组 基本上 文档有两个可以表示错误条件的字段 如果其中一个字段为 true 那么我想在 id 为 true 的情况下创建一个状态字段 但如果两者都不为 true 那么我希望状态为 false 我希
  • 如何修复 JSP 编译器警告:扫描了一个 JAR 的 TLD 但不包含 TLD?

    当启动应用程序或通过 ant 编译 JSP 时 Tomcat 7 Jasper 抱怨 JAR 文件多余或放错位置 我收到以下消息 compile jsp jasper Jul 31 2012 7 15 15 PM org apache ja
  • OSSEC 电子邮件通知发送电子邮件失败

    我在尝试获取 ossec 功能时收到错误 电子邮件通知 我在这个案例中使用了我的 Gmail 帐户 我试过这个tutorial https www digitalocean com community tutorials how to in
  • 如何在 SequelizeJS 中使用 $in 运算符?

    我尝试在 SequelizeJS 中使用 in 运算符 就像在 MySQL 语句中一样 SELECT column name s FROM table name WHERE column name IN value1 value2 就我而言
  • Spark Streaming - 根据按键分组的键值对计算统计信息

    背景 我正在使用 Spark Streaming 从 Kafka 流式传输事件 这些事件采用逗号分隔键值对的形式 以下是事件如何流入我的 Spark 应用程序的示例 Key1 Value1 Key2 Value2 Key3 Value3 K
  • Fortran 派生类型

    我想知道是否可以在 Fortran 中定义一个派生类型 它会自动返回正确的类型 而无需专门调用该类型 例如var real 这是一个例子来解释我的意思 module DervType implicit none type public my
  • iTextSharp - 移动 Acrofield

    我有一个将内容表插入现有 Acroform 的流程 并且我能够跟踪需要从何处开始该内容 但是 我现有的 Acrofields 低于该点 需要根据我插入的表格的高度向上或向下移动 那么 我怎样才能改变 Acrofield 的位置呢 下面是我可