繁体   English   中英

保存到外部存储时,Android PdfDocument已损坏

[英]Android PdfDocument damaged when saved to external storage

我正在尝试使用Androids原生PdfDocument类(来自api 19)创建一个简单的PDF文档。 我想要的是拥有一个XML布局文件,例如名为pdf_doc.xml ,然后在创建PDF时对其进行充气。 pdf_doc.xml中,我会有一堆可以在代码中获取的视图,然后单独绘制到PdfDocuments页面上。 问题是,这会创建一个损坏的PDF文件。

另一方面,如果我只是创建一个简单的TextView,在我的main_activity.xml (创建PDF时我正在使用的活动的xml)中使用TextView,它可以正常工作。

为什么TextView来自膨胀的布局还是活动的布局会有所不同? 我试图以错误的方式做到这一点吗?

仅供参考:以编程方式创建TextView时也会失败。

以下是我的源代码。 这两个函数在彼此之后立即调用。 第一个创建PDF,另一个保存。 问题在于视图,称为内容 ,即从膨胀的布局中获取。 如果我把TextView放在Activity的XML中然后从活动中获取它,就像这个act.findViewById(R.id.pdf_text); 然后按预期工作。

码:

    public static PdfDocument createPdf(Activity act){
        PrintAttributes printAttrs = new PrintAttributes.Builder().
                setColorMode(PrintAttributes.COLOR_MODE_COLOR).
                setMediaSize(PrintAttributes.MediaSize.ISO_A4).
                setMinMargins(PrintAttributes.Margins.NO_MARGINS).
                build();

        ViewGroup mainLayout = (ViewGroup) View.inflate(act, R.layout.pdf_doc, null);

        int pageHeight = printAttrs.getMediaSize().getHeightMils() / 1000 * 72;
        int pageWidth = printAttrs.getMediaSize().getWidthMils() / 1000 * 72;

        PdfDocument document = new PrintedPdfDocument(act, printAttrs);
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, 1).create();
        PdfDocument.Page page = document.startPage(pageInfo);

        View content = mainLayout.findViewById(R.id.pdf_text);
        content.draw(page.getCanvas());
        document.finishPage(page);

        return document;
    }

    public static void saveFile(PdfDocument doc){
        String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
        File myDir = new File(root + "/pdf_test");
        myDir.mkdirs();

        File file = new File(myDir, "test.pdf");

        if (file.exists()) {
            file.delete();
        }

        try {
            FileOutputStream out = new FileOutputStream(file);
            doc.writeTo(out);
            doc.close();
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        String path = file.getAbsolutePath();
        Log.d("pdftest", "path: " + path);
    }

两个建议:

  1. 由于你的mainLayout将具有零高度和零宽度(你没有将它膨胀为父级),尝试通过按顺序调用它上面的measure()layout()来手动将其放置。 您需要指定希望布局大小的像素大小。

  2. out.flush()out.close()之前调用out.getFd().sync() out.close() 我怀疑这是在这里造成你的具体问题,但这是一个好主意,不太可能受到伤害。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM