【问题标题】:create second pdf page if previous one is full如果上一个页面已满,则创建第二个 pdf 页面
【发布时间】:2022-03-08 21:51:42
【问题描述】:

我正在 A4 大小的应用程序中创建一个 pdf 文档,我想在该页面上绘制我的文本,但是当文本大得多时,它将覆盖页面的所有区域,而其余文本则没有在页面上绘制,所以如果我的第一页是创建另一个页面并在另一个页面上绘制其余文本,我想实现这一点。有人可以帮我吗?

我的代码是

public void create_Pdf_File(String text, String filename) {

    Typeface font = scanEditText.getTypeface();


    PdfDocument pdf_doc = new PdfDocument();

    try {

        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Scanned Documents/pdf file/";


        File pdf_dir = new File(path);

        if(!pdf_dir.exists())
            pdf_dir.mkdirs();


        File pdf_file = new File(pdf_dir,  filename + ".pdf");
        FileOutputStream fout = new FileOutputStream(pdf_file);

        PdfDocument.PageInfo pageInfo = new             PdfDocument.PageInfo.Builder(595, 842, 1).create();
        PdfDocument.Page page = pdf_doc.startPage(pageInfo);

        Paint myPaint = new Paint();
        myPaint.setTypeface(font);


        int x = 10, y = 25;


        for(String line : text.split("\n")) {

            page.getCanvas().drawText(line, x, y, myPaint);
            y += myPaint.descent() - myPaint.ascent();

        }

        pdf_doc.finishPage(page);
        pdf_doc.writeTo(fout);
        pdf_doc.close();

        Toast.makeText(this, "saved", Toast.LENGTH_SHORT).show();
    }

    catch(Exception e) {

        System.out.println(e);
        e.printStackTrace();
    }


}

【问题讨论】:

  • 发布您的代码块以创建 PDF 文档
  • 我已经提到上面的代码请帮助我
  • 在您的代码中,您有 page = pdf_doc.startPage(pageInfo) 和 pdf_doc.finishPage(page)。您是否尝试过完成上一页并在循环中创建一个新页面,y 位置变得足够低...
  • 如果文本很长,需要在文本限制结束时自动创建下一页或防止文本溢出,那么您可以做的是限制特定页面的字符数。首先,您必须根据该页面中的字符数划分长文本,循环并打印。 在我用示例代码解释如何处理它的地方查看我的答案。 stackoverflow.com/a/71394812/12552434

标签: android pdf document


【解决方案1】:

试试下面的 sn-p。读取代码之间的cmets

   //...
   //...
   int x = 10, y = 25;
   String[] lines = text.split("\n"); 
   for(int i = 0; i < lines.length; i++) {
        // Check if drawing is close to the end of page
        if(842 - y < 40)page = getNextPage(pdf_doc,page);
        page.getCanvas().drawText(lines[i], x, y, myPaint);
        y += myPaint.descent() - myPaint.ascent();
       //Check if last line in loop
       if(i == lines.length - 1) pdf_doc.finishPage(page); // Close last page
   }
   pdf_doc.writeTo(fout);
   pdf_doc.close();
   //...
   //...

辅助函数

    function PdfDocument.Page getNextPage(PdfDocument pdf_doc, PdfDocument.Page previous_page){
       pdf_doc.finishPage(previous_page); //Closes Previous page
       PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, 1).create(); 
       return pdf_doc.startPage(pageInfo); //Begins New page
    }

【讨论】:

  • 在 drawText 第一个参数中,您已经给出了行,所以这里的行是第 9 行,但您已将其声明为字符串数组。我应该给 line[i]
  • @Giddy Naya 假设我的文本没有任何下一行并且是连续的。那我将如何得到 MultiLine 或 multipage 问题?,即使我使用 StaticLayout 它解决了 multiline 而不是 multipage
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 2020-09-18
  • 2015-09-21
  • 2019-08-07
  • 2011-05-01
  • 1970-01-01
  • 2012-10-31
  • 2013-09-29
相关资源
最近更新 更多