IText: рдкреАрдбреАрдПрдл рд╕реЗ рдкрд╛рда рдЦреАрдВрдЪрдирд╛

рдЫрд╡рд┐



рджрд┐рди рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╕рдордп, рд╣рдмреНрд░реЛрд╡реНрд╕реНрдХ!



рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдПрдХ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛: рдкреГрд╖реНрда рдкрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдпрд╛рдж рдХрд░рдХреЗ рдкреАрдбреАрдПрдл рд╕реЗ рдкрд╛рда рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдПред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╢реБрд░реВ рдореЗрдВ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд╛рд░реНрдп рдореЗрдВ, рдиреБрдХрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред рдЖрдкрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛? рдЬрд╡рд╛рдм рдХрдЯ рдХреЗ рдиреАрдЪреЗ рд╣реИред



рдкреАрдбреАрдПрдл рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛


рдкреАрдбреАрдПрдл (рдкреЛрд░реНрдЯреЗрдмрд▓ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдлреЙрд░реНрдореЗрдЯ) рдкреЛрд╕реНрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рд╛рд░реВрдк рд╣реИред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЖрджрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред



рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдХреЗрд╡рд▓ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдерд╛, рдЕрд░реНрдерд╛рддреН, рдкреАрдбреАрдПрдл рдЦреЛрд▓реЗрдВ рдФрд░ рдкрд╛рда рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВред рдФрд░, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдкреАрдбреАрдПрдл рдХреЛ рдкреАрдбреАрдПрдл рдХреЗ рдЕрдВрджрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрдИ рддрдереНрдпреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдХрд╛рд░реНрдп рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ:





рдЗрд╕рд▓рд┐рдП, рдкреАрдбреАрдПрдл рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рддреБрд░рдВрдд рдЧрд╛рдпрдм рд╣реЛ рдЧрдИред

рдкреАрдПрд╕ рдЗрд╕ рд╕рдм рд╕реЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдПрдХ рдЙрджреНрдзрд░рдг рдпрд╛рдж рдХрд┐рдпрд╛
рдЬреЛ рд▓реЛрдЧ рд╕реЙрд╕реЗрдЬ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдиреВрди рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рдПред


рдлрд┐рд░, рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (pdfminer, pdfbox) рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ iText рдкрд░ рд░реБрдХрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред



IText рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛


iText: рдПрдХ рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬрд┐рд╕реЗ рдкреАрдбреАрдПрдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдПрдХ C # рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣реИ: iTextSharp)ред рд╕рдВрд╕реНрдХрд░рдг 5.0.0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдЗрд╕реЗ рдПрдЬреАрдкреАрдПрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ (рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп) рдХреЗ рддрд╣рдд рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣реИред рдЗрд╕реЗ рдЕрдЪреНрдЫреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдЬреЛ рд▓реЛрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХреНрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ iText рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдкреБрд╕реНрддрдХ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред



рдкреАрдбреАрдПрдл рд╕реЗ рдкрд╛рда рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛


рдпрд╣ рдХреЛрдб рдкреАрдбреАрдПрдл рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред



