【问题标题】:Itext get field coordinates from existing pdfItext 从现有的 pdf 中获取字段坐标
【发布时间】:2013-09-28 10:53:49
【问题描述】:

首先,我不是Java开发人员:(我只需要一个小程序,它会从现有的pdf文件中按字段名称向我输出字段坐标,当我从命令行调用我的类时,我会输入这些坐标,像这样:

javac GetField.java
java GetField <myForm.pdf>, <myFieldName>

我在我的服务器上使用 itext。现在我正在尝试运行简单的代码:

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.*;
import java.util.*;
import java.awt.List;

class HelloWorld{
  public static void main(String[] args) throws IOException {
    PdfReader reader = new PdfReader("Noname.pdf");

    AcroFields fields = reader.getAcroFields();

    float[] positions = fields.getFieldPositions("Signature");
    System.out.println( positions );

  }
}

但我有错误:“类型不匹配:无法从 List 转换为 float[]”。 当我更换

float[] positions = fields.getFieldPositions("Signature");
System.out.println( positions );

System.out.println( fields.getFieldPositions("Signature") );

我得到了结果“[com.itextpdf.text.pdf.AcroFields$FieldPosition@36af35b1]”,但我需要浮点值。 你能帮我完成这个任务吗?

【问题讨论】:

  • “但它不起作用”不是对问题的描述。
  • 您遇到的实际问题/错误是什么?
  • fields.getFieldPositions("Signature") 在早期版本中用于返回 float 数组。前段时间已更改为支持ListAcroFields.FieldPosition 实例。
  • @mkl,这是什么意思?我必须做什么?
  • 您似乎导入了错误的List 类型。

标签: java linux itext


【解决方案1】:

为了彻底解决问题,我写了这个java类:

// GetSigPos.java 
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.*;
//import java.util.*;
import java.util.List;
//import java.awt.List;

class GetSigPos {
  public static void main(String[] args) throws IOException {
    String pdfFile = args[0];
    PdfReader reader = new PdfReader(pdfFile);

    AcroFields fields = reader.getAcroFields();

    for(String signame : fields.getBlankSignatureNames()) {
      List<AcroFields.FieldPosition> positions = fields.getFieldPositions(signame);
      Rectangle rect = positions.get(0).position; // In points:
      float left   = rect.getLeft();
      float bTop   = rect.getTop();
      float width  = rect.getWidth();
      float height = rect.getHeight();

      int page = positions.get(0).page;
      Rectangle pageSize = reader.getPageSize(page);
      float pageHeight = pageSize.getTop();
      float top = pageHeight - bTop;

      System.out.print(signame + "::" + page + "::" + left + "::" + top + "::" + width + "::" + height + "\n");
    }
  }
}

然后我可以在命令行中运行它:

javac GetSigPos.java
java GetSigPos "MyForm.pdf"

或者在我的 php 程序中,我可以使用这个命令来执行它们:

exec('java -cp .:/usr/local/bin/pdfbox/itextpdf-5.4.4.jar:/usr/local/bin/pdfbox GetSigPos "'.$pdfName.'" 2>&1', $output);

echo '<pre>';
print_r($output);
echo '</pre>';

P.S.别忘了在你的 java 中输入 CLASSPATH!我正在使用 Centos 6

vi /root/.bash_rofile

然后输入:

export JAVA_HOME=/usr/lib/jvm/jre-1.5.0-gcj
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:/usr/local/bin/pdfbox/itextpdf-5.4.4.jar:/usr/local/bin/pdfbox

【讨论】:

  • 一个字段也可能有零个或多个可视化。 getFieldPositions 返回List 是有原因的...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多