如何关闭PDF文件以重新创建它? (正在使用的文件)

我有可以创建PDF文件的Java应用程序。 所以例如,我从我的程序创建一个简单的文件,我已经构建了代码来打开文件。 所以我创建了文件,我看到它然后就可以了。 如果我想修改该文件,我必须关闭此文件然后重新创建它,如果我没有关闭文件我有这个错误:

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.(FileOutputStream.java:221) at java.io.FileOutputStream.(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) 

这是我用来创建PDF的代码

 public static void stampaEtichette(String percorsoOperazione, ListlistaArticoli, 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 

错误就在这条线上

 OutputStream os = new FileOutputStream(f); 

我该如何修理它?

您需要关闭该文件。 问题类似于尝试删除或重命名打开的文件:如果您在Windows上工作,Windows将显示以下错误:

在此处输入图像描述

您遇到了完全相同的问题:在这种情况下,我尝试在Windows资源管理器中重命名名为hello.pdf的文件。 但是,由于文件是在Adobe Acrobat中打开的,因此无法完成此操作。 诸如Adobe Reader和Adobe Acrobat之类的工具需要随机文件访问该文件,因此将锁定该文件,以便其他进程无法删除,重写,重命名该文件。

解决方案也显示在对话框中: 关闭文件,然后重试 。 您正在尝试做一些不可能的事情(这与您使用iText无关或限制)。

注意

在处理iText项目时,我遇到了您经常遇到的同样问题:我编写了一些代码,运行它,查看生成的PDF,更改代码,运行它,然后获得相同的exception。 为避免这种情况,我经常创建名称中包含时间戳的文件。 例如hello-20150411163400.pdf ,然后当我在30秒后运行相同的代码时hello-20150411163430.pdf等等(根据当前日期和时间创建文件名)。 这样,我可以避免这种exception。

即使在程序结束后,程序中的流也会打开。 您可以先关闭流然后重新打开,以便下次使用该流。 例如,您需要在最后一个catch块的末尾添加finally块,并在其中关闭您正在使用的流。

 finally{ os.close(); } 

接下来,您需要添加用于“编辑”目的的代码,您可以再次打开流以读取先前的文件(通过提供创建文件的路径)。 请记住再次关闭流。