Рисование содержимого PDF-файла на холсте

Мое приложение для Android создает многостраничные файлы PDF программно с помощью PdfDocument:

public byte[] buildPDF() {
    int pageWidth = Math.round(8.5f * 72f);
    int pageHeight = Math.round(11.0f * 72f);
    int margin = Math.round(.5f * 72f);
    int fontSize = 12;

    TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
    textPaint.setColor(Color.BLACK);
    textPaint.setTextSize(fontSize);
    textPaint.setTypeface(Typeface.DEFAULT_BOLD);

    PdfDocument document = new PdfDocument();
    PdfDocument.Page page = null;
    Canvas canvas = null;

    for (int i=0; i<10; i++) {
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, document.getPages().size()).create();
        page = document.startPage(pageInfo);
        canvas = page.getCanvas();

        String content = "Content for page " + (i + 1);
        canvas.drawText(content, margin, margin + fontSize, textPaint);
        document.finishPage(page);
    }

    byte[] output = new byte[0];
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    try {
        document.writeTo(outputStream);
    } catch (Exception e) {
        Log.d("buildPDF", "error writing PDF output");
        return output;
    }
    output = outputStream.toByteArray();
    document.close();

    return output;
}

В некоторых случаях я хочу поместить существующий файл PDF с локального устройства на эту серию страниц. Самый простой рабочий процесс - каким-то образом открыть файл PDF как данные, а затем записать его на холст. Есть ли способ сделать это с помощью Android SDK?

Это легко сделать в iOS, используя CGPDFDocumentRef и CGContextDrawPDFPage, но я не нашел эквивалента для Android.

Если нет встроенного способа, то похоже, что пакет multipdf в Apache PDFBox может выполнить эту работу. Однако мне нужны данные в памяти, как показано выше, поэтому я думаю, что для этого потребуется записать сгенерированные данные во временный файл, выполнить операции с временным файлом и затем прочитать данные обратно в память.

0
0
1 892
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

My Android app is generating multi-page PDF files programmatically using PdfDocument:

Обратите внимание, что PdfDocument предназначен для использования с печатью, а не для создания произвольных файлов PDF.

The easiest workflow would be to somehow open the PDF file as data, then write it to the canvas. Is there any way to do this with the Android SDK?

Нет извините.

Я не понимаю комментарий о печати. Я использую его так же, как описано в документации: developer.android.com/reference/android/graphics/pdf/…

arlomedia 06.04.2018 19:54

@arlomedia: Классы в android.graphics.pdf предназначены для печати, а не для работы с произвольными файлами PDF. По общему признанию, PdfDocument с большой долей вероятности генерирует PDF-файлы, которые могут использоваться любыми другими инструментами. Напротив, PdfRenderer не работает с большим количеством файлов PDF. Я хочу сказать, что многие разработчики предполагают, что Android имеет полную поддержку обработки PDF, а это не так.

CommonsWare 06.04.2018 20:06

CommonsWare ответила на мой конкретный вопрос (SDK не может этого сделать), но вот еще немного информации о сторонних инструментах, которые могут:

  1. Я попробовал Apache PDFBox, но потом понял, что он несовместим с Android. Затем я нашел PdfBox-Android и попытался установить его, но столкнулся с серией проблем сборки, начиная с «Количество файлов Dex не может превышать 64000 ....» Я потратил несколько часов, пытаясь собрать это, прежде чем я почувствовал, что я на погоню за дикими гусями, и я двинулся дальше.

  2. iTextG часто встречается в подобных ситуациях, но я всегда следовал правилу, что если компания-производитель программного обеспечения не указывает цены на своем веб-сайте, я не могу себе этого позволить. Я пошел дальше и отправил запрос цены, но они переправили мой запрос торговому посреднику, а затем ответ торгового посредника попал в мою папку со спамом, и я не увидел его, пока не стало слишком поздно. Их стоимость была не такой высокой, как я опасался, но все же не очень осуществимо, учитывая относительно небольшую роль PDF-файлов в моем приложении.

  3. Я уже использую Радаи PDF в качестве средства просмотра PDF в своем приложении, и я понял, что он включает в себя некоторые функции редактирования и объединения документов. Я не мог заставить это работать со старой версией библиотеки, которую я использовал, но с некоторой помощью их технической поддержки я смог обновить свой проект для текущей версии, и это сработало. Для этого требуется лицензия Premium, но они предлагают структуру ценообразования с фиксированной оплатой, которая не была недоступна для моего проекта.

Итак, я потратил большую часть недели, занимаясь сторонними библиотеками и решая проблемы совместимости, но как только это было запущено, мне потребовалось всего 14 строк кода, чтобы получить нужную мне функциональность. Это отличный пример того, почему так сложно оценить время разработки программного обеспечения ... LOL.

Другие вопросы по теме