执行 "pdftk my-pdf-form.pdf dump_data_fields" 什么也没显示
Executing "pdftk my-pdf-form.pdf dump_data_fields" shows nothing
我正在使用工具 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 编写的字段。
问题是 pdf 是由 Adobe LiveCycle Designer 创建并另存为 "Adobe Dynamic XML From"。解决方案是将文件另存为 "Adobe Static PDF Form"。可能 pdftk 无法处理该 livecycle 文件。
我认为接受的答案可能是我的解决方案,但事实证明我正在使用的 PDF 文档实际上没有设置表单域。如果文档看起来 像一个表单,但表单字段没有变灰,则不会检测到任何字段。
我能解决这个问题的唯一方法是在 Acrobat Pro 中打开文档并通过其表单工具添加字段。然后 pdftk 工作正常。
如果您在 Windows 环境中遇到 OP 问题,请按照以下说明进行操作。
1- 打开 GUI PDFtk 程序。 (如果您愿意,也可以使用 cli)
2- 单击 "Add PDF..." 按钮并搜索准备好填写的 PDF 文件。
3- 向下滚动到 GUI PDFtk 的底部 window 并单击 "Create PDF..." 而不添加或更改任何设置。
4- 使用新名称将新的准备好填写的 PDF 文件保存到您选择的目录
5- 最后,使用 cmd 发出 Windows 版本的 dump_data_fields 命令,就像这样。(注意如何使用 "output" 代替“>”)
6- 打开文本文件 "fields.txt",您将看到字段名称。示例如下所示。
我不知道这是否有帮助,但我编写了一些 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
希望这对您有所帮助:)
我正在使用工具 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 编写的字段。
问题是 pdf 是由 Adobe LiveCycle Designer 创建并另存为 "Adobe Dynamic XML From"。解决方案是将文件另存为 "Adobe Static PDF Form"。可能 pdftk 无法处理该 livecycle 文件。
我认为接受的答案可能是我的解决方案,但事实证明我正在使用的 PDF 文档实际上没有设置表单域。如果文档看起来 像一个表单,但表单字段没有变灰,则不会检测到任何字段。
我能解决这个问题的唯一方法是在 Acrobat Pro 中打开文档并通过其表单工具添加字段。然后 pdftk 工作正常。
如果您在 Windows 环境中遇到 OP 问题,请按照以下说明进行操作。
1- 打开 GUI PDFtk 程序。 (如果您愿意,也可以使用 cli)
2- 单击 "Add PDF..." 按钮并搜索准备好填写的 PDF 文件。
3- 向下滚动到 GUI PDFtk 的底部 window 并单击 "Create PDF..." 而不添加或更改任何设置。
4- 使用新名称将新的准备好填写的 PDF 文件保存到您选择的目录
5- 最后,使用 cmd 发出 Windows 版本的 dump_data_fields 命令,就像这样。(注意如何使用 "output" 代替“>”)
6- 打开文本文件 "fields.txt",您将看到字段名称。示例如下所示。
我不知道这是否有帮助,但我编写了一些 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
希望这对您有所帮助:)