使用 libre office 创建的 Acrofield 不可填写代码,除非我编辑 pdf 一次

2023-12-09

我正在 Libre Office 中创建表单控件并将文档导出为 pdf。

尝试使用 itextsharp(即 C# 程序)设置控件(文本框)的文本只会清空该框。

但是,如果我使用 acrobat reader 打开 pdf 并编辑框中的文本,则将文档结果保存在 pdf 中,以便可以写入该文本框。

为什么我必须这样做?

##错误重现

单击 libreoffice 中的工具栏图标。

Toolbar icon

在文档中拖出一个正方形。

Box in document

Double clicking that box, giving it the name currenttime. Box settings

导出为 pdf:

enter image description here

c# code

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        using (var fs = new FileStream(saveFileDialog1.FileName, FileMode.Create))
        {
            var reader = new PdfReader(openFileDialog1.FileName);
            {
                using (var pdfStamper = new PdfStamper(reader, fs))
                {
                    var acroFields = pdfStamper.AcroFields;

                    acroFields.SetField("currentdate", DateTime.Now.ToString());

                    pdfStamper.FormFlattening = true;
                    pdfStamper.FreeTextFlattening = true;
                    pdfStamper.Writer.CloseStream = false;
                }
            }
            reader.Close();

            fs.Close();
        }
    }
}

#edit

这是 pdf 的文本转储。我用“一些二进制数据”更改了一些二进制数据位置。文本框已被赋予默认值“123”。

使用 libre office 创建后的 pdf 版本为 1.4

%PDF-1.4
some binary data
2 0 obj
<</Length 3 0 R/Filter/FlateDecode>>
stream
some binary data
endstream
endobj

3 0 obj
78
endobj

7 0 obj
<</Type/FontDescriptor/FontName/LiberationSans
/Flags 4
/FontBBox[-543 -303 1301 980]/ItalicAngle 0
/Ascent 905
/Descent -211
/CapHeight 979
/StemV 80
>>
endobj

8 0 obj
<</Type/Font/Subtype/TrueType/BaseFont/LiberationSans
/Encoding/WinAnsiEncoding
/FirstChar 32 /LastChar 255
/Widths[277 277 354 556 556 889 666 190 333 333 389 583 277 333 277 277
556 556 556 556 556 556 556 556 556 556 277 277 583 583 583 556
1015 666 666 722 722 666 610 777 722 277 500 666 556 833 722 777
666 777 722 666 610 722 666 943 666 666 610 277 277 277 469 556
333 556 556 500 556 556 277 556 556 222 222 500 222 833 556 556
556 556 333 500 277 556 500 722 500 500 500 333 259 333 583 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
277 333 556 556 556 556 259 556 333 736 370 556 583 333 736 552
399 548 333 333 333 576 537 333 333 333 365 556 833 833 833 610
666 666 666 666 666 666 1000 722 666 666 666 666 277 277 277 277
722 722 777 777 777 777 777 583 777 722 722 722 722 666 666 610
556 556 556 556 556 556 889 500 556 556 556 556 277 277 277 277
556 556 556 556 556 556 556 548 610 556 556 556 556 500 556 500
]
/FontDescriptor 7 0 R>>
endobj

5 0 obj
<</F1 8 0 R
>>
endobj

9 0 obj
<</Font 5 0 R
/ProcSet[/PDF/Text]
>>
endobj

1 0 obj
<</Type/Page/Parent 6 0 R/Resources 9 0 R/MediaBox[0 0 595 842]/Annots[
4 0 R ]
/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 2 0 R>>
endobj

6 0 obj
<</Type/Pages
/Resources 9 0 R
/MediaBox[ 0 0 595 842 ]
/Kids[ 1 0 R ]
/Count 1>>
endobj

10 0 obj
<</Type/XObject
/Subtype/Form
/BBox[0 0 82.7 23.1]
/Resources 9 0 R
/Length 18
/Filter/FlateDecode
>>
stream
some binary data
endstream
endobj

4 0 obj
<</Type/Annot/Subtype/Widget/F 4
/Rect[59.6 759.3 142.5 782.2]
/FT/Tx
/P 1 0 R
/T(currenttime)
/Ff 4096
/V <FEFF003100320033>
/DV <FEFF003100320033>
/DR<</Font 5 0 R>>
/DA(0 0 0 rg /F1 12 Tf)
/AP<<
/N 10 0 R
>>
>>
endobj

