You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将HelloSign 80DPI坐标转换为72DPI后通过PDFBox注入PDF

HelloSign 模板API字段坐标转换适配PDFBox方案

核心转换逻辑

HelloSign返回的字段坐标基于80DPI,PDF标准默认采用72DPI,二者换算比例为72/80=0.9,所有原始坐标与尺寸参数均需按该比例缩放。

基础参数转换公式

四个返回参数x、y、width、height统一按如下规则转换:

72DPI下参数值 = 原始80DPI参数值 * 0.9

举个示例:返回的VendorName字段原始x=160,转换后为160*0.9=144;原始width=80,转换后为80*0.9=72。

额外Y轴适配处理

HelloSign返回的Y坐标以页面顶部为原点向下计算,而PDFBox默认的PDF坐标系以页面底部为原点向上计算,因此需要额外做Y轴翻转:

  1. 首先获取目标PDF页面对应72DPI下的总高度(标准A4页面高度为842)
  2. 按如下公式计算最终可用Y坐标:
最终Y坐标 = PDF页面总高度 - 缩放后的Y值 - 缩放后的字段高度

PDFBox注入字段参考代码(Java)

// 加载PDF文档
PDDocument document = PDDocument.load(new File("你的原始PDF路径.pdf"));
PDPage page = document.getPage(0);
// 获取页面72DPI下的高度
float pageHeight = page.getMediaBox().getHeight();
// 遍历HelloSign返回的form_fields
for (HelloSignFormField field : formFields) {
    // 坐标转换
    float x = field.getX() * 0.9f;
    float y = field.getY() * 0.9f;
    float width = field.getWidth() * 0.9f;
    float height = field.getHeight() * 0.9f;
    // Y轴翻转
    float finalY = pageHeight - y - height;
    // 按字段类型创建对应PDF表单字段
    if ("text".equals(field.getType()) || "date_signed".equals(field.getType())) {
        PDTextField textField = new PDTextField(document.getDocumentCatalog().getAcroForm());
        textField.setPartialName(field.getName());
        textField.setRequired(field.isRequired());
        // 设置字段位置
        textField.setWidgets(Collections.singletonList(new PDAnnotationWidget()));
        textField.getWidgets().get(0).setRectangle(new PDRectangle(x, finalY, width, height));
        textField.getWidgets().get(0).setPage(page);
        document.getDocumentCatalog().getAcroForm().getFields().add(textField);
    } else if ("checkbox".equals(field.getType())) {
        PDCheckBox checkBox = new PDCheckBox(document.getDocumentCatalog().getAcroForm());
        checkBox.setPartialName(field.getName());
        checkBox.setRequired(field.isRequired());
        checkBox.setWidgets(Collections.singletonList(new PDAnnotationWidget()));
        checkBox.getWidgets().get(0).setRectangle(new PDRectangle(x, finalY, width, height));
        checkBox.getWidgets().get(0).setPage(page);
        document.getDocumentCatalog().getAcroForm().getFields().add(checkBox);
    }
}
// 保存修改后的PDF
document.save(new File("输出带表单的PDF路径.pdf"));
document.close();

注意事项

  • 如果你使用的PDF不是标准72DPI,需要先将PDF页面尺寸统一转换为72DPI后再做上述计算
  • 同组的checkbox字段需要额外配置互斥逻辑,保证同一时间仅能选中一个选项
  • date_signed类型字段可直接作为文本字段处理,注入时填入格式化后的日期字符串即可

内容的提问来源于stack exchange,提问作者Diego Pita Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:09:01