我正在使用工具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编写的字段。
答案 0 :(得分:7)
问题是pdf是由Adobe LiveCycle Designer创建的,并保存为" Adobe Dynamic XML From"。解决方案是将文件另存为" Adobe Static PDF Form"。可能pdftk无法处理那些生命周期文件。
答案 1 :(得分:1)
我认为接受的答案可能是我的解决方案,但事实证明我正在使用的PDF文档实际上没有设置表单字段。如果文档看起来像某个表单,但表单字段不是灰色的,则不会检测到任何字段。
我能解决这个问题的唯一方法是在Acrobat Pro中打开文档并通过其表单工具添加字段。然后pdftk工作正常。
答案 2 :(得分:0)
如果您在Windows环境中遇到OP的问题,请按照以下说明进行操作。
1-打开GUI PDFtk程序。 (如果需要,您也可以使用cli)
2-单击“添加PDF ...”按钮,然后搜索可填充的PDF文件。
3-向下滚动到GUI PDFtk窗口的底部,然后单击“创建PDF ...”,而无需添加或更改任何设置。
4-将具有新名称的新的可填充PDF文件保存到您选择的目录中
5-最后,像这样,使用cmd发出Windows版本的dump_data_fields命令。(注意如何使用“输出”而不是““>”)
6-打开文本文件“ fields.txt”,您将看到字段名称。示例如下所示。
答案 3 :(得分:0)
我不知道这是否有帮助,但是我写了一些C#代码来计算文档中的数据字段。请参阅以下功能。
在这里,我们将文件路径传递到文件,它计算文档中字段的总数。
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;
}
如果要通过标准输入将文件作为流传递
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
希望这会有所帮助:)