2017-02-18 1 views
0

Mon but est de convertir pdf en xhtml de sorte que les images incorporées peuvent être liées correctement dans le code HTML.Extrait TIFF incorporé dans TIKA 1.12 vs TIKA 1.14

Le code ci-dessous fonctionne dans TIKA 1.12 mais pas 1.14. Il semble que le problème est que dans 1.12, PDFBox 1.8 a été utilisé, et dans 1.14, PDFBox 2.0 est utilisé.

En 1.14, j'obtiens des erreurs de police et des erreurs tiff, par ex.

WARN org.apache.pdfbox.pdmodel.font.PDSimpleFont - No Unicode mapping for g74 (103) in font HFKECA+TimesNewRoman 

ERROR org.apache.pdfbox.tools.imageio.ImageIOUtil - No ImageWriter found for 'tif' format 

De divers forums et en regardant la source TIKA il semblait que je devais inclure jai_imageio.jar à mon chemin pour les tiff. Cela n'a pas arrêté les erreurs. J'ai aussi essayé d'ajouter ce qui suit avec elle et l'échanger avec jai-imageio-core-1.3.1.jar (la version github):

jempbox-1.8.13.jar 
fontbox-2.0.4.jar 
levigo-jbig2-imageio-1.6.5.jar 

Encore une fois, aucun de ces pots semblait faire quoi que ce soit. Cependant, l'utilisation du pot TIKA 1.12 lui-même donne des résultats parfaits.

Que dois-je faire pour que TIKA 1.14 fonctionne sans ces avertissements (comme le fait la TIKA 1.12)?

/** 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
* http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package org.apache.tika.example; 


import java.io.IOException; 
import java.io.InputStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.io.FileWriter; 
import java.io.PrintWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStreamWriter; 
import java.io.BufferedWriter; 
import java.nio.charset.Charset; 

import org.apache.tika.config.TikaConfig; 
import org.apache.tika.detect.Detector; 
import org.apache.tika.exception.TikaException; 
import org.apache.tika.extractor.EmbeddedDocumentExtractor; 
import org.apache.tika.extractor.ParsingEmbeddedDocumentExtractor; 
import org.apache.tika.io.FilenameUtils; 
import org.apache.tika.metadata.Metadata; 
import org.apache.tika.mime.MediaType; 
import org.apache.tika.mime.MimeTypeException; 
import org.apache.tika.parser.AutoDetectParser; 
import org.apache.tika.parser.ParseContext; 
import org.apache.tika.parser.Parser; 
import org.apache.tika.sax.BodyContentHandler; 
import org.xml.sax.ContentHandler; 
import org.xml.sax.SAXException; 

import org.apache.tika.sax.ToXMLContentHandler; 
import org.apache.tika.parser.pdf.PDFParserConfig; 

public class ExtractEmbeddedFiles { 

    private Parser parser = new AutoDetectParser(); 
    private Detector detector = ((AutoDetectParser)parser).getDetector(); 
    private TikaConfig config = TikaConfig.getDefaultConfig(); 

    public void extract(String inputPath) throws SAXException, TikaException, IOException { 

    File inputFile = new File(inputPath); 
    String parentDirectory = inputFile.getAbsoluteFile().getParentFile().getPath(); 

    InputStream inputStream = new FileInputStream(inputFile); 
    File outputDirectory = new File(parentDirectory, inputFile.getName() + "-extracted"); 


    Parser parser = new AutoDetectParser(); 
    ToXMLContentHandler handler = new org.apache.tika.sax.ToXMLContentHandler(); 

    PDFParserConfig pdfConfig = new PDFParserConfig(); 
    pdfConfig.setExtractInlineImages(true); 

    ParseContext parseContext = new ParseContext(); 

    parseContext.set(PDFParserConfig.class, pdfConfig); 
    parseContext.set(Parser.class, parser); 

    EmbeddedDocumentExtractor ex = new MyEmbeddedDocumentExtractor(outputDirectory.toPath(), parseContext); 
    parseContext.set(EmbeddedDocumentExtractor.class, ex); 

    Metadata metadata = new Metadata(); 

    parser.parse(inputStream, handler, metadata, parseContext); 

    String text = handler.toString().trim(); 

    File outputFile = new File(outputDirectory, inputFile.getName() + ".xhtml"); 


    PrintWriter printer = new PrintWriter(new BufferedWriter (new OutputStreamWriter(
     new FileOutputStream(outputFile.getPath() ), 
     Charset.forName("UTF-8").newEncoder() 
))); 
    printer.print(text); 
    printer.close(); 

    } 

    private class MyEmbeddedDocumentExtractor extends ParsingEmbeddedDocumentExtractor { 
    private final Path outputDir; 
    private int fileCount = 0; 

    private MyEmbeddedDocumentExtractor(Path outputDir, ParseContext context) { 
     super(context); 
     this.outputDir = outputDir; 
    } 

    @Override 
    public boolean shouldParseEmbedded(Metadata metadata) { 
     return true; 
    } 

    @Override 
    public void parseEmbedded(InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml) 
     throws SAXException, IOException { 

     //try to get the name of the embedded file from the metadata 
     String name = metadata.get(Metadata.RESOURCE_NAME_KEY); 

     if (name == null) { 
     name = "file_" + fileCount++; 
     } else { 
     //make sure to select only the file name (not any directory paths 
     //that might be included in the name) and make sure 
     //to normalize the name 
     name = FilenameUtils.normalize(FilenameUtils.getName(name)); 
     } 

     //now try to figure out the right extension for the embedded file 
     MediaType contentType = detector.detect(stream, metadata); 

     if (name.indexOf('.')==-1 && contentType!=null) { 
     try { 
      name += config.getMimeRepository().forName(
      contentType.toString()).getExtension(); 
     } catch (MimeTypeException e) { 
      e.printStackTrace(); 
     } 
     } 
     //should add check to make sure that you aren't overwriting a file 
     Path outputFile = outputDir.resolve(name); 

     //do a better job than this of checking 
     Files.createDirectories(outputFile.getParent()); 
     Files.copy(stream, outputFile); 
    } 
    } 
} 
+1

Exécutez 'System.out.println (Arrays.toString (ImageIO.getReaderFormatNames()));' Au début, qu'est-ce que vous obtenez? –

+0

avec TIKA 1.12 et 1.14 je reçois '[JPEG 2000, JPG, jpg, JPEG2000, tiff, bmp, BMP, GIF, GIF, WBMP, PNG, PNG, RAW, JPEG, PNM, PNM, tif, TIF, TIFF, jpeg2000, wbmp, jpeg, jpeg 2000] ' –

+0

Prochaine chose à essayer: 1)' System.out.println (ImageIO.getImageWritersByFormatName ("tif"). Next()); '2) créer un BufferedImage, puis appelez 'ImageIOUtil.write (bim," tif ", nouveau FileOutputStream (....), 72,1);' cela produit-il un fichier? Si cela ne donne pas un indice, je voudrais essayer votre code ... est-ce que cela arrive avec n'importe quel PDF ou seulement avec certains? –

Répondre

0

C'est bizarre, mais il semble maintenant fonctionner avec la combinaison suivante des bibliothèques:

  • tika-app-1.14.jar
  • jai_imageio.jar

Il se peut que le problème était que j'utilisais initialement une bibliothèque différente pour ImageIO. Il existe un variety of jai libraries available from Java, dont un seul est la bibliothèque ci-dessus.

J'ai également essayé ce GitHub library.

Il se peut qu'aucun d'eux n'ait fonctionné à l'exception de celui ci-dessus, mais je suis réticent à faire une telle affirmation.