如何使用 PdfDocument 绘制到 PDF 页面?
How do I draw to a PDF page using PdfDocument?
我的一个 Android Studio 活动有一个图表,我希望用户能够将其导出为 PDF 文件。我正在尝试使用内置的 PdfDocument,但发现很难在网上找到很多信息(除了 official docs)。
我可以创建空白文档没问题。我还可以使用 drawCircle 添加一个圆圈。
但是,我不确定如何使用我已有的 class 添加图表(而不是重新编码)。因此,我目前正在 DiagramFragment 中绘制图表如下(我已将其简化以显示要点):
public class DiagramFragment extends Fragment {
DiagramData mData;
Diagram mDiagram;
public DiagramFragment() {}
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
// Inflate layout, and find the Diagram element
View rootView = inflater.inflate(
R.layout.fragment_diagram, container, false);
mDiagram = rootView.findViewById(R.id.diagram);
if(mData != null) mDiagram.setDiagramData(mData);
drawDiagram();
return rootView;
}
}
(mData 包含描述图表的数组等,应在何处绘制线条,颜色等)
mDiagram class 是这样的:
public class Diagram extends View {
public ChartGrid(Context thisContext, AttributeSet attrs) {
super(thisContext, attrs);
// This sets up a few initial variables; nothing important
}
public void setDiagramData(DiagramData data) {
mData = data;
invalidate();
}
protected void onDraw(Canvas canvas) {
// Make sure mData is set before we draw
if (mData == null) return;
float canvas_height = getHeight();
// Set up canvas
canvas.save();
// Draw diagram
draw_diagram(canvas, canvas_height);
canvas.restore();
}
private void draw_chart(Canvas canvas, float height) {
Paint mPaint = new Paint();
if(mData == null) return;
for (int ii = 0; ii < mData.length(); ii++) {
mPaint.setColor(mData[ii].getColour());
canvas.drawRect(mData[ii].getXStart(),
mData[ii].getYStart(),
height, mData[ii].getYEnd(),
mPaint);
}
}
}
一切正常,并在相关 Activity 中显示图表。
但是,我想在 PDF 页面中显示它。我不知道如何在没有
的情况下使用 canvas
View rootView = inflater.inflate(
R.layout.fragment_diagram, container, false);
mDiagram = rootView.findViewById(R.id.diagram);
片段中存在。
到目前为止我已经(在此之前我已经检查了权限等;在此之后我关闭页面并写入文件等):
// Create document
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo
= new PdfDocument.PageInfo.Builder(100, 100, 1).create();
// Create Diagram Page
PdfDocument.Page page1 = document.startPage(pageInfo);
... I'm not sure what needs to go in here ...
// Finish Page 1
document.finishPage(page1);
谁能告诉我吗?谢谢你。
在这里回答您的评论...不知道这是否有帮助,但可以玩一下。
看起来如果你有一个 PdfDocument.Page
,你可以从中得到一个 Canvas
对象 (getCanvas()
)。一旦你有了它,你就可以用 View.draw(canvas)
.
将你的 View
画到 Canvas
上
我的一个 Android Studio 活动有一个图表,我希望用户能够将其导出为 PDF 文件。我正在尝试使用内置的 PdfDocument,但发现很难在网上找到很多信息(除了 official docs)。
我可以创建空白文档没问题。我还可以使用 drawCircle 添加一个圆圈。
但是,我不确定如何使用我已有的 class 添加图表(而不是重新编码)。因此,我目前正在 DiagramFragment 中绘制图表如下(我已将其简化以显示要点):
public class DiagramFragment extends Fragment {
DiagramData mData;
Diagram mDiagram;
public DiagramFragment() {}
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
// Inflate layout, and find the Diagram element
View rootView = inflater.inflate(
R.layout.fragment_diagram, container, false);
mDiagram = rootView.findViewById(R.id.diagram);
if(mData != null) mDiagram.setDiagramData(mData);
drawDiagram();
return rootView;
}
}
(mData 包含描述图表的数组等,应在何处绘制线条,颜色等)
mDiagram class 是这样的:
public class Diagram extends View {
public ChartGrid(Context thisContext, AttributeSet attrs) {
super(thisContext, attrs);
// This sets up a few initial variables; nothing important
}
public void setDiagramData(DiagramData data) {
mData = data;
invalidate();
}
protected void onDraw(Canvas canvas) {
// Make sure mData is set before we draw
if (mData == null) return;
float canvas_height = getHeight();
// Set up canvas
canvas.save();
// Draw diagram
draw_diagram(canvas, canvas_height);
canvas.restore();
}
private void draw_chart(Canvas canvas, float height) {
Paint mPaint = new Paint();
if(mData == null) return;
for (int ii = 0; ii < mData.length(); ii++) {
mPaint.setColor(mData[ii].getColour());
canvas.drawRect(mData[ii].getXStart(),
mData[ii].getYStart(),
height, mData[ii].getYEnd(),
mPaint);
}
}
}
一切正常,并在相关 Activity 中显示图表。
但是,我想在 PDF 页面中显示它。我不知道如何在没有
的情况下使用 canvasView rootView = inflater.inflate(
R.layout.fragment_diagram, container, false);
mDiagram = rootView.findViewById(R.id.diagram);
片段中存在。
到目前为止我已经(在此之前我已经检查了权限等;在此之后我关闭页面并写入文件等):
// Create document
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo
= new PdfDocument.PageInfo.Builder(100, 100, 1).create();
// Create Diagram Page
PdfDocument.Page page1 = document.startPage(pageInfo);
... I'm not sure what needs to go in here ...
// Finish Page 1
document.finishPage(page1);
谁能告诉我吗?谢谢你。
在这里回答您的评论...不知道这是否有帮助,但可以玩一下。
看起来如果你有一个 PdfDocument.Page
,你可以从中得到一个 Canvas
对象 (getCanvas()
)。一旦你有了它,你就可以用 View.draw(canvas)
.
View
画到 Canvas
上