11 0 obj
<</Type/Catalog/Pages 6 0 R
/OpenAction[1 0 R /XYZ null null 0]
/Lang(sv-SE)
/AcroForm<</Fields[
4 0 R 
]/DR 9 0 R/NeedAppearances true>>
>>
endobj

12 0 obj
<</Creator<FEFF005700720069007400650072>
/Producer<FEFF004C0069006200720065004F0066006600690063006500200035002E0033>
/CreationDate(D:20170606104859+02'00')>>
endobj

xref
0 13
0000000000 65535 f 
0000001431 00000 n 
0000000019 00000 n 
0000000168 00000 n 
0000001843 00000 n 
0000001347 00000 n 
0000001590 00000 n 
0000000187 00000 n 
0000000357 00000 n 
0000001378 00000 n 
0000001688 00000 n 
0000002073 00000 n 
0000002231 00000 n 
trailer
<</Size 13/Root 11 0 R
/Info 12 0 R
/ID [ <5F5DD24A5E7FF740A8BB6B15F88EF602>
<5F5DD24A5E7FF740A8BB6B15F88EF602> ]
/DocChecksum /BFFAD3050AA9FF87945C97B9608B3C6C
>>
startxref
2406
%%EOF

在acrobat reader中对其进行编辑后(我将文本框的默认值从“123”更改为“12”),它将保存在1.6版本中,并插入一个有趣的x:xmpmeta信息。文档中还插入了很多空行。此时,它可以通过编程进行编辑。

%PDF-1.6
%âãÏÓ
7 0 obj
<</Linearized 1/L 6449/O 9/E 2599/N 1/T 6160/H [ 451 149]>>
endobj
                       
13 0 obj
<</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<5F5DD24A5E7FF740A8BB6B15F88EF602><FAE65369E246E7409111A7D5BDED1E6F>]/Index[7 17]/Info 6 0 R/Length 52/Prev 6161/Root 8 0 R/Size 24/Type/XRef/W[1 2 1]>>stream
some binary data
endstream
endobj
startxref
0
%%EOF
        
23 0 obj
<</Filter/FlateDecode/I 92/Length 65/S 38/V 69>>stream
some binary data
endstream
endobj
8 0 obj
<</AcroForm<</DA(/Helv 0 Tf 0 g )/DR 22 0 R/Fields[14 0 R]>>/Lang(sv-SE)/Metadata 1 0 R/OpenAction[9 0 R/XYZ null null 0]/Pages 5 0 R/Type/Catalog>>
endobj
9 0 obj
<</Annots[14 0 R]/Contents 12 0 R/CropBox[0 0 595 842]/Group<</CS/DeviceRGB/I true/S/Transparency>>/MediaBox[0 0 595 842]/Parent 5 0 R/Resources 22 0 R/Rotate 0/Type/Page>>
endobj
10 0 obj
<</BBox[0.0 0.0 82.9 22.9]/Filter/FlateDecode/Length 68/Resources 15 0 R>>stream
some binary data
endstream
endobj
11 0 obj
<</Filter/FlateDecode/First 66/Length 1226/N 9/Type/ObjStm>>stream
some binary data
endstream
endobj
12 0 obj
<</Filter/FlateDecode/Length 78>>stream
some binary data
endstream
endobj
1 0 obj
<</Length 3146/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.4-c005 78.147326, 2012/08/23-13:03:03        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
            xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <xmp:CreateDate>2017-06-06T10:48:59+02:00</xmp:CreateDate>
         <xmp:CreatorTool>Writer</xmp:CreatorTool>
         <xmp:ModifyDate>2017-06-06T11:20:41+02:00</xmp:ModifyDate>
         <xmp:MetadataDate>2017-06-06T11:20:41+02:00</xmp:MetadataDate>
         <pdf:Producer>LibreOffice 5.3</pdf:Producer>
         <xmpMM:DocumentID>uuid:fcdf7344-18ca-44b6-934c-8d5ab8fc8ea3</xmpMM:DocumentID>
         <xmpMM:InstanceID>uuid:895fdc09-0aaa-4421-86b2-418c75f88d22</xmpMM:InstanceID>
         <dc:format>application/pdf</dc:format>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                           
