Java закрыть PDF ошибка

У меня есть этот код Java:

try {
    PDFTextStripper pdfs = new PDFTextStripper();

    String textOfPDF = pdfs.getText(PDDocument.load("doc"));

    doc.add(new Field(campo.getDestino(),
            textOfPDF,
            Field.Store.NO,
            Field.Index.ANALYZED));

} catch (Exception exep) {
    System.out.println(exep);
    System.out.println("PDF fail");
}

И бросает это:

11:45:07,017 WARN  [COSDocument] Warning: You did not close a PDF Document

И я не знаю, почему, но бросить это 1, 2, 3 или больше.

Я обнаружил, что COSDocument является классом и имеет метод close(), но я нигде не использую этот класс.

У меня есть этот импорт:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

Спасибо :)


person bonsai    schedule 11.02.2011    source источник
comment
Если проблема решена, отметьте ответ как принятый.   -  person skaffman    schedule 14.02.2011
comment
Тип ресурса PDDocument не реализует java.lang.AutoCloseable, поэтому мы не можем использовать try с ресурсом для текущего сценария.   -  person shashi mishra    schedule 16.01.2019
comment
Возможно, вы используете старую версию PDFBox. В версии 2.0.13 это Closeable, расширяющий AutoCloseable. Кстати, это не ответ.   -  person Tilman Hausherr    schedule 17.01.2019


Ответы (3)


Вы загружаете PDDocument, но не закрываете его. Я подозреваю, что вам нужно сделать:

String textOfPdf;
PDDocument doc = PDDocument.load("doc");
try {
    textOfPdf = pdfs.getText(doc);
} finally {
    doc.close();
}
person Jon Skeet    schedule 11.02.2011
comment
Спасибо, Джон Скит, этот код решил проблему на 100%, спасибо :) - person bonsai; 14.02.2011
comment
@Jon Skeet Я использую pdfbox в программировании .net, я закрываю «doc», но ошибка все еще есть! что я могу сделать? - person AmirHossein; 23.07.2013
comment
@AmirHossein: похоже, тебе следует задать новый вопрос. - person Jon Skeet; 23.07.2013

Просто тоже была эта проблема. С Java 7 вы можете сделать это:

try(PDDocument document = PDDocument.load(input)) {
  // do something  
} catch (IOException e) {
  e.printStackTrace();
}

Поскольку PDDocument implements Closeable, блок try автоматически вызовет свой метод close() в конце.

person Benjamin M    schedule 06.07.2015
comment
кстати, попытка с ресурсами существует с Java 7. - person danny; 12.06.2017

Это предупреждение выдается, когда PDF-документ завершен и не закрыт.

Вот метод finalize из Документ COS:

/**
 * Warn the user in the finalizer if he didn't close the PDF document. The method also
 * closes the document just in case, to avoid abandoned temporary files. It's still a good
 * idea for the user to close the PDF document at the earliest possible to conserve resources.
 * @throws IOException if an error occurs while closing the temporary files
 */
protected void finalize() throws IOException
{
    if (!closed) {
        if (warnMissingClose) {
            log.warn( "Warning: You did not close a PDF Document" );
        }
        close();
    }
}

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

person dogbane    schedule 11.02.2011
comment
Спасибо, собачий яд, но я не знаю, не понимаю ли я твой ответ. В любом случае, я не использую COSDocument ни в одной кодовой строке, поэтому не думаю, что это проблема... :) - person bonsai; 14.02.2011
comment
@bonsai Метод PDDocument.load создает PDDocument, в основе которого лежит COSDocument. Таким образом, вы неявно используете COSDocument, который необходимо закрыть. Если вы закроете PDDocument, базовый COSDocument тоже закроется. - person dogbane; 14.02.2011