В одном из моих действий в Android Studio есть диаграмма, которую я хочу, чтобы пользователь мог экспортировать в файл PDF. Я пытаюсь использовать встроенный PdfDocument, но мне трудно найти много информации в Интернете (кроме официальные документы).
Я без проблем могу создать пустой документ. Я также смог добавить к нему круг с помощью drawCircle.
Однако я не уверен, как добавить диаграмму, используя класс, который у меня уже есть (вместо того, чтобы кодировать все заново). Итак, в настоящее время я рисую диаграмму в 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 таков:
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);
}
}
}
Все это работает нормально и показывает диаграмму в соответствующем действии.
Однако я хочу показать это на странице PDF. Я не знаю, как заставить холст рисовать без
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);
Кто-нибудь может мне посоветовать? Спасибо.
В PDF есть и другие вещи, так что это не просто изображение. Я не уверен, как записать растровое изображение в PDF или представление Android в растровое изображение?
Ответьте на свой комментарий здесь ... Не знаю, будет ли это полезно, но с чем можно поиграть.
Похоже, если у вас есть PdfDocument.Page, вы можете получить от него объект Canvas (getCanvas()). Как только вы это сделаете, вы можете перенести свой View на Canvas с помощью View.draw(canvas).
Спасибо - я поиграю с этим и посмотрю, что смогу выяснить!
Хорошо, похоже, это правильный путь - мне нужно решить несколько проблем с макетом, но основной подход работает. Я в основном использовал Diagram diagram = new Diagram (getContext (), null); diagram.setData (mData); diagram.draw (page1.getCanvas ());
Если вы можете записать растровое изображение в документ PDF, вы можете записать представление Android в растровое изображение, а затем записать это растровое изображение в PDF. Я не думаю, что вы найдете способ перевести представление Android в PDF (по сути, представление представления в виде постскриптума). Вам нужно будет спросить, если все, что у вас получится, это PDF-файл со встроенным изображением, вы можете просто экспортировать изображение.