2012-06-01 4 views
0

Я хотел бы создать приложение, которое преобразует PDF-сценарии в HTML. Сценарии - очень простые тексты без изображения и других объектов, но форматирование очень важно. К счастью, также нет соглашений о форматировании.JAVA pdfbox PDF to очень простой HTML

Это говорит о том, что я нашел в Интернете библиотеку PDFbox, и я хотел бы использовать ее, но я не могу найти примеры того, как получить информацию о форматировании (или о координатах текста).

Мне нужно знать координаты поля поля и текст, чтобы я мог сравнить их, чтобы проверить, нет ли отпечатка текста.

Надеюсь, я был достаточно ясен.

Спасибо заранее!

ответ

2

https://pdfbox.apache.org/2.0/commandline.html#extracttext

"-html булева ложный выход в формате HTML вместо сырого текста."

Это похоже на то, что вам нужно.

+0

Спасибо за ваш ответ, но нет, он не делает того, что мне хотелось бы. Мне нужно знать текстовые координаты, пожалуйста, –

+0

Является ли ваше фактическое требование конвертированием PDF-файлов так же, как HTML, или извлечение текста из PDF, отступ и создание HTML. Вы открыты для программ, отличных от PDFBox? – FFL

+0

Хороший улов, @ Эмили, интересно, почему нет такого примера, как extract html из pdf на официальном сайте pdfbox, это может быть полезно. – Oleg

0

Пожалуйста, взгляните на это link. Я думаю, это поможет вам. В любом случае я копирую код оттуда в случае, если ссылка не работает ...

package printtextlocations; 

import java.io.File; 
import java.io.IOException; 
import java.text.DecimalFormat; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import org.apache.pdfbox.exceptions.InvalidPasswordException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.common.PDStream; 
import org.apache.pdfbox.util.PDFTextStripper; 
import org.apache.pdfbox.util.TextPosition; 

public class PrintTextLocations extends PDFTextStripper { 

public static StringBuilder tWord = new StringBuilder(); 
public static String seek; 
public static String[] seekA; 
public static List wordList = new ArrayList(); 
public static boolean is1stChar = true; 
public static boolean lineMatch; 
public static int pageNo = 1; 
public static double lastYVal; 

public PrintTextLocations() 
     throws IOException { 
    super.setSortByPosition(true); 
} 

public static void main(String[] args) 
     throws Exception { 
    PDDocument document = null; 
    seekA = args[1].split(","); 
    seek = args[1]; 
    try { 
     File input = new File(args[0]); 
     document = PDDocument.load(input); 
     if (document.isEncrypted()) { 
      try { 
       document.decrypt(""); 
      } catch (InvalidPasswordException e) { 
       System.err.println("Error: Document is encrypted with a password."); 
       System.exit(1); 
      } 
     } 
     PrintTextLocations printer = new PrintTextLocations(); 
     List allPages = document.getDocumentCatalog().getAllPages(); 

     for (int i = 0; i < allPages.size(); i++) { 
      PDPage page = (PDPage) allPages.get(i); 
      PDStream contents = page.getContents(); 

      if (contents != null) { 
       printer.processStream(page, page.findResources(), page.getContents().getStream()); 
      } 
      pageNo += 1; 
     } 
    } finally { 
     if (document != null) { 
      System.out.println(wordList); 
      document.close(); 
     } 
    } 
} 

@Override 
protected void processTextPosition(TextPosition text) { 
    String tChar = text.getCharacter(); 
    System.out.println("String[" + text.getXDirAdj() + "," 
      + text.getYDirAdj() + " fs=" + text.getFontSize() + " xscale=" 
      + text.getXScale() + " height=" + text.getHeightDir() + " space=" 
      + text.getWidthOfSpace() + " width=" 
      + text.getWidthDirAdj() + "]" + text.getCharacter()); 
    String REGEX = "[,.\\[\\](:;!?)/]"; 
    char c = tChar.charAt(0); 
    lineMatch = matchCharLine(text); 
    if ((!tChar.matches(REGEX)) && (!Character.isWhitespace(c))) { 
     if ((!is1stChar) && (lineMatch == true)) { 
      appendChar(tChar); 
     } else if (is1stChar == true) { 
      setWordCoord(text, tChar); 
     } 
    } else { 
     endWord(); 
    } 
} 

protected void appendChar(String tChar) { 
    tWord.append(tChar); 
    is1stChar = false; 
} 

protected void setWordCoord(TextPosition text, String tChar) { 
    tWord.append("(").append(pageNo).append(")[").append(roundVal(Float.valueOf(text.getXDirAdj()))).append(" : ").append(roundVal(Float.valueOf(text.getYDirAdj()))).append("] ").append(tChar); 
    is1stChar = false; 
} 

protected void endWord() { 
    String newWord = tWord.toString().replaceAll("[^\\x00-\\x7F]", ""); 
    String sWord = newWord.substring(newWord.lastIndexOf(' ') + 1); 
    if (!"".equals(sWord)) { 
     if (Arrays.asList(seekA).contains(sWord)) { 
      wordList.add(newWord); 
     } else if ("SHOWMETHEMONEY".equals(seek)) { 
      wordList.add(newWord); 
     } 
    } 
    tWord.delete(0, tWord.length()); 
    is1stChar = true; 
} 

protected boolean matchCharLine(TextPosition text) { 
    Double yVal = roundVal(Float.valueOf(text.getYDirAdj())); 
    if (yVal.doubleValue() == lastYVal) { 
     return true; 
    } 
    lastYVal = yVal.doubleValue(); 
    endWord(); 
    return false; 
} 

protected Double roundVal(Float yVal) { 
    DecimalFormat rounded = new DecimalFormat("0.0'0'"); 
    Double yValDub = new Double(rounded.format(yVal)); 
    return yValDub; 
} 
}