【问题标题】:I am not able to create two pages of pdf using PdfDocument of Android我无法使用 Android 的 PdfDocument 创建两页 pdf
【发布时间】:2021-08-24 03:33:35
【问题描述】:

开发者!我正在使用 PdfDocument 尝试将文本保存为 pdf 文件。所以我写了这段代码:

 public void Convert(String text, String fileName){
    PdfDocument myPdfDocument = new PdfDocument();
    PdfDocument.PageInfo myPageInfo = new PdfDocument.PageInfo.Builder(this.pageWidth,this.pageHeight,this.pageNumber).create();
    PdfDocument.Page myPage = myPdfDocument.startPage(myPageInfo);

    Paint myPaint = new Paint();
    Paint backPaint = new Paint();
    backPaint.setColor(this.backgroundcolor);
    myPaint.setTextSize(this.textSize);
    myPaint.setColor(this.fontcolor);

    //To find size of screen so that line is perfectly fit
    DisplayMetrics dm = this.context.getResources().getDisplayMetrics();
    int widthOfScreen = dm.widthPixels;
    int periodForSplittingText = widthOfScreen / Math.round(this.textSize);

    // To make line split in width of the screen here;
    String insert = "\n";
    
    StringBuilder builder = new StringBuilder(
     text.length() + insert.length() * (text.length()/periodForSplittingText)+1);

    int index = 0;
    String prefix = "";
    while (index < text.length()){
        builder.append(prefix);
        prefix = insert;
        builder.append(text.substring(index, Math.min(index + periodForSplittingText, text.length())));
        index += periodForSplittingText;
       
    }
    
    


    String myString = builder.toString();

    for (String line:myString.split("\n")){
        myPage.getCanvas().drawPaint(backPaint);
        myPage.getCanvas().drawText(line, this.x, this.y, myPaint);
        y+=myPaint.descent()-myPaint.ascent();
        
    }
    myPdfDocument.finishPage(myPage);

// Started another page 
myPdfDocument.startPage(myPageInfo);
myPage.getCanvas().drawText("Second Page Text", 14, 25, myPaint);
myPdfDocument.finishPage(myPage);



    String myFilePath = Environment.getExternalStorageDirectory().getPath() + this.filePath + "/" + fileName;
    File myFile = new File (myFilePath);
    try {
        myPdfDocument.writeTo(new FileOutputStream(myFile));

    } catch (Exception e) {
        e.printStackTrace();
    }
    
    myPdfDocument.close();
}

但是,如果我输入了长文本,则无法在两页上创建它。根据 Android 开发者的

该类允许从原生 Android 内容生成 PDF 文档。您创建一个新文档,然后为要添加的每个页面开始一个页面,将内容写入页面,然后完成页面。完成所有页面后,将文档写入输出流并关闭文档。文档关闭后,您不应再使用它。请注意,页面是一页一页创建的,也就是说,在任何给定时间,您只能拥有一个正在写入的页面。这个类不是线程安全的。

但我不明白这是什么意思? 我该如何解决这个问题?帮助

编辑: 现在添加这个

// Started another page 
myPdfDocument.startPage(myPageInfo);
myPage.getCanvas().drawText("Second Page Text", 14, 25, myPaint);
myPdfDocument.finishPage(myPage);

导致此错误:尝试在空对象引用上调用虚拟方法 'void android.graphics.Canvas.drawText(java.lang.String, float, float, android.graphics.Paint)'

【问题讨论】:

  • 在您引用的文本之外,它说 请注意页面是一个接一个创建的 - 因此,如果您可以创建一个页面,那么您只需这样做就可以创建两个页面再次。
  • @ScaryWombat myPdfDocument.startPage(myPageInfo); myPage.getCanvas().drawText("希望第二页有效", this.x , this.y , myPaint); myPdfDocument.finishPage(myPage);我这样做了,但它显示尝试在空对象引用上调用虚拟方法。
  • 请完整显示您的错误。
  • @ScaryWombat 这是错误:尝试在 null 上调用虚拟方法 'void android.graphics.Canvas.drawText(java.lang.String, float, float, android.graphics.Paint)'对象引用。
  • 不要使用堆栈跟踪编辑您的问题。没有人愿意阅读格式错误的 cmets 来尝试了解您在哪里拥有 NPE。老实说,这甚至可能与您提出的问题无关。

标签: java android android-layout pdf pdfdocument


【解决方案1】:

当您开始一个新页面时,您并没有将其分配给变量

改成

// Started another page 
myPage = myPdfDocument.startPage(myPageInfo);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多