gpt4 book ai didi

java - Android PdfDocument 在保存到外部存储时损坏

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:27 28 4
gpt4 key购买 nike

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

另一方面,如果我只是在我的 main_activity.xml(我在创建 PDF 时使用的 Activity 的 xml)中创建一个简单的 TextView,并改为使用该 TextView,它工作正常。

为什么 TextView 来自膨胀布局或 Activity 布局会有所不同?我想以错误的方式做到这一点吗?

仅供引用:以编程方式创建 TextView 时它也会失败。

下面是我的源代码。这两个函数彼此紧接着调用。第一个创建 PDF,另一个保存它。问题出在名为 content 的 View 中,它是从膨胀的布局中获取的。如果我改为将该 TextView 放在 Activity 的 XML 中,然后从 Activity 中获取它,就像这样 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() .我怀疑这是否会导致您的具体问题,但这是个好主意,不太可能造成伤害。

关于java - Android PdfDocument 在保存到外部存储时损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33940687/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com