<?xpacket end="w"?>
endstream
endobj
2 0 obj
<</Filter/FlateDecode/First 4/Length 48/N 1/Type/ObjStm>>stream
some binary data
endstream
endobj
3 0 obj
<</Filter/FlateDecode/First 4/Length 106/N 1/Type/ObjStm>>stream
some binary data
endstream
endobj
4 0 obj
<</DecodeParms<</Columns 3/Predictor 12>>/Filter/FlateDecode/ID[<5F5DD24A5E7FF740A8BB6B15F88EF602><FAE65369E246E7409111A7D5BDED1E6F>]/Info 6 0 R/Length 37/Root 8 0 R/Size 7/Type/XRef/W[1 2 0]>>stream
some binary data
endstream
endobj
startxref
116
%%EOF

正如评论中已经推测的那样,该问题是由 Libre Office 创建 PDF 引起的需要出场 set to true in the AcroForm字典。此外,使用了错误的字段名称。

字段名称

在您的代码中,您设置字段“currentdate”,而在示例 PDF 中,该字段称为“currenttime”。显然您必须使用正确的字段名称。

需要出场 flag

该标志告诉 PDF 查看器应为文档中的所有小部件注释构建外观流和外观字典。因此,在填写表单字段时,使用 iText

acroFields.SetField("currentdate", DateTime.Now.ToString());

does not为该字段创建外观 - 任何观看者都需要构建新的外观。

不幸的是形状扁平化

pdfStamper.FormFlattening = true;

是通过使用现有的外观并且仅使用它们来实现的。由于设置字段时没有创建任何外观,因此其扁平形式实际上是空的。

(严格来说,这种形式扁平化的实现是错误的:在这种情况下,iText 是想要利用外观的 PDF 处理器;因此,它应该创建all出现在这里,甚至忽略现有的。)

您可以通过告诉 iText 在表单填写过程中创建外观来解决此问题,尽管需要出场 flag:

using (var pdfStamper = new PdfStamper(reader, fs))
{
    var acroFields = pdfStamper.AcroFields;
    acroFields.GenerateAppearances = true;// <<<<<<<<<<<<<<<<<<

    acroFields.SetField("currenttime", DateTime.Now.ToString());

    pdfStamper.FormFlattening = true;
    pdfStamper.FreeTextFlattening = true;
    pdfStamper.Writer.CloseStream = false;
}

添加上面标记的行后,代码的输出包括更改后的新设置值。


此外,Libre Office 不嵌入 LiberationSans 字体。由于我没有在我的系统上安装它,所以我只看到点。我建议您让 LibreOffice 嵌入此类字体,或者使用标准 14 种字体。否则,您的 PDF 将无法在多台计算机上按预期显示。

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

使用 libre office 创建的 Acrofield 不可填写代码,除非我编辑 pdf 一次 的相关文章

