Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么pikepdf会在使用Acrobat DC创建的PDF上填充某些PDF字段,而不是其他字段_Python_Pdf_Acrobat_Pikepdf - Fatal编程技术网

Python 为什么pikepdf会在使用Acrobat DC创建的PDF上填充某些PDF字段,而不是其他字段

Python 为什么pikepdf会在使用Acrobat DC创建的PDF上填充某些PDF字段,而不是其他字段,python,pdf,acrobat,pikepdf,Python,Pdf,Acrobat,Pikepdf,我有一个由我的客户用Acrobat DC创建的带有表单字段的PDF。我使用Python pikepdf以编程方式填充这些字段。奇怪的是,有些字段已填充,而另一些字段未填充。我与AcrobatDC进行了反复检查:所有字段都具有完全相同的文本字段属性,名称显然是唯一的。Python代码使用正确的名称对字段进行寻址。因此,我怀疑问题可能与我的客户创建字段的方式有关。使用AcrobatDC,我删除了有问题的字段,并创建了全新的字段,这些字段的文本字段属性与显示为已填充的字段相同,但没有任何效果 现在我用

我有一个由我的客户用Acrobat DC创建的带有表单字段的PDF。我使用Python pikepdf以编程方式填充这些字段。奇怪的是,有些字段已填充,而另一些字段未填充。我与AcrobatDC进行了反复检查:所有字段都具有完全相同的文本字段属性,名称显然是唯一的。Python代码使用正确的名称对字段进行寻址。因此,我怀疑问题可能与我的客户创建字段的方式有关。使用AcrobatDC,我删除了有问题的字段,并创建了全新的字段,这些字段的文本字段属性与显示为已填充的字段相同,但没有任何效果


现在我用Acrobat Reader检查了pikepdf生成的PDF,所有填写的字段都显示了它们的值,叹气!但是,没有一个Linux PDF查看器在显示其他一些字段的内容时显示有问题字段的内容。我尝试了Okular、Atril、XFCE4的文档查看器和LibreOffice Draw。这似乎表明问题出在Acrobat方面。有什么想法吗?

@joelgeraci:没错,pikepdf不会生成外观流。奇怪的是,像XFCE4 Document viewer这样的查看器显示某些字段的填充值,而不显示其他字段的填充值。以下是pikepdf生成的页面转储的一部分:

<pikepdf.Dictionary(type_="/Page")({
  "/Annots": [ {
    "/DA": "/HeBo 14 Tf 0 g",
    "/F": 4,
    "/FT": "/Tx",
    "/Ff": 12582912,
    "/MK": {

    },
    "/P": <.get_object(785, 0)>,
    "/Q": 1,
    "/Rect": [ Decimal('134.783'), Decimal('432.837'), Decimal('205.463'), Decimal('458.588') ],
    "/StructParent": 201,
    "/Subtype": "/Widget",
    "/T": "Number_01",
    "/Type": "/Annot"
  }, {
    "/DA": "/HeBo 14 Tf 0 g",
    "/F": 4,
    "/FT": "/Tx",
    "/Ff": 12582912,
    "/MK": {

    },
    "/P": <.get_object(785, 0)>,
    "/Q": 1,
    "/Rect": [ Decimal('590.089'), Decimal('430.645'), Decimal('660.768'), Decimal('455.76') ],
    "/StructParent": 202,
    "/Subtype": "/Widget",
    "/T": "Units_01",
    "/Type": "/Annot"
  } ],
...
})>


虽然字段“Number_01”显示为已填充,但字段“Units_01”不显示为已填充,尽管两者都没有外观流。然而,其他字段确实有外观流,并且也会显示填充的值,尽管pikepdf无法更新外观流。我还想知道为什么Acrobat DC会为某些字段创建外观流,而不是为其他字段创建外观流。

@joelgeraci:没错,pikepdf不会生成外观流。奇怪的是,像XFCE4 Document viewer这样的查看器显示某些字段的填充值,而不显示其他字段的填充值。以下是pikepdf生成的页面转储的一部分:

<pikepdf.Dictionary(type_="/Page")({
  "/Annots": [ {
    "/DA": "/HeBo 14 Tf 0 g",
    "/F": 4,
    "/FT": "/Tx",
    "/Ff": 12582912,
    "/MK": {

    },
    "/P": <.get_object(785, 0)>,
    "/Q": 1,
    "/Rect": [ Decimal('134.783'), Decimal('432.837'), Decimal('205.463'), Decimal('458.588') ],
    "/StructParent": 201,
    "/Subtype": "/Widget",
    "/T": "Number_01",
    "/Type": "/Annot"
  }, {
    "/DA": "/HeBo 14 Tf 0 g",
    "/F": 4,
    "/FT": "/Tx",
    "/Ff": 12582912,
    "/MK": {

    },
    "/P": <.get_object(785, 0)>,
    "/Q": 1,
    "/Rect": [ Decimal('590.089'), Decimal('430.645'), Decimal('660.768'), Decimal('455.76') ],
    "/StructParent": 202,
    "/Subtype": "/Widget",
    "/T": "Units_01",
    "/Type": "/Annot"
  } ],
...
})>


虽然字段“Number_01”显示为已填充,但字段“Units_01”不显示为已填充,尽管两者都没有外观流。然而,其他字段确实有外观流,并且也会显示填充的值,尽管pikepdf无法更新外观流。我还想知道为什么Acrobat DC为某些字段创建外观流,而不为其他字段创建外观流。

解决方案


填充字段时,我愚蠢地将INT传递给了pikepdf;传递字符串解决了这个问题。更重要的是:Linux查看器不需要“NeedAppearances”标志来显示填写的值,而Acrobat Reader需要此标志。

解决方案


填充字段时,我愚蠢地将INT传递给了pikepdf;传递字符串解决了这个问题。此外:Linux查看器不需要“NeedAppearancess”标志来显示填写的值,而Acrobat Reader需要此标志。

您可能希望在尝试填写之前和之后共享pdf以进行分析。听起来pikepdf没有为字段值生成pdf外观。有些PDF查看器(如Adobe Reader)会在没有外观时创建外观。但大多数观众不会。这就是为什么一些查看器显示字段值,而其他查看器不显示字段值的原因。当一个字段属性应用了一种格式时,这一点尤其正确。。。例如日期。您可能希望在尝试填写以进行分析之前和之后共享pdf。听起来pikepdf没有为字段值生成pdf外观。有些PDF查看器(如Adobe Reader)会在没有外观时创建外观。但大多数观众不会。这就是为什么一些查看器显示字段值,而其他查看器不显示字段值的原因。当一个字段属性应用了一种格式时,这一点尤其正确。。。比如约会。