`
kissmett
  • 浏览: 40000 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

pypdf2填充form field表单域后不显示问题的解决

阅读更多

python下的pdf操作,pypdf2为不二之选,除了...这个:

用这段代码(网上一把把的)来填充pdf中的form field,表单域

# -*- coding: UTF-8 -*- 
from PyPDF2 import PdfFileWriter, PdfFileReader

infile = "mb2.pdf"
outfile = "c.pdf"

pdf = PdfFileReader(open(infile, "rb"), strict=False)

pdf2 = PdfFileWriter()

field_dictionary = {'idnumber':'11ddas111','now_year':'2018-2-1','name':'好的'}

pdf2.addPage(pdf.getPage(0))
pdf2.updatePageFormFieldValues(pdf2.getPage(0), field_dictionary)

outputStream = open(outfile, "wb")
pdf2.write(outputStream)

 结果产生的pdf,用acrobat reader打开时不显示表单域的内容,只有在鼠标点击后才能显示,失去焦点后再次消失,只有重新copy paste之后才能显示:

 

 当鼠标点击后会显示:



 

 

网上遇到类似情况的也不少:

https://stackoverflow.com/questions/47369740/pypdf2-appends-the-same-file-over-and-over 修改fields 提及,pypdf2 表单域不能在acrobat reader中显示,,不能填充cb和rb:
  PyPdf2 seems to be the best option despite all the bugs python packages have for pdfs such as fields not showing in acroreader and being unable to fill checkboxes or radio buttons. 
There does appear to be a bug (with pdfs generally? maybe) where the pdf file is not redrawn. If one clicks on the field one can see the new text that PyPDF2 entered however one then has to manually copy and paste in order to see that change permanently.

 

最终在这个issue里找到了解决方案:

https://github.com/mstamy2/PyPDF2/issues/355

and thanks this great guy (https://github.com/ademidun) 给出了参考:

Okay, I think I have figured it out. If you read section 12.7.2 (page 431) of the PDF 1.7 specification, you will see that you need to set the NeedAppearances flag of the Acroform.

 

ok,我们不生产代码,只做代码的搬运工:D

如下是解决方案:

 

# -*- coding: UTF-8 -*- 
from PyPDF2 import PdfFileWriter, PdfFileReader
from PyPDF2.generic import BooleanObject, NameObject, IndirectObject

def set_need_appearances_writer(writer):
    # See 12.7.2 and 7.7.2 for more information: http://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
    try:
        catalog = writer._root_object
        # get the AcroForm tree
        if "/AcroForm" not in catalog:
            writer._root_object.update({
                NameObject("/AcroForm"): IndirectObject(len(writer._objects), 0, writer)})

        need_appearances = NameObject("/NeedAppearances")
        writer._root_object["/AcroForm"][need_appearances] = BooleanObject(True)
        return writer

    except Exception as e:
        print('set_need_appearances_writer() catch : ', repr(e))
        return writer

infile = "mb2.pdf"
outfile = "c.pdf"

pdf = PdfFileReader(open(infile, "rb"), strict=False)
if "/AcroForm" in pdf.trailer["/Root"]:
    pdf.trailer["/Root"]["/AcroForm"].update(
        {NameObject("/NeedAppearances"): BooleanObject(True)})

pdf2 = PdfFileWriter()
set_need_appearances_writer(pdf2)
if "/AcroForm" in pdf2._root_object:
    pdf2._root_object["/AcroForm"].update(
        {NameObject("/NeedAppearances"): BooleanObject(True)})

field_dictionary = {'idnumber':'11ddas111','now_year':'2018-2-1','name':'好的'}

pdf2.addPage(pdf.getPage(0))
pdf2.updatePageFormFieldValues(pdf2.getPage(0), field_dictionary)

outputStream = open(outfile, "wb")
pdf2.write(outputStream)

 

  • 大小: 27.7 KB
  • 大小: 30.5 KB
分享到:
评论

相关推荐

    Java创建和填充PDF表单域方法

    2. **填充表单域** 填充已创建的表单域通常包括以下步骤: - 为每个表单域设置文本,如`textBox.setText("刘兴")`,这适用于文本框 - 对于复选框和单选按钮,可以设置其状态,如`checkBoxField.setChecked(true)...

    json 填充 form

    2. **解析JSON数据**:在成功获取数据后,`success`回调函数中的`data`参数就是JSON对象,我们可以解析它以获取需要的属性。 3. **遍历表单元素**:接下来,遍历HTML表单中的所有元素,通常使用`$('form').find('...

    漂亮的form表单-漂亮的form表单

    在网页设计中,表单(Form)是用户与网站交互的重要元素,用于收集用户输入的信息。"漂亮的form表单"这个主题关注的是如何创建既美观又功能强大的表单,以提高用户体验并提升网站的整体视觉效果。下面将详细介绍关于...

    itextpdf 解决中文不显示问题

    itextpdf 再创将pdf格式文件的时候中文不显示或者乱码问题的解决 其实目前最新版本的itexpdf即使加了asian的辅助包也不能解决中文不显示问题 因为自己试过 可能方式不对 这个绝对显示 显示不了的 分不要

    c#输出pdf (动态填充表单内容,显示中文)Demo

    在这个例子中,`"fieldName1"`和`"fieldName2"`是PDF表单中的字段名称,你需要根据实际表单结构替换。`BaseFont.IDENTITY_H`参数用于告诉ITextSharp保持字符的原始宽度,这对于中文字符非常重要。 最后,需要注意的...

    java bean 与 Web Form表单如何实现自动装配

    【JavaBean与Web Form表单自动装配】是Web开发中常用的一种技术,特别是在使用像Struts2这样的MVC框架时,能够极大地简化数据绑定的过程。这个过程的核心是将用户在Web表单中填写的数据自动地映射到JavaBean对象的...

    原生js form表单美化插件表单元素input select下拉框

    在网页开发中,表单(Form)是用户与网站交互的重要组成部分,用于收集用户输入的信息。原生JavaScript作为Web开发的基础,提供了丰富的API和方法来处理表单元素,如input和select。本主题将深入探讨如何使用原生...

    java一键pdf转图片及pdf域填充,封装好的工具类

    2. **PDF域填充**: PDF域填充是指在已有的PDF模板上填充数据,例如填写表单或证书。EasyPDFUtil支持这一功能,允许开发者传入一个包含键值对的Map对象,键代表PDF模板上的域名,值是填充的内容。调用相应方法后,...

    jquery.formautofill 表单填充控件

    **jQuery.formautofill 表单填充控件详解** 在Web开发中,处理表单数据的填充是一项常见的任务。为了提高开发效率和用户体验,开发者们经常寻找自动化解决方案,以简化表单字段的赋值过程。这里我们要介绍的是...

    Python关于 Django 的web- Form 表单验证

    Django Form允许自定义验证规则,通过在Form类中定义`clean_<field_name>`方法。这个方法会在所有字段验证通过后执行,可以用来检查更复杂或跨字段的验证逻辑。 4. **错误处理** 当表单数据未通过验证时,Django...

    解决浏览器会自动填充密码的问题

    解决办法是在form上或input上添加autoComplete=”off”这个属性。 form表单的属性如下所示: 但是这个解决方案在谷歌和火狐上均有bug,下面来一个一个解决。 1.’autocomplete=”off”‘在Chrome中不起作用解决方案 ...

    填充pdf模板源码和jar包

    3. 创建填充对象:使用`PdfStamper`或`PdfCopyFields`类,这两个类都提供了填充表单域的功能。 4. 填充数据:通过`AcroFields`接口,你可以获取到PDF中的表单域,并设置其值。例如,`acroFields.setField("field...

    xadmin使用formfield_for_dbfield函数过滤下拉表单实例

    `formfield_for_dbfield`函数正是这样一个工具,它允许我们在Django的Admin模型中自定义字段的表单字段。本实例将详细讲解如何利用`formfield_for_dbfield`实现过滤下拉表单的选择项。 首先,确保你的环境是Django ...

    javascript实现自动提交form表单

    内含联系方式,不懂用可以问我!多次修改后已无瑕疵,用它实现当页面刷新的时候自动提交表单数据,目前我把它运用在领取某论坛每日登录礼包这种繁琐的小事中,你还可以运用到更有价值的地方去。

    【ASP.NET编程知识】ASP.NET中实现Form表单字段值自动填充到操作模型中.docx

    ASP.NET编程知识 - ASP.NET中实现Form表单字段值自动填充到操作模型中 ASP.NET是一个功能强大的Web应用程序开发框架,它提供了许多便捷的功能来提高开发效率和质量。在ASP.NET中,实现Form表单字段值自动填充到...

    C# post方式提交Form表单

    本篇文章将深入探讨如何使用C#实现POST方式提交Form表单,这对于网络应用程序的开发至关重要,因为它允许我们向服务器发送数据,比如登录、注册、提交表单等操作。 1. **HTTP POST方法**: HTTP协议提供了两种主要...

    VB程序显示不同填充颜色及填充效果的圆

    在VB(Visual Basic)编程环境中,我们可以利用图形绘制功能创建各种视觉效果,其中包括显示不同填充颜色及填充效果的圆。这个程序的目的是通过鼠标点击事件,动态地在窗体上生成具有不同填充颜色和填充样式的圆形,...

    ITextPdf表单填充

    4. **填充表单**:通过`AcroFields.setField()`方法填充特定的表单字段,传入字段名和相应的值。 5. **保存修改**:创建一个`PdfStamper`对象,将修改应用到PDF上,并使用`PdfStamper.close()`方法保存更改。 **...

    一种基于可行域的图案填充的方法

    ### 基于可行域的图案填充...综上所述,基于可行域的图案填充方法为解决复杂形状填充问题提供了一种有效的新途径。通过合理的数学建模和高效的填充策略,该方法不仅能够满足高性能的要求,还能适应广泛的填充应用场景。

    CAD填充solid不显示怎么办.docx

    通过上述方法,大多数关于"SOLID"填充不显示的问题都能得到解决。如果问题依然存在,可能需要进一步的故障排查,包括检查CAD的日志文件,或者寻求专业技术支持的帮助。记住,良好的绘图习惯和定期维护是避免此类问题...

Global site tag (gtag.js) - Google Analytics