执行" pdftk my-pdf-form.pdf dump_data_fields"没有显示

时间:2015-05-20 12:24:28

标签: pdftk

我正在使用工具pdftk,我有一个可编辑的PDF,我在文档中看到参数dump_data_fields应该向我显示表单的字段。

我使用此命令(windows):pdftk my-pdf-form.pdf dump_data_fields

我正在使用pdftk服务器版。

文档:https://www.pdflabs.com/docs/pdftk-man-page/

重点是PDF是可编辑的,它有用Adobe PDF Viewer编写的字段。

4 个答案:

答案 0 :(得分:7)

问题是pdf是由Adobe LiveCycle Designer创建的,并保存为" Adob​​e Dynamic XML From"。解决方案是将文件另存为" Adob​​e Static PDF Form"。可能pdftk无法处理那些生命周期文件。

答案 1 :(得分:1)

我认为接受的答案可能是我的解决方案,但事实证明我正在使用的PDF文档实际上没有设置表单字段。如果文档看起来像某个表单,但表单字段不是灰色的,则不会检测到任何字段。

我能解决这个问题的唯一方法是在Acrobat Pro中打开文档并通过其表单工具添加字段。然后pdftk工作正常。

答案 2 :(得分:0)

如果您在Windows环境中遇到OP的问题,请按照以下说明进行操作。

1-打开GUI PDFtk程序。 (如果需要,您也可以使用cli)

extracting pdf fields using pdftk on Windows

2-单击“添加PDF ...”按钮,然后搜索可填充的PDF文件。

extracting pdf fields using pdftk on Windows

3-向下滚动到GUI PDFtk窗口的底部,然后单击“创建PDF ...”,而无需添加或更改任何设置。

extracting pdf fields using pdftk on Windows

4-将具有新名称的新的可填充PDF文件保存到您选择的目录中

extracting pdf fields using pdftk on Windows

5-最后,像这样,使用cmd发出Windows版本的dump_data_fields命令。(注意如何使用“输出”而不是““>”)

extracting pdf fields using pdftk on Windows

6-打开文本文件“ fields.txt”,您将看到字段名称。示例如下所示。

extracting pdf fields using pdftk on Windows

答案 3 :(得分:0)

我不知道这是否有帮助,但是我写了一些C#代码来计算文档中的数据字段。请参阅以下功能。

  1. 在这里,我们将文件路径传递到文件,它计算文档中字段的总数。

    public int countDataFields(string inputFile)
    {
        int fieldCount = 0;
        string arguments = "";
    
        using (Process newProcess = new Process())
        {
            arguments = inputFile + " dump_data_fields";
            newProcess.StartInfo = new ProcessStartInfo("pdftk ", arguments);
            newProcess.StartInfo.RedirectStandardInput = true;  
            newProcess.StartInfo.RedirectStandardOutput = true;
            newProcess.StartInfo.RedirectStandardError = true;
            newProcess.StartInfo.UseShellExecute = false;
            newProcess.StartInfo.CreateNoWindow = false;
            newProcess.Start();
    
            while (!newProcess.StandardOutput.EndOfStream)
            {
                var line = newProcess.StandardOutput.ReadLine();
                fieldCount = fieldCount + 1;
            }
    
            Console.WriteLine("Field Counts: " + fieldCount);
            newProcess.WaitForExit();
        }
    
        return fieldCount;
    }
    
  2. 如果要通过标准输入将文件作为流传递

    public void countDataFieldsWhenFilePassedAsBinaryStream(string file1)
    {
        int fieldCount = 0;
        // initialize the binary reader and open the binary reader with the file stream of the incoming file.
        BinaryReader binaryReader = new BinaryReader(File.Open(file1, FileMode.Open, FileAccess.Read));
    
        //create a buffer array of 1024.
        byte[] buffer = new byte[1024];
    
        using (Process newProcess = new Process())
        {
            newProcess.StartInfo = new ProcessStartInfo("pdftk");
            newProcess.StartInfo.Arguments = @" - dump_data_fields";
            newProcess.StartInfo.UseShellExecute = false;
            newProcess.StartInfo.RedirectStandardInput = true;
            newProcess.StartInfo.RedirectStandardOutput = true;
            newProcess.Start();
    
            int bytesRead = 0;
    
            // we are reading the binary files in chunks of 1024 bytes
            // we loop through as long as the byte read is greater than 0
            while ((bytesRead = binaryReader.Read(buffer, 0, 1024)) > 0)
            {
                //  we write the standard input bytes into the buffer.
                newProcess.StandardInput.BaseStream.Write(buffer, 0, bytesRead);
            }
    
            //closing the binaryReader
            binaryReader.Close();
    
            //closing the standard input stream
            newProcess.StandardInput.Close();
    
            // here we are going to loop through the standard output stream till the eof. we are counting the
    
            while (newProcess.StandardOutput.EndOfStream == false)
            {
                //read the line;
                newProcess.StandardOutput.ReadLine();
                //increment the counter
                fieldCount++;;
            }
    
            // console writeline the field count.
            Console.WriteLine(fieldCount);
    
            newProcess.WaitForExit();
        }// end of using
    }// end of function convertPDFToStandardInput
    

希望这会有所帮助:)