Как рисовать на странице PDF с помощью PdfDocument?

В одном из моих действий 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);

Кто-нибудь может мне посоветовать? Спасибо.


person Sharon    schedule 06.11.2018    source источник
comment
Если вы можете записать растровое изображение в документ PDF, вы можете записать представление Android в растровое изображение, а затем записать это растровое изображение в PDF-файл. Я не думаю, что вы найдете способ перевести представление Android в PDF (по сути, представление представления в виде постскриптума). Вы должны спросить, хотя, если все, что у вас есть, это PDF-файл со встроенным изображением, вы можете просто экспортировать изображение.   -  person Jeffrey Blattman    schedule 06.11.2018
comment
В PDF есть и другие материалы, так что это не просто изображение. Я не уверен, как записать растровое изображение в PDF или представление Android в растровое изображение?   -  person Sharon    schedule 06.11.2018


Ответы (1)


Ответьте на свой комментарий здесь... Не знаю, будет ли это полезно, но есть с чем поиграть.

Похоже, если у вас есть PdfDocument.Page, вы можете получить из него объект Canvas (getCanvas()). Как только вы это сделаете, вы можете нарисовать View на Canvas с помощью View.draw(canvas).

person Jeffrey Blattman    schedule 06.11.2018
comment
Спасибо - я поиграю с этим и посмотрю, что я могу понять! - person Sharon; 06.11.2018
comment
Хорошо, похоже, это путь - мне нужно решить несколько проблем с макетом, но основной подход работает. В основном я использовал Diagram chart = new Diagram(getContext(), null); диаграмма.setData(mData); диаграмма.draw(page1.getCanvas()); - person Sharon; 07.11.2018