【问题标题】:Getting IOException while creating PDF using IText with android使用带有 android 的 IText 创建 PDF 时出现 IOException
【发布时间】:2014-09-08 09:33:49
【问题描述】:

我在尝试使用 Itext 创建 PDF 时遇到 IOException。 该错误表明我正在尝试写入只读存储,因为我已在清单文件中添加了所需的权限。

我正在使用 Cordova 3.5

代码如下:

public class PdfCreator {
String TAG = "PdfCreator";

public void createPdf(){
    try {
        Log.d(TAG, Environment.getExternalStorageDirectory().getPath() + "/Hello.pdf");            
        OutputStream file = new FileOutputStream(new File(Environment.getExternalStorageDirectory().getPath() + "/Hello.pdf"));            
        Document document = new Document();
        PdfWriter.getInstance(document, file); 
        document.open();
        document.add(new Paragraph("Hello world, iText"));
        document.close();
        file.close();

    } catch (Exception e) {

        e.printStackTrace();
    }
}

股权追踪:

09-08 05:15:42.501: W/System.err(1114): java.io.FileNotFoundException: /storage/sdcard/Hello.pdf:          open failed: EROFS (Read-only file system)
09-08 05:15:42.531: W/System.err(1114):     at libcore.io.IoBridge.open(IoBridge.java:409)
09-08 05:15:42.531: W/System.err(1114):     at java.io.FileOutputStream.<init>     (FileOutputStream.java:88)
09-08 05:15:42.581: W/System.err(1114):     at java.io.FileOutputStream.<init>   (FileOutputStream.java:73)
09-08 05:15:42.581: W/System.err(1114):     at com.idsil.pdfapp.PdfCreator.createPdf(PdfCreator.java:19)
09-08 05:15:42.581: W/System.err(1114):     at com.idsil.pdfapp.PdfApp.onCreate(PdfApp.java:36)
09-08 05:15:42.581: W/System.err(1114):     at android.app.Activity.performCreate(Activity.java:5133)
09-08 05:15:42.581: W/System.err(1114):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-08 05:15:42.581: W/System.err(1114):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
09-08 05:15:42.581: W/System.err(1114):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
09-08 05:15:42.591: W/System.err(1114):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
09-08 05:15:42.591: W/System.err(1114):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
09-08 05:15:42.631: W/System.err(1114):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-08 05:15:42.631: W/System.err(1114):     at android.os.Looper.loop(Looper.java:137)
09-08 05:15:42.658: W/System.err(1114):     at android.app.ActivityThread.main(ActivityThread.java:5103)
09-08 05:15:42.661: W/System.err(1114):     at java.lang.reflect.Method.invokeNative(Native Method)
09-08 05:15:42.661: W/System.err(1114):     at java.lang.reflect.Method.invoke(Method.java:525)
09-08 05:15:42.661: W/System.err(1114):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-08 05:15:42.661: W/System.err(1114):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-08 05:15:42.661: W/System.err(1114):     at dalvik.system.NativeStart.main(Native Method)
09-08 05:15:42.691: W/System.err(1114): Caused by: libcore.io.ErrnoException: open failed: EROFS (Read-only file system)
09-08 05:15:42.691: W/System.err(1114):     at libcore.io.Posix.open(Native Method)
09-08 05:15:42.691: W/System.err(1114):     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
09-08 05:15:42.691: W/System.err(1114):     at libcore.io.IoBridge.open(IoBridge.java:393)

感谢任何帮助。

提前致谢。

【问题讨论】:

  • 您是否在清单中提供了android.permission.WRITE_EXTERNAL_STORAGE"
  • 是的,我已经给了它。在我的 AVD 的文件资源管理器中,它显示 storage/sdcard/ 具有 dr-xr-xr-x 等权限。它没有写权限,但我不明白为什么会这样。

标签: java android pdf cordova


【解决方案1】:

试试这个,

Environment.getExternalStorageDirectory().getAbsolutePath()+"/Hello.pdf"

use .getAbsolutePath() instead of .getPath()..

以这种方式创建文件,

InputStream input = null;
OutputStream output = null;

File folder = new File("/sdcard", "hellofolder");
folder.mkdirs();

File myFile = new File("/sdcard/hellofolder/hello.pdf");
output = new FileOutputStream(myFile);

Mainfest.xml

将此添加为 Manifest 的子项

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

或一次尝试使用真实设备或创建一个新的模拟器并将 SD 卡大小设置为 200 及以上,

【讨论】:

  • 谢谢@Rajesh M,我试过 .getAbsolutePath() 但它没有用。 storage/sdcard/ 似乎没有写权限。我该如何改变这个。
  • 我认为你没有创建文件夹,第一次创建文件夹然后写入文件,我已经更新了代码,检查它
  • 我也试过这个,它不会创建文件夹,因为 sdcard 文件夹是只读的。我不知道为什么。它有权限 dr-xr-xr-x。
  • 一旦尝试使用真机或创建新的模拟器并将 SD 卡大小设置为 200 及以上,
  • 感谢@Rajesh M 创建了一个新的模拟器。问题出在旧设备的 sdcard 的权限上。
【解决方案2】:

试试这个
eString filePath = context.getFilesDir().getPath().toString() + "/Hello.pdf"; File f = new File(filePath); OutputStream file = new FileOutputStream(f);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多