Подтвердить что ты не робот

Android: PdfDocument создает пустой файл pdf

        PdfDocument document = new PdfDocument();
        // crate a page description
        PageInfo pageInfo = new PageInfo.Builder(300, 300, 1).create();
        // create a new page from the PageInfo
        Page page = document.startPage(pageInfo);
        // repaint the user text into the page
        View content = findViewById(R.id.textarea);
        content.draw(page.getCanvas());
        // do final processing of the page
        document.finishPage(page);
        try {
             File f = getPDFPath();
             FileOutputStream fos = new FileOutputStream(f);
             document.writeTo(fos);
             document.close();
             fos.close();

        } catch (IOException e) {
            throw new RuntimeException("Error generating file", e);
        }

Где findViewById(R.id.textarea); относится к TextView с некоторым текстом, но приведенный выше код генерирует только пустой pdf. В чем может быть проблема?

есть ли какая-либо ссылка, которая имеет рабочий пример генерации pdf с использованием собственного API-интерфейса Android?

4b9b3361

Ответ 1

У меня есть, но после большого теста я понимаю, что мой View был с 0 heigth и 0 width, так как я использовал TextView. Поэтому мне удалось дождаться загрузки (TextView) и после начала создания документа взглянуть на код, надеюсь, вы его исправите:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_main);

     final TextView tv = (TextView) findViewById(R.id.textView1);
        ViewTreeObserver vto = tv.getViewTreeObserver(); 
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
            @Override 
            public void onGlobalLayout() { 
                Toast.makeText(MainActivity.this, tv.getWidth() + " x " + tv.getHeight(), Toast.LENGTH_LONG).show();    

                try {
                    File file1 = new File("/mnt/sdcard/test/");
                    if(!file1.exists()){
                        file1.mkdirs();
                    }

                    File file = new File("/mnt/sdcard/test", "filename"+System.currentTimeMillis()+".pdf");
                    PrintAttributes printAttrs = new PrintAttributes.Builder().
                            setColorMode(PrintAttributes.COLOR_MODE_COLOR).
                            setMediaSize(PrintAttributes.MediaSize.ISO_A4).
                            setResolution(new Resolution("zooey", PRINT_SERVICE, 450, 700)).
                            setMinMargins(Margins.NO_MARGINS).
                            build();
                    PdfDocument document = new PrintedPdfDocument(MainActivity.this, printAttrs);
                     PageInfo pageInfo = new PageInfo.Builder(450, 700, 1).create();
                     Page page = document.startPage(pageInfo);

                     if (page != null) {

                           View view = findViewById(R.id.textView1);//getContentView();                          
                           view.layout(0, 0, view.getWidth(),
                                   view.getHeight());
                           Log.i("draw view", " content size: "+view.getWidth()+" / "+view.getHeight());
                           view.draw(page.getCanvas());
                           // Move the canvas for the next view.
                           page.getCanvas().translate(0, view.getHeight());
                       }    

                     document.finishPage(page);
                     os = new FileOutputStream(file);
                            document.writeTo(os);
                            document.close();
                            os.close();
                            Log.i("done", file.getAbsolutePath().toString());

                        } catch (IOException e) {
                            throw new RuntimeException("Error generating file", e);
                        }

                tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } 
        });

}

магия внутри:

 final TextView tv = (TextView) findViewById(R.id.textView1);
        ViewTreeObserver vto = tv.getViewTreeObserver(); 
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
            @Override 
            public void onGlobalLayout() { 
         // create document here
} 
        });

Ответ 2

Если кто-то создает макет на лету и не имеет привязки к действию или фрагменту, который получает визуализацию и измерение в какой-то момент жизненного цикла активности или фрагмента, существует другой подход:

rootView.measure(800, 480);
rootView.layout(0, 0, 800, 480);

Таким образом, ширина и высота вашего корневого элемента не останутся 0, и в документе будет что-то, что будет показано. Предоставлено ответ здесь!

Ответ 3

Примером, который мне больше всего помог, является тот, который можно найти в Android Cookbook Вы можете найти соответствующий код в своей github account.

Смешайте этот код с тем, который вы пишете, и вы его получите:

@TargetApi(Build.VERSION_CODES.KITKAT)
public void run() {
    // Create a shiny new (but blank) PDF document in memory
    // We want it to optionally be printable, so add PrintAttributes
    // and use a PrintedPdfDocument. Simpler: new PdfDocument().
    PrintAttributes printAttrs = new PrintAttributes.Builder().
            setColorMode(PrintAttributes.COLOR_MODE_COLOR).
            setMediaSize(PrintAttributes.MediaSize.NA_LETTER).
            setResolution(new PrintAttributes.Resolution("zooey", PRINT_SERVICE, 300, 300)).
            setMinMargins(PrintAttributes.Margins.NO_MARGINS).
            build();
    PdfDocument document = new PrintedPdfDocument(this, printAttrs);
    // crate a page description
    PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(300, 300, 1).create();
    // create a new page from the PageInfo
    PdfDocument.Page page = document.startPage(pageInfo);
    // repaint the user text into the page
    View content = findViewById(R.id.textArea);
    content.draw(page.getCanvas());
    // do final processing of the page
    document.finishPage(page);
    // Here you could add more pages in a longer doc app, but you'd have
    // to handle page-breaking yourself in e.g., write your own word processor...
    // Now write the PDF document to a file; it actually needs to be a file
    // since the Share mechanism can't accept a byte[]. though it can
    // accept a String/CharSequence. Meh.
    try {
        File f = new File(Environment.getExternalStorageDirectory().getPath() + "/pruebaAppModerator.pdf");
        FileOutputStream fos = new FileOutputStream(f);
        document.writeTo(fos);
        document.close();
        fos.close();            
    } catch (IOException e) {
        throw new RuntimeException("Error generating file", e);
    }
}

Ответ 4

У меня была такая же проблема, но для того, чтобы реализовать решение @user2021505 (это работает), я должен был сделать главный рефактор, поэтому я решил проблему таким образом

// ...
PdfDocument.Page page = document.startPage(pageInfo);

TextView textView = new TextView(ctx);
textView.setText("1,2,3");

// here the solution
int left = 0;
int top = 0;
int width = 200;
int height = 200;
textView.layout(0,0,width,height);

canvas.save()
canvas.translate(left,top);

textView.draw(page.getCanvas());

canvas.restore()