2016-07-25 2 views
2

Я новичок в TIKA. Я пытаюсь преобразовать текстовые документы Microsoft в HTML с помощью Tika. Я использую TikaOnDotNet-оболочку для использования TIKA в .Net framework. Мой код конверсии выглядит следующим образом:конвертировать текстовые документы в HTML со встроенными изображениями от TIKA

 byte[] file = Files.toByteArray(new File(@"myPath\document.doc")); 
     AutoDetectParser tikaParser = new AutoDetectParser(); 

     ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     SAXTransformerFactory factory = (SAXTransformerFactory)TransformerFactory.newInstance(); 
     TransformerHandler handler = factory.newTransformerHandler(); 
     handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "html"); 
     handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes"); 
     handler.getTransformer().setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
     handler.setResult(new StreamResult(output)); 

     ExpandedTitleContentHandler handler1 = new ExpandedTitleContentHandler(handler); 

     tikaParser.parse(new ByteArrayInputStream(file), handler1, new Metadata()); 


     File ofile = new File(@"C:\toHtml\text.html"); 
     ofile.createNewFile(); 
     DataOutputStream stream = new DataOutputStream(new FileOutputStream(ofile)); 
     output.writeTo(stream); 

все работает хорошо, кроме встроенных изображений. Сгенерированный HTML содержит тег изображения, такой как:

<img src="embedded:image2.wmf" alt="image2.wmf"/> 

, но источник изображения не существует. Просьба сообщить мне

+2

Вы забыли установить соответствующий [EmbeddedDocumentExtractor] (http://tika.apache.org/1.13/api/org/apache /tika/extractor/EmbeddedDocumentExtractor.html) в 'ParseContext', чтобы указать, какие ресурсы нужно сохранить и где? – Gagravarr

+0

@Gagravarr Не могли бы вы привести мне пример? Я думаю, что это главная причина. – Mahdi

+2

У TikaCLI есть один, например [этот бит в Git] (https://github.com/apache/tika/blob/master/tika-app/src/main/java/org/apache/tika/cli/ TikaCLI.java # L1004) – Gagravarr

ответ

2

Кредиты идут на @Gagravarr.

Обратите внимание, что это простая реализация кода, исходные коды доступны в комментарии к вопросам.

Эта реализация основана на TikaOnDotNet обертке .....

public class DocToHtml 
{ 

    private TikaConfig config = TikaConfig.getDefaultConfig(); 
    public void Convert() 
    { 

     byte[] file = Files.toByteArray(new File(@"filename.doc")); 
     AutoDetectParser tikaParser = new AutoDetectParser(); 

     ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     SAXTransformerFactory factory = (SAXTransformerFactory)TransformerFactory.newInstance(); 
     var inputStream = new ByteArrayInputStream(file); 
     //   ToHTMLContentHandler handler = new ToHTMLContentHandler(); 
     var metaData = new Metadata(); 
     EncodingDetector encodingDetector = new UniversalEncodingDetector(); 
     var encode = encodingDetector.detect(inputStream, metaData) ?? new UTF_32(); 
     TransformerHandler handler = factory.newTransformerHandler(); 
     handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "html"); 
     handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes"); 
     handler.getTransformer().setOutputProperty(OutputKeys.ENCODING, encode.toString()); 
     handler.setResult(new StreamResult(output)); 

     ContentHandler imageRewriting = new ImageRewritingContentHandler(handler); 

     // ExpandedTitleContentHandler handler1 = new ExpandedTitleContentHandler(handler); 
     ParseContext context = new ParseContext(); 
     context.set(typeof(EmbeddedDocumentExtractor), new FileEmbeddedDocumentEtractor()); 

     tikaParser.parse(inputStream, imageRewriting, new Metadata(), context); 


     byte[] array = output.toByteArray(); 

     System.IO.File.WriteAllBytes(@"C:\toHtml\text.html", array); 

    } 


    private class ImageRewritingContentHandler : ContentHandlerDecorator 
    { 
     public ImageRewritingContentHandler(ContentHandler handler) : base(handler) 
     { 
     } 

     public override void startElement(string uri, string localName, string name, Attributes origAttrs) 
     { 
      if ("img".Equals(localName)) 
      { 
       AttributesImpl attrs; 
       if (origAttrs is AttributesImpl) 
        attrs = (AttributesImpl)origAttrs; 
       else 
        attrs = new AttributesImpl(origAttrs); 



       for (int i = 0; i < attrs.getLength(); i++) 
       { 
        if ("src".Equals(attrs.getLocalName(i))) 
        { 
         String src = attrs.getValue(i); 
         if (src.StartsWith("embedded:")) 
         { 
          var newSrc = src.Replace("embedded:", @"images\"); 

          attrs.setValue(i, newSrc); 
         } 
        } 
       } 
       attrs.addAttribute(null, "width", "width","width", "100px"); 
       base.startElement(uri, localName, name, attrs); 
      } 
      else 
       base.startElement(uri, localName, name, origAttrs); 
     } 
    } 

    private class FileEmbeddedDocumentEtractor : EmbeddedDocumentExtractor 
    { 
     private int count = 0; 
     public bool shouldParseEmbedded(Metadata m) 
     { 
      return true; 
     } 

     public void parseEmbedded(InputStream inputStream, ContentHandler contentHandler, Metadata metadata, bool outputHtml) 
     { 
      Detector detector = new DefaultDetector(); 
      string name = metadata.get("resourceName"); 
      MediaType contentType = detector.detect(inputStream, metadata); 
      if (contentType.getType() != "image") return; 
      var embeddedFile = name; 
      File outputFile = new File(@"C:\toHtml\images", embeddedFile); 
      try 
      { 
       using (FileOutputStream os = new FileOutputStream(outputFile)) 
       { 
        var tin = inputStream as TikaInputStream; 
        if (tin != null) 
        { 
         if (tin.getOpenContainer() != null && tin.getOpenContainer() is DirectoryEntry) 
         { 
          POIFSFileSystem fs = new POIFSFileSystem(); 

          fs.writeFilesystem(os); 
         } 
         else 
         { 
          IOUtils.copy(inputStream, os); 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 
     } 
    } 
} 
Смежные вопросы