首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android中新的PDF页面创建比预期的要多。

Android中新的PDF页面创建比预期的要多。
EN

Stack Overflow用户
提问于 2020-08-02 09:40:42
回答 1查看 282关注 0票数 0

在我的应用程序中,用户可以通过将PDF作为对象添加到ArrayList中来为PDF创建新页面。然后,由for循环管理新的页面创建,迭代ArrayList中的每个对象,并将其打印到新页面。

但是当我打开已经创建的PDF时,我似乎得到了一个‘平方’页面数量。例如,我创建2页,我得到4,我创建3页,我得到9页等等

我认为这与我的for循环有关,但我看不见。有人能看看我的密码吗?

代码语言:javascript
运行
复制
    public class MainActivity extends AppCompatActivity {

private EditText firstEditText;
ArrayList<PDFPageModel> pageModelArrayList = new ArrayList<>();


@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    firstEditText = findViewById(R.id.firstEditText);
    //request permissions (I won't need this part)
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PackageManager.PERMISSION_GRANTED);

    //clear array memory each time you onCreate
    pageModelArrayList.clear();
}

public void addObjectToList(View view){
    //create new object
    PDFPageModel pdfPageModel = new PDFPageModel();

    //add stuff to object from edit text and set type
    pdfPageModel.setPageData(firstEditText.getText().toString().trim());
    pdfPageModel.setType("Text");

    pageModelArrayList.add(pdfPageModel);

    Toast.makeText(MainActivity.this, "Text added", Toast.LENGTH_LONG).show();
}

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void createMyPDF(View view){
    //done in 3 parts
    //1. creation of PDF document, 2. writing to the document, 3. save document to folder

    //1. PDF Document Creation
    PdfDocument pdfDocument = new PdfDocument();

    //2.
    //for loop for ArrayList new page
    for (int i=0; i < pageModelArrayList.size(); i++){
        for(PDFPageModel filledData : pageModelArrayList){
            filledData.getPageData();
            filledData.getType();

            if(filledData.getType() == "Text"){
                //create a page info description
                PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, i+1).create();

                //start a page
                PdfDocument.Page page = pdfDocument.startPage(pageInfo);

                //writing to new page
                Paint paint = new Paint();

                //canvas used to write to page, getting object data from inputted text
                String myString = filledData.getPageData();

                //setting where to start text on the page
                int x = 10, y = 25;

                //multi line loop
                for(String line:myString.split("\n")){
                    page.getCanvas().drawText(line, x, y, paint);
                    y+=paint.descent()-paint.ascent();
                }
                //finish page
                pdfDocument.finishPage(page);
            }else {
                Toast.makeText(MainActivity.this, "Object Type not text", Toast.LENGTH_LONG).show();
            }
        }
    }

    //3. saving to folder
    
    String myFilePath = String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));

    String fileName = "/myNewPDF-TEST.pdf";


    //create folder to be saved in
    File myFile = new File(myFilePath + "/PDFTestStorage");
    if(!myFile.exists()){
        myFile.mkdirs();
    }

    //new file
    File file = new File(myFile, fileName);

    //save document
    try {
        pdfDocument.writeTo(new FileOutputStream(file));
        Toast.makeText(MainActivity.this, "File Created", Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(MainActivity.this, "Error: File not created", Toast.LENGTH_LONG).show();
    }

    //close pdf doc
    pdfDocument.close();


}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-02 10:04:37

只需移除最外层的for循环,即替换:

代码语言:javascript
运行
复制
for (int i=0; i < pageModelArrayList.size(); i++){
    for(PDFPageModel filledData : pageModelArrayList){
        filledData.getPageData();
        filledData.getType();

        if(filledData.getType() == "Text"){
            //create a page info description
            PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, i+1).create();

            //start a page
            PdfDocument.Page page = pdfDocument.startPage(pageInfo);

            //writing to new page
            Paint paint = new Paint();

            //canvas used to write to page, getting object data from inputted text
            String myString = filledData.getPageData();

            //setting where to start text on the page
            int x = 10, y = 25;

            //multi line loop
            for(String line:myString.split("\n")){
                page.getCanvas().drawText(line, x, y, paint);
                y+=paint.descent()-paint.ascent();
            }
            //finish page
            pdfDocument.finishPage(page);
        }else {
            Toast.makeText(MainActivity.this, "Object Type not text", Toast.LENGTH_LONG).show();
        }
    }
}

通过以下方式:

代码语言:javascript
运行
复制
    int i=0;
    for(PDFPageModel filledData : pageModelArrayList){
        filledData.getPageData();
        filledData.getType();

        if(filledData.getType() == "Text"){
            //create a page info description
            PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, i+1).create();

            //start a page
            PdfDocument.Page page = pdfDocument.startPage(pageInfo);

            //writing to new page
            Paint paint = new Paint();

            //canvas used to write to page, getting object data from inputted text
            String myString = filledData.getPageData();

            //setting where to start text on the page
            int x = 10, y = 25;

            //multi line loop
            for(String line:myString.split("\n")){
                page.getCanvas().drawText(line, x, y, paint);
                y+=paint.descent()-paint.ascent();
            }
            //finish page
            pdfDocument.finishPage(page);
        }else {
            Toast.makeText(MainActivity.this, "Object Type not text", Toast.LENGTH_LONG).show();
      i++
            }

应该能让你离解决问题更近一步。您所描述的平方行为几乎肯定来自嵌套循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63214480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档