Создание PDF-файлов из представления с изображениями из сетевого URL-адреса в Android - PullRequest
0 голосов
/ 27 мая 2018

Я создаю файл PDF с использованием собственных библиотек PDF (android.graphics.pdf.PdfDocument)

документ должен содержать заголовок, представляющий собой статическое изображение, несколько текстовых представлений и RecyclerView скуча изображений,

все, за исключением просмотра реселлера, отображается правильно,

представление рециркулятора использует библиотеку Glide для загрузки изображений, но они не загружены и не отображаются, я попытался предварительно выбрать их, используябиблиотека, но она также ничего не делает,

вот код для создания pdf

    public File createPDF(PostDB postDB) {
    int addition = 0;
    String postDBContent = postDB.getContent();
    if (postDBContent != null) {
        int estimatedLineCount = postDBContent.length() / 43;
        String[] lines = postDBContent.split("\r\n|\r|\n");
        estimatedLineCount += lines.length;
        addition = (estimatedLineCount - 43) * 60;
    }


    List<String> imagesUrls = postDB.getImagesUrls();
    for (String url : imagesUrls) {
        Glide.with(context).load(url).preload();
    }


    try {
        FileOutputStream fOut = context.openFileOutput(LOCAL_PATH, Context.MODE_PRIVATE);
        PdfDocument document = new PdfDocument();
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(1800, 3900 + addition + 1000, 1).create();
        PdfDocument.Page page = document.startPage(pageInfo);
        Canvas canvas = page.getCanvas();
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View content;
        if (inflater != null) {
            final int[] count = {0};
            content = inflater.inflate(R.layout.pdf_layout, null);
            ButterKnife.bind(this, content);
            publisherTextView.setText(postDB.getAuthor());
            Date date = new Date(postDB.getDate());
            DateFormat dateFormat = DateFormat.getInstance();
            String format = dateFormat.format(date);
            dateTextView.setText(format);
            titleTextView.setText(postDB.getTitle());
            contentPreviewTextView.setText(postDBContent);
            recyclerViewImages.setLayoutManager(new GridLayoutManager(context, 2));
            recyclerViewImages.setAdapter(new PDFImageAdapter(postDB.getImagesUrls()));
            String text = postDB.getCity() + ", " + postDB.getCountry();
            location.setText(text);
            int measureWidth = View.MeasureSpec.makeMeasureSpec(page.getCanvas().getWidth(), View.MeasureSpec.EXACTLY);
            int measuredHeight = View.MeasureSpec.makeMeasureSpec(page.getCanvas().getHeight(), View.MeasureSpec.EXACTLY);
            content.measure(measureWidth, measuredHeight);
            content.layout(0, 0, page.getCanvas().getWidth(), page.getCanvas().getHeight());
            content.draw(canvas);

        }
        document.finishPage(page);
        document.writeTo(fOut);
        document.close();
        fOut.close();
        return new File(context.getFilesDir().getPath() + "/" + LOCAL_PATH);
    } catch (IOException e) {
        Log.i("error", e.getLocalizedMessage());
        return null;
    }
}

вот мой код для привязки ViewHolders

 public void setData(String url) {
    Glide.with(imageView.getContext()).load(url)
            .listener(new RequestListener<Drawable>() {
                @Override
                public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                    Timber.d("onLoadFailed");
                    return true;
                }

                @Override
                public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                    Timber.d("onResourceReady");
                    return true;
                }
            })
            .into(imageView);
}

данныхМетод onBind вызывается и вызывает метод setData.но ни один обратный вызов от Glide никогда не вызывается.

1 Ответ

0 голосов
/ 25 июня 2018

Я использую библиотеку iText для решения этой проблемы,

вот код, который я использую для добавления изображений, например.таким образом, вам не нужны никакие представления.

Rectangle pageSize = PageSize.A4;
Document document = new Document();
PdfWriter.getInstance(document, context.openFileOutput(LOCAL_PATH, Context.MODE_PRIVATE));
document.open();
 document.setPageSize(pageSize);
   document.addCreationDate();
   document.addAuthor(context.getString(R.string.pdf_creator));
   document.addCreator(context.getString(R.string.pdf_creator));
Image image = Image.getInstance(filename);
   image.scaleToFit(300f, 150f);
   image.setAbsolutePosition(absoluteX, absoluteY);
   document.add(image);
document.close();
...