无法删除使用itext pdf库创建的pdf文件

时间:2015-09-14 18:54:14

标签: java pdf itext

我正在使用IText pdf库(itextpdf.com/)为我用java编写的项目创建pdf文件。

问题是:我在我的方法的结果创建2个pdfs,我想删除第一个,但似乎我的第一个pdf文件由于某种原因无法删除。我尝试过使用File.delete(),将File.delete()放在" finally {}"阻止......似乎没什么用。

我确信我关闭了FileOutsputStream并执行了document.close()!如何删除此文件?

public boolean gerarPDFDeStringVariosArquivosSemNumeroDePaginasComId(LinkedList < String > textosLidos, LinkedList < String > nomesDosArquivosLidos, File arquivoPdfOutput) {
    try {
        nomesDosArquivosLidosESeusIds = new HashMap < String, String > ();
        FileOutputStream fos = new FileOutputStream(arquivoPdfOutput);
        Document document = new Document();
        PdfWriter.getInstance(document, fos);
        document.open();
        addMetaData(document);
        addTitlePage(document);
        for (int i = 0; i < textosLidos.size(); i++) {
            String umTextoLido = textosLidos.get(i);
            String umNomeArquivoLido = nomesDosArquivosLidos.get(i);
            String idUmNomeArquivoLido = "#%&#" + "id_" + i + "#%&#";
            this.nomesDosArquivosLidosESeusIds.put(umNomeArquivoLido, idUmNomeArquivoLido);
            String umNomeArquivoLidoEIdDele = idUmNomeArquivoLido + " \n" + umNomeArquivoLido; //o id servirah para sabermos quantas paginas o arquivo possui no pdf
            String textoLido2 = umTextoLido.replaceAll("\\t", "        ");

            addContent(document, textoLido2, umNomeArquivoLidoEIdDele);
        }
        document.close();
        fos.close();


        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

public boolean gerarPDFDeStringVariosArquivosComNumeroDePaginas(LinkedList < String > textosLidos, LinkedList < String > nomesDosArquivosLidos, File arquivoPdfOutput, File arquivoPdfOutputComNumeroDePaginas) {
    /*primeiro vou executar gerarPDFDeStringVariosArquivosSemNumeroDePaginas para gerar um pdf com os 
     * ids de cada arquivo, seus textos, mas sem o numero de paginas e vou alterar a variavel local this.nomesDosArquivosLidosESeusIds
     */
    boolean conseguiGerarPrimeiroPdf = gerarPDFDeStringVariosArquivosSemNumeroDePaginasComId(textosLidos, nomesDosArquivosLidos, arquivoPdfOutput);

    if (conseguiGerarPrimeiroPdf == true) {
        //agora vou pegar quantas paginas os arquivos tem
        VerificaNumeroDePaginasDeCadaArquivoNoPdfGerado verificaNumeroDePaginas = new VerificaNumeroDePaginasDeCadaArquivoNoPdfGerado();
        HashMap < String, Integer > arquivosEQuantasPaginasElesTem = verificaNumeroDePaginas.pegarNumeroDePaginasNoPdfDeCadaArquivo(this.nomesDosArquivosLidosESeusIds, nomesDosArquivosLidos, Main.FILE);

        //agora comeco a criar o segundo pdf que terah o numero de paginas de cada arquivo
        try {
            FileOutputStream fos = new FileOutputStream(arquivoPdfOutputComNumeroDePaginas);
            Document document = new Document();
            PdfWriter.getInstance(document, fos);
            document.open();
            addMetaData(document);
            addTitlePage(document);
            for (int i = 0; i < textosLidos.size(); i++) {
                String umTextoLido = textosLidos.get(i);
                String umNomeArquivoLido = nomesDosArquivosLidos.get(i);

                int quantasPaginasTemOArquivoLido = arquivosEQuantasPaginasElesTem.get(umNomeArquivoLido);
                String umNomeArquivoLidoEPaginas;

                if (quantasPaginasTemOArquivoLido > 1) {
                    umNomeArquivoLidoEPaginas = umNomeArquivoLido + " (" + quantasPaginasTemOArquivoLido + " páginas)";
                } else {
                    umNomeArquivoLidoEPaginas = umNomeArquivoLido + " (" + quantasPaginasTemOArquivoLido + " página)";
                }
                String textoLido2 = umTextoLido.replaceAll("\\t", "        ");

                addContent(document, textoLido2, umNomeArquivoLidoEPaginas);
            }
            document.close();
            fos.close();
            arquivoPdfOutput.delete();

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    } else {
        return false;
    }

}

我这样做是为了测试:

File arquivoPdfGerar = new File(Main.FILE);
File arquivopdfGerarComNumeroDePaginas = new File(Main.FILE2);
/*PrintStream ps = new PrintStream(fileOutputStream);
              System.setOut(ps);*/
LinkedList < String > nomesArquivosLidos = new LinkedList < String > ();
LinkedList < String > textosArquivosLidos = new LinkedList < String > ();
String url = "C:/Users/fábioandrews/Documents/git/PdfGeneratorForSoftwareRegistration/PdfGeneratorForSoftwareRegistration/src/br/ufrn/pairg/pdfgenerator/FirstPDF.java";
String nomeProjeto = "PdfGeneratorForSoftwareRegistration";
String arquivoLido = LeitorArquivoTexto.lerArquivoQualquerDeTexto(url);
String nomeArquivoLido = LeitorArquivoTexto.pegarNomeArquivo(url, nomeProjeto);
nomesArquivosLidos.add(nomeArquivoLido);
textosArquivosLidos.add(arquivoLido);
url = "C:/Users/fábioandrews/Documents/git/PdfGeneratorForSoftwareRegistration/PdfGeneratorForSoftwareRegistration/src/br/ufrn/pairg/pdfgenerator/Main.java";
nomeProjeto = "PdfGeneratorForSoftwareRegistration";
arquivoLido = LeitorArquivoTexto.lerArquivoQualquerDeTexto(url);
nomeArquivoLido = LeitorArquivoTexto.pegarNomeArquivo(url, nomeProjeto);
nomesArquivosLidos.add(nomeArquivoLido);
textosArquivosLidos.add(arquivoLido);

GeraPDFDeStringVariosArquivos geradorPdf = new GeraPDFDeStringVariosArquivos();
geradorPdf.gerarPDFDeStringVariosArquivosComNumeroDePaginas(textosArquivosLidos, nomesArquivosLidos, arquivoPdfGerar, arquivopdfGerarComNumeroDePaginas);

2 个答案:

答案 0 :(得分:0)

以下几行怎么样?

 PdfWriter.getInstance(document, fos);

恕我直言,这个方法/行

  • 在您的代码中看起来没用,因为我找不到对它返回的对象(PdfWriter)的任何引用。
  • 如果此行可以删除,只需执行此操作; - )
  • 如果没有,你必须
    • 暂停 PdfWriter对象返回。
    • 关闭它(在 finally 块中,因为它也应该为FileOutputStream和“Document”实例完成。)

注意:此评论是根据我正在使用的版本5.5.6进行的。

如果您仍有问题,可以插入this little tool(由 Jenkins 的autor创建)。他救了我一个ooooold计划。

答案 1 :(得分:0)

感谢您的所有答案。解决方案就在Bruno Lowagie所说的地方:当我正在阅读pdf文件以计算那里有多少页时,我没有关闭pdfreader,因此该文件仍在使用中。

谢谢大家的回答^^