public class SimpleTextExtractor { public static void main(String[] args) throws IOException { // ,      -   PdfReader reader = new PdfReader(args[0]); //  ,     PDF   . for (int i = 1; i <= reader.getNumberOfPages(); ++i) { TextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); String text = PdfTextExtractor.getTextFromPage(reader, i, strategy); System.out.println(text); } //    reader.close(); } }
      
      







рдФрд░ рдЕрдм рдЗрд╕реЗ рдХреНрд░рдо рдореЗрдВ рд╕рдордЭреЗрдВред



PdfReader рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдкреАрдбреАрдПрдл рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рди рдХреЗрд╡рд▓ рдлрд╛рдЗрд▓ рдХреА рдУрд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ InputStream, Url рдпрд╛ RandomAccessFileOrArray рдкрд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



TextExtractionStrategy - рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рдкрд╛рда рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдгрдиреАрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдиреАрдЪреЗ рд╣реИред



SimpleTextExtractionStrategy - рдПрдХ рд╡рд░реНрдЧ рдЬреЛ TextExtractionStrategy рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдирд╛рдо рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рдкреАрдбреАрдПрдл рд╕реЗ рдкрд╛рда рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдЦреАрдВрдЪрддрд╛ рд╣реИ (рдпрд╣ рдкреАрдбреАрдПрдл рдХреЗ рдЪрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдпрджрд┐ рдкрд╛рда рдкрд╣рд▓реЗ рджреЛ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреВрд░реЗ рдкреГрд╖реНрда рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрддрдиреА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред



PdfTextExtractor - рдПрдХ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ 2 getTextFromPage рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рдЕрдВрддрд░ рд╣реИ - рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рда рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдпрд╛ рди рдХрд░рдиреЗ рдХреА рд░рдгрдиреАрддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред



рд╣рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП, рдкрд╛рда рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ TextExtractionStrategy рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдпреЗ рджреЛ рдХрд╛рд░реНрдп:



 public void renderText(TextRenderInfo renderInfo)
      
      



- рдЬрдм getTextFromPage рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред TextRenderInfo рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ: рдкрд╛рда, рдлрд╝реЙрдиреНрдЯ, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред



 public string GetResultantText()
      
      



- рдпрд╣ рдлрд╝рдВрдХреНрд╢рди getTextFromPage рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдирдореВрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдо рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреИрд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛рдП <рдкрдВрдХреНрддрд┐ y- рд╕рдордиреНрд╡рдп, рдкрдВрдХреНрддрд┐ рдкрд╛рда>ред



рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:



 public class TextExtractionStrategyImpl implements TextExtractionStrategy { private TreeMap<Float, TreeMap<Float, String>> textMap; public TextExtractionStrategyImpl() { // reverseOrder     y      textMap = new TreeMap<Float, TreeMap<Float, String>>(Collections.reverseOrder()); } @Override public String getResultantText() { StringBuilder stringBuilder = new StringBuilder(); //    for (Map.Entry<Float, TreeMap<Float, String>> stringMap: textMap.entrySet()) { //      for (Map.Entry<Float, String> entry: stringMap.getValue().entrySet()) { stringBuilder.append(entry.getValue()); } stringBuilder.append('\n'); } return stringBuilder.toString(); } @Override public void beginTextBlock() {} @Override public void renderText(TextRenderInfo renderInfo) { //   Float x = renderInfo.getBaseline().getStartPoint().get(Vector.I1); Float y = renderInfo.getBaseline().getStartPoint().get(Vector.I2); //           . if (!textMap.containsKey(y)) { textMap.put(y, new TreeMap<Float, String>()); } textMap.get(y).put(x, renderInfo.getText()); } @Override public void endTextBlock() {} @Override public void renderImage(ImageRenderInfo imageRenderInfo) {} //       y- ArrayList<Pair<Float, String>> getStringsWithCoordinates() { ArrayList<Pair<Float, String>> result = new ArrayList<Pair<Float, String>>(); for (Map.Entry<Float, TreeMap<Float, String>> stringMap: textMap.entrySet()) { StringBuilder stringBuilder = new StringBuilder(); for (Map.Entry<Float, String> entry: stringMap.getValue().entrySet()) { stringBuilder.append(entry.getValue()); } result.add(new Pair<Float, String>(stringMap.getKey(), stringBuilder.toString())); } return result; } }
      
      







рдФрд░ рдореБрдЦреНрдп рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



 public class TextExtractor { public static void main(String[] args) throws IOException { PdfReader reader = new PdfReader(args[0]); for (int i = 1; i <= reader.getNumberOfPages(); ++i) { TextExtractionStrategyImpl strategy = new TextExtractionStrategyImpl(); // ,           PdfTextExtractor.getTextFromPage(reader, i, strategy); System.out.println("Page : " + i); for (Pair<Float, String> pair: strategy.getStringsWithCoordinates()) { System.out.println(pair.getKey().toString() + " " + pair.getValue()); } } reader.close(); } }
      
      







рдиреЛрдЯ


рдмреЗрд╢рдХ, рдЕрдЪреНрдЫреЗ рдкрд╛рда рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд┐рдкреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдкрд╛рда рдХреЛ рдХрдИ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЖрджрд┐, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдРрд╕реЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ред



рдФрд░ рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╛рда рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдореМрдЬреВрджрд╛ рд╡рд╛рд▓реЗ (рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рд╕рд╣рд┐рдд) рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ (рдУрд╣ рдЗрд╕ рдПрдЬреАрдкреАрдПрд▓)



All Articles