【问题标题】:Get page number of pdf form field using php使用php获取pdf表单字段的页码
【发布时间】:2020-01-03 19:56:47
【问题描述】:

我目前正在使用 SetaPDF 获取位于文档中的表单字段并将这些表单字段名称保存在数据库中。但是,我正在尝试获取这些表单字段的页码。我在 Seta 文档中找不到任何有助于解决此问题的内容。我可以使用其他 PDF 库来完成此操作吗?

$document = SetaPDF_Core_Document::loadByFilename($file);
$formFiller = new SetaPDF_FormFiller($document);
$fields = $formFiller->getFields();
foreach ($fields->getNames() as $fieldName) {
    $field = $fields->get($fieldName);
    $is_read_only = 0;
    if ($field->isReadOnly()) {
        $is_read_only = 1;
    }

    $is_text = 1;
    $field_name = DB::Scrub($fieldName);

    $base_field_name = $field->getOriginalQualifiedName();

    if (strpos($base_field_name,"#") !== false) {
        $arr_field = explode("#", $base_field_name);
        $base_field_name = $arr_field[0];
    }
    if (strpos($base_field_name,"*") !== false) {
        $is_text = 0;
        $base_field_name = str_replace("*","",$base_field_name);
    }

    $sql = "INSERT INTO [cust].[PDF_Fields] (file_name,field_name,base_field_name,is_read_only,is_text)
        VALUES ('$new_file','$field_name','$base_field_name',$is_read_only,$is_text)";
    DB::Query($sql);
}

【问题讨论】:

  • 如果您要遍历 PDF 的页面,只需添加一个计数器并用它填充页码。
  • 不幸的是,我不是。我正在打开文档并调用 getFields() 方法。这将获取文档中的每个字段。不包含页面详细信息。
  • 请注意,PDF AcroForm 字段在技术上不是任何页面的一部分,而是作为文档范围的元数据存在。相反,字段在页面上由 Widget Annotation 表示。一个字段可以有零到多个小部件,它们看起来可能不同,但都具有相同的值。
  • 那很不幸。谢谢你的解释。
  • 我不熟悉 SetaPDF 但您可以尝试以下操作(不确定 SetaPDF 是否支持该功能):从字段对象中检索字段小部件列表(这些是page) 并从每个字段小部件中检索对包含小部件的页面的引用。此信息存在于 PDF 文件中,您必须查看 SetaPDF 是否公开。

标签: php pdf setapdf


【解决方案1】:

正如 Ryan 已经写的那样,表单字段与页面没有直接关系,但它们作为 Widget Annotations 的表示是。这是通过在页面的/Annots 数组中添加对各个小部件注释的引用来完成的。可悲的是,反过来(从注释到页面)是可选的。

您可以通过 SetaPDF-Core 组件的一些低级方法获取页面及其编号:首先您需要一个表单域的 Widget Annotation 实例。这可以通过表单字段实例的getAnnotation() 方法来完成。

然后您可以使用此实例通过主页实例的getPageByAnnotation() 方法搜索页面。要仅获取页码,您可以将此结果传递给 getPageNumberByPageObject() 然后。

上面写的代码可能是这样的:

$pages = $document->getCatalog()->getPages();
$annotation = $field->getAnnotation();
// Method name is a bit vague and accepts an annotation instance starting with revision > 1371 only
$page = $pages->getPageByAnnotation($annotation->getIndirectObject($document));
// $page = $pages->getPageByAnnotation($annotation); // works with revision > 1371
$pageNumber = $pages->getPageNumberByPageObject($page);

【讨论】:

  • 感谢您的回答。我收到以下错误:传递给 SetaPDF_Core_Document_Catalog_Pages::getPageByAnnotation() 的参数 1 必须是 SetaPDF_Core_Type_IndirectObject 的实例,给定的 SetaPDF_Core_Document_Page_Annotation_Widget 的实例。
  • 对不起,我的错。有一个问题我们已经在我们的开发分支中解决了。我更新了截断的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多