随机推荐

  • 如何在 GWT 中公开类功能

    我有一个用 Java 编写的类库 想将其转换为 Javascript 所有方法都非常简单 并且主要与操作集合有关 我有一个类 GameControl 我可以实例化它 并且我希望将其方法暴露给页面上的其他 Javascript 代码 我想到使
  • SERVER_ERROR:[代码] 1675030 [消息]:执行查询时出错

    我在 Android 中使用 Facebook 登录 Code callbackManager CallbackManager Factory create LoginButton loginButton LoginButton this
  • Windows IoT - Zebra 蓝牙打印机

    我有两台 Zebra 蓝牙打印机 MZ220 和 iMZ220 我 唯一 要做的事情就是在 Raspberry Pi 2 上使用 Windows IoT 系统打印文本 仅此而已 例子 1号线 Hello World Line2 Line3
  • NetBeans:JasperReport 异常

    我正在开发一个需要Jasper报告的项目 我使用下面提到的代码片段在NetBeans 6 1中查看报告 该报告最初是使用iReport 3 6 0生成和编译的 我的要求是使用打印此报告一个简单的 Swing 应用程序 代码片段 public
  • 在 android 中,在 recyclerView 中准确显示按钮所在位置的弹出窗口

    I m working on a gridLayout with recyclerView in android I ve a an option with each grid Item where I want to show my po
  • iOS 在另一个项目中使用现有项目的类/资源文件

    我在 App Store 中有一个 iPhone 应用程序的现有 xCode 项目 该项目包含许多视图控制器 视图 XIB 文件 图像 等 我希望创建另一个项目 其行为方式完全相同 包含相同的控制器 视图 图像 等 除了我希望更改一些小东西
  • 如果 JSF 不支持,为什么我能够将 绑定到任意方法?

    我正在使用 Glassfish 3 1 2 2 和 JSF Mojarra 2 1 6 我有以下 Facelets 页面
  • 为什么消息打印两次?

    我正在为 C 创建一个简单的 Tic Tac Toe 这是一个我遇到问题的特定函数 这应该让用户选择 X 或 O 并且对于大多数艺术来说它都有效 但是 如果我输入错误的符号 它会打印以下语句 无效符号 请重新输入 两次 Why and ho
  • 如何从网页上使用关联程序打开本地文件?

    我知道我的应用程序的用户有一个名为 c sourcefile cs 的本地文件 我需要找到一种方法来呈现该文件的链接 以便当他单击该链接时 它将在 Visual Studio 中打开该文件 这是供我们开发团队内部使用的 因此如果没有标准方法
  • 复制省略可见副作用

    考虑这段代码 include
  • 将图像存储到 sqlite 数据库中

    下面是我在 sqlite 数据库中存储图像的代码 当我用它来存储值时它可以工作 现在我尝试将图像存储在 sqlite 数据库中 我不知道我做错了什么 我已经搜索过 但无法得到我需要的答案 任何人都可以帮我解决他的代码 sqlite3 dat
  • UITableView 静态单元格作为子视图?

    使用 iOS 5 中的 Storyboard 我将 uitableview 添加到具有静态单元格的现有视图控制器中 但是当我运行该应用程序时 表格视图不会显示 视图上的其他所有内容都加载良好 如何在常规视图控制器上将带有静态单元格的 uit
  • 如何根据每个项目中显示的数据更改列表项目的背景颜色?

    我在 SQLite 中有一个订单列表 其状态各不相同 已分配 已加载 已交付 我希望每个订单在列表中显示时都有不同的颜色背景 到目前为止 我还没有找到一个好的方法来做到这一点 我发现了很多关于如何根据位置更改列表项的背景颜色的讨论 但没有一
  • 为什么 np.hypot 和 np.subtract.outer 与普通广播相比非常快,并且有更快的方法来计算距离矩阵吗?

    我有两大组二维点 需要计算距离矩阵 我需要它很快 所以我使用了 NumPy 广播 在计算距离矩阵的两种方法中 我不明白为什么一种方法比另一种方法更好 From here我得到了矛盾的结果 单元格 3 4 6 和 8 9 都计算距离矩阵 但
  • Java:在 Scanner.nextLine() 上使用默认值填充 Scanner;

    我正在编写一个运行循环并不断询问用户输入的java程序 然后程序用该字符串执行一系列操作 并请求另一个字符串并重复 问题是许多字符串非常相似 所以我想用循环中上次的输入填充提示 例如 如果用户输入如下值 Enter the SKU Numb
  • Prolog - 将数字合并为数字

    我想将数字列表合并为数字 1 2 3 gt 123 我的谓词 merge X X merge H T X merge T X1 X is X1 H 10 但现在我得到 1 2 3 gt 33 另一种方法是将到目前为止已处理的内容乘以十 但您
  • R:C 符号名称不在加载表中 - 与外部 .c 文件链接时出错

    我正在尝试使用日晷用于求解常微分方程组 ODE 的包 使用SUNDIALS 首先 我尝试运行手册中的示例 当 ODE 的右侧在 C 文件中描述时 Rsundials 可用于求解 ODE 首先 ODE 在 C 文件中进行描述 包中的示例程序
  • 比较 uint64_t 和 float 的数值等效性

    我正在编写一个协议 它使用RFC 7049作为其二进制表示 该标准规定 如果数字值等于相应的 64 位数字 则协议可以使用数字的 32 位浮点表示 转换不得导致精度损失 哪些 32 位浮点数可以大于 64 位整数并且在数值上与它们等价 正在
  • 卸载矩阵并释放内存

    我可以从文本文件加载矩阵 load mydata txt 问题是我的矩阵文件大约有 250Mb 经过几次这样的加载后 我没有内存来处理下一个文件 如何卸载它并释放资源以供进一步使用 Use clear or 清除变量 默认情况下 MATLA
  • 使用 libre office 创建的 Acrofield 不可填写代码,除非我编辑 pdf 一次

    我正在 Libre Office 中创建表单控件并将文档导出为 pdf 尝试使用 itextsharp 即 C 程序 设置控件 文本框 的文本只会清空该框 但是 如果我使用 acrobat reader 打开 pdf 并编辑框中的文本 则将