【问题标题】:How do I draw to a PDF page using PdfDocument?如何使用 PdfDocument 绘制到 PDF 页面?
【发布时间】:2018-11-06 19:39:48
【问题描述】:

我的一个 Android Studio 活动有一个图表,我希望用户能够将其导出为 PDF 文件。我正在尝试使用内置的 PdfDocument,但发现很难在网上找到很多信息(official docs 除外)。

我可以创建空白文档没有问题。我还可以使用 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 文档,您可以将您的 Android 视图写入位图,然后将该位图写入 PDF。我认为您不会找到将 Android 视图转换为 PDF 的方法(本质上是视图的后记表示)。你不得不问,如果你最终得到的只是一个带有嵌入图像的 PDF,你还不如只导出图像。
  • PDF 中还有其他内容,因此不仅仅是图像。我不确定如何将位图写入 PDF,或将 Android 视图写入位图?

标签: android android-pdf-api


【解决方案1】:

在此处回答您的评论...不知道这是否会有所帮助,但可以尝试一下。

看起来如果你有一个PdfDocument.Page,你可以从中得到一个Canvas 对象(getCanvas())。一旦你有了它,你可以用View.draw(canvas)将你的View画到Canvas上。

【讨论】:

  • 谢谢 - 我会尝试一下,看看我能弄清楚什么!
  • 好的,这似乎是要走的路——我有一些布局问题要解决,但基本方法是有效的。我基本上用过 Diagram diagram = new Diagram(getContext(), null);图.setData(mData);图.draw(page1.getCanvas());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2011-12-30
  • 2018-11-22
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多