如何关闭PDF文件以重新创建它? (正在使用文件) [英] How to close a PDF file to recreate it? (File in use)

查看:123
本文介绍了如何关闭PDF文件以重新创建它? (正在使用文件)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有可以创建PDF文件的Java应用程序.因此,例如,我从程序中创建了一个简单的文件,并构建了代码以同时打开该文件. 因此,我创建了文件,看到了它,然后就可以了. 如果要修改该文件,则必须关闭该文件然后重新创建它;如果不关闭该文件,则会出现此错误:

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)

这是我用来创建PDF的代码

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

错误在此行

OutputStream os = new FileOutputStream(f);

我该如何解决?

推荐答案

您需要关闭文件.该问题类似于尝试删除或重命名已打开的文件:如果您使用的是Windows,Windows将显示此错误:

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:

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

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.

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

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).

注意

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

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.

这篇关于如何关闭PDF文件以重新创建它? (正在使用文件)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