How to close a PDF file to recreate it? (File in u

2020-04-28 06:48发布

I have the Java application that can create a PDF file. So for example, I create a simple file from my program, I have build the code to open also the file. So I create the file, I see it and then it is ok. If I want to modify that file, I must close this file then re-create it, if I don't close the file I have this error:

java.io.FileNotFoundException: Archivio_Etichette\_12-4-2015.pdf (Impossibile accedere al file. Il file è utilizzato da un altro processo)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
    at com.mcsolution.easyMgmt.print.pdf.FoglioFattura.stampaEtichette(FoglioFattura.java:2215)
    at Etichette.PanelBigliettiAdesivi.stampaEtichette(PanelBigliettiAdesivi.java:242)
    at Etichette.PanelBigliettiAdesivi$1.actionPerformed(PanelBigliettiAdesivi.java:273)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    at java.awt.Component.processMouseEvent(Component.java:6516)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at java.awt.Component.processEvent(Component.java:6281)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4872)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4698)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4698)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

This is the code that I used to create PDF

public static void stampaEtichette(String percorsoOperazione, 
            List<Articoli>listaArticoli,
            Integer numeroCella,boolean aprire)throws DocumentException
{
    String folderName = DateUtil.getDataGiornaliera();
    percorsoOperazione = (new StringBuilder()).append(percorsoOperazione).append(""+"_"+folderName).append(".pdf").toString();
    File f = new File(percorsoOperazione);
    try {

        OutputStream os = new FileOutputStream(f);
        Document doc = new Document(PageSize.A4, -74F, -74F, 0F, 0F);
        PdfWriter docWriter = PdfWriter.getInstance(doc, os);
        //  String testo = "Anagrafica Clienti";
        doc.open();
        float[] ciccio = {25f,25f,25f,25f};
        PdfPTable table = new PdfPTable(ciccio);
        table.setSpacingAfter(0f);
        table.setSpacingBefore(0f);

        PdfContentByte cb = docWriter.getDirectContent();
        if(numeroCella!=null){
            for(int i=1; i< numeroCella;i++){
                Paragraph Descrizione = new Paragraph("", FontFactory.getFont("Century Gothic", 7F, Font.BOLD));
                Paragraph Costo = new Paragraph("", FontFactory.getFont("Century Gothic", 10F, Font.BOLD));

                PdfPCell cell = new PdfPCell();
                cell.setVerticalAlignment(5);
                cell.setHorizontalAlignment(1);
                cell.setColspan(1);
                cell.setFixedHeight(84.1F); 
                cell.setBorderWidth(0.0F);
                cell.setPadding(0F);

                Descrizione.setAlignment(1);
                cell.addElement(Descrizione);

                Costo.setAlignment(1);
                cell.addElement(Costo);

                table.addCell(cell);
            }
        }


        doc.add(table);
        doc.close();
        os.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch(IOException exp)
    {
        exp.printStackTrace();
    }
    catch(DocumentException exp2)
    {
        exp2.printStackTrace();
    }

    if(aprire)
    {
        if(Desktop.isDesktopSupported())
        {
            try
            {
                Desktop.getDesktop().open(f.getCanonicalFile());
            }
            catch(IOException ex)
            {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        } else
        {
            JOptionPane.showMessageDialog(null, "Non è stato trovato un software per aprire i file PDF.", "Errore", 0);
        }
    }

    //  return pathimg;

}//fine stampa etichette

The error is on this line

OutputStream os = new FileOutputStream(f);

How can I fixed it?

标签: java pdf itext
2条回答
够拽才男人
2楼-- · 2020-04-28 07:22

The stream in your program is open even after reaching the end of the program. You can start by closing the stream then reopening for next use of the stream. You will need to add a finally block at the end of your last catch block and inside that close the streams that you are using, for example.

finally{
 os.close();
}

Next, you will need to add code for "editing" purpose where you can open the stream again to read the earlier file (by giving the path to the created file). Remember to close the stream again.

查看更多
你好瞎i
3楼-- · 2020-04-28 07:26

You need to close the file. The problem is similar to trying to delete or rename a file that is open: if you're working on Windows, Windows will show this error:

enter image description here

You are experiencing the exact same problem: in this case, I tried to rename a file called hello.pdf in Windows Explorer. However, this action could not be completed because the file was open in Adobe Acrobat. Tools such as Adobe Reader and Adobe Acrobat need random file access to the file and will therefore lock that file so that no other process can remove, rewrite, rename that file.

The solution is also shown in the dialog box: Close the file and try again. You are trying to do something that is impossible (and that is not related or limited to you using iText).

Note

When working on an iText project, I experience the same problem you describe very often: I write some code, run it, look at the resulting PDF, change the code, run it, and then get the same exception you get. To avoid this, I often create files that have a timestamp in their name. E.g. hello-20150411163400.pdf, and then when I run the same code 30 seconds later hello-20150411163430.pdf and so on (the filename is created based on the current date and time). This way, I can avoid that exception.

查看更多
登录 后发表回答