3

这段代码有什么问题...我正在尝试解析 pdf 文件并从中提取文本...但是对于某些 pdf 我能够提取文本...对于某些它会引发错误

Invalid dictionary, found: '' but expected: '/'
org.apache.tika.exception.TikaException: Unexpected RuntimeException from org.apache.tika.parser.pdf.PDFParser@67fb878

而且对于某些pdf,我也没有在md变量中获得任何元数据值……但是对于某些人,我明白了……

这是我的代码..!! ByteArray 有问题??

    private BinaryParser binaryParser;
    binaryParser.parse(page.getBinaryData());


    public void parse(byte[] data) {
            InputStream is = null;
            try {
                is = new ByteArrayInputStream(data);
                text = null;
                Metadata md = new Metadata();
                metaData = new HashMap<String, String>();
                text = tika.parseToString(is, md).trim();
                processMetaData(md);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(is);
            }
        }

private void processMetaData(Metadata md){
        if ((getMetaData() == null) || (!getMetaData().isEmpty())) {
            setMetaData(new HashMap<String, String>());
        }
        for (String name : md.names()){
            getMetaData().put(name.toLowerCase(), md.get(name));
        }
    }
4

1 回答 1

5

蒂卡并不完美。许多 PDF 文件都会出现问题(除非去年发生了很大变化)。确保您使用的是 Tika 的更新版本。当我使用 Tika 时,它是 0.8 版(9 个月前)。此版本存在一个错误,导致 PDF 解析特别成问题。我通过使用 Apache Tika 包装的 PDFBox 回避了这个问题。如果您决定尝试这条路线,本文末尾有一些我的代码包装了 PDFBox。

如果不出意外,直接使用 PDFBox 可以让您更好地控制参数。一个这样的参数是处理“串珠”文本。例如,有专栏的报纸是串珠的,而一封信则没有。PDFBox 可以尝试保持写作的流畅,但它并不总是做得很好。如果您不从非串珠 PDF 中提取文本,您可能需要禁用此功能。

您可能还想尝试pdftotext程序。再次确保您拥有最新版本。使用所有 PDF 到文本转换器,性能随版本而迅速变化!

import org.apache.pdfbox.util.PDFTextStripper;

PDFTextStripper stripper = new PDFTextStripper;

public static String pdfbox(InputStream is, Writer writer) throws IOException, ConversionException {
        Boolean force = true;

        PDDocument document = null;
        try {
            document = PDDocument.load(is, force); // force extraction

            stripper.setForceParsing(force); // continue when errors are encountered.
            stripper.setSortByPosition(false); // text may not be in visual order.
            stripper.setShouldSeparateByBeads(true); // beads are columns, attempt to handle them.

            stripper.writeText(document, writer);
        }
        finally {
            try {
                if (document != null) {
                    document.close();
                }
            }
            catch (Exception e) {
                throw new ConversionException(e);
            }
        }
    }
于 2011-09-16T05:06:01.847 回答