我正在尝试使用Android的本地PdfDocument类(来自API 19)创建一个简单的PDF文档。我想要的是有一个名为pdf_doc.xml的XML布局文件,然后在创建PDF时进行充气。 在pdf_doc.xml内部,我将有一堆视图可以在代码中获取,然后单独绘制到PdfDocuments页面上。 问题是,这会创建一个损坏的PDF文件。
另一方面,如果我只是在我的main_activity.xml中创建一个简单的TextView(即我创建PDF时使用的活动的XML),并使用该TextView,则可以正常工作。
为什么从充气布局或活动布局获得TextView会有差别呢? 我的做法是否错误?
FYI:当以编程方式创建TextView时,它也会失败。
以下是我的源代码。这两个函数在彼此之后立即调用。问题出现在名为content的视图中,我从充气布局中获取它。 如果我将该TextView放入Activity的XML中,然后从activity获取它,如下所示
代码:
另一方面,如果我只是在我的main_activity.xml中创建一个简单的TextView(即我创建PDF时使用的活动的XML),并使用该TextView,则可以正常工作。
为什么从充气布局或活动布局获得TextView会有差别呢? 我的做法是否错误?
FYI:当以编程方式创建TextView时,它也会失败。
以下是我的源代码。这两个函数在彼此之后立即调用。问题出现在名为content的视图中,我从充气布局中获取它。 如果我将该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);
}