使用java编程将pdf可编辑字段转换为文本

时间:2015-12-22 16:06:40

标签: java pdf-generation itext

我准备了一个可编辑的表单但无法使用java编程将pdf可编辑字段转换为文本。

使用的API - pdfbox-app-2.0.0-RC2,PDFBox-0.7.3,itextpdf-5.1.0,pdfclown。

请帮助我了解如何将pdf可编辑字段转换为java中的文本。

使用java程序(能够将普通pdf转换为文本,但不能将pdf可编辑字段转换为文本)。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import java.awt.Desktop;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JFileChooser;

public class PdfConvertor_1{
 public static void main(String[] args){
  selectPDFFiles();
 }


 //allow pdf files selection for converting
 public static void selectPDFFiles(){

  JFileChooser chooser = new JFileChooser();
      FileNameExtensionFilter filter = new FileNameExtensionFilter("PDF","pdf");
      chooser.setFileFilter(filter);
      chooser.setMultiSelectionEnabled(true);
      int returnVal = chooser.showOpenDialog(null);
      if(returnVal == JFileChooser.APPROVE_OPTION) {
               File[] Files=chooser.getSelectedFiles();
               System.out.println("Please wait...");
               for( int i=0;i<Files.length;i++){     
                convertPDFToText(Files[i].toString(),"textfrompdf"+i+".txt");
                }
   System.out.println("Conversion complete");
                }

  }

 public static void convertPDFToText(String src,String desc){
  try{
   //create file writer
   FileWriter fw=new FileWriter("D:\\POC_Pdf2.txt");
   //create buffered writer
   BufferedWriter bw=new BufferedWriter(fw);
   //create pdf reader
   PdfReader pr=new PdfReader(src);
   //get the number of pages in the document
   int pNum=pr.getNumberOfPages();
   //extract text from each page and write it to the output text file
   for(int page=1;page<=pNum;page++){
    String text=PdfTextExtractor.getTextFromPage(pr, page);
    bw.write(text);
    bw.newLine();

   }
   bw.flush();
   bw.close();



  }catch(Exception e){e.printStackTrace();}

 }

}

Please check editable fields in image which i want to convert in to text using java

1 个答案:

答案 0 :(得分:0)

字段不是页面内容流的一部分,因此“从页面获取文本”不会为您提供字段的值。

您需要从PDF获取表单。表单是从PDF的根词典中引用的,但是有一种方便的方法来获取AcroFields对象。使用iTextSharp / C#的人已经回答了这个问题:How to read PDF form data using iTextSharp?

PdfReader reader = new PdfReader(path_to_your_completed_form);
AcroFields fields = reader.getAcroFields();
String value = fields.getField(key);

在此代码段中,path_to_your_completed_form是您从JFileChooser获得的完整路径,而key是您表单中定义的字段之一的值。

如果您不知道表单中定义了哪些字段,请阅读问题的答案How to get specific types from AcroFields? Like PushButtonField, RadioCheckField, etc?该示例中有一些代码允许您遍历可用字段并通知您是否存在字段是文本字段,复选框,单选按钮等。