Существует теоретический и практический ответ на этот вопрос.
Начнем с теоретического ответа. Там есть класс Java называется PrintStream
, что позволяет отправить OutputStream
на принтер:
Printstream
расширяет FilterOutputStream
расширяет OutputStream
PrintStream
добавляет функциональность к другому потоку вывода, а именно способность печатать представления различных данных. Также имеются две другие функции. В отличие от других выходных потоков, a PrintStream
никогда не выбрасывает IOException
; вместо этого, исключительные ситуаций просто устанавливают внутренний флаг, который может быть протестирован с помощью метода checkError
. Необязательно, PrintStream
может быть создан для заподлицо автоматически; это означает, что метод flush автоматически , вызываемый после записи байтового массива, записывается один из методов println: или символ новой строки или байта ('\n'
).
Итак, предположим, что вы хотели бы создать PDF в памяти и записать его на принтер, вы могли бы сделать что-то вроде этого:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
Document document = new Document();
PdfWriter.getInstance(document, ps);
document.open();
// add content
document.close();
Как PrintStream
расширяет OutputStream
и, как PdfWriter
принимает любые тип OutputStream
, вы пишете PDF-байты на принтер, и если вы хотите использовать байты PDF, вы можете сделать baos.toByteArray()
.
Однако фрагмент кода выше отправляет PDF-байты на принтер. Скорее всего, что ваш принтер не понимает PDF и просто печатает такие вещи, как:
PDF-1.4
%âãÏÓ
2 0 obj
<</Length 64/Filter/FlateDecode>>stream
*binary stuff*
endstream
endobj
4 0 obj
<</Parent 3 0 R/Contents 2 0 R/Type/Page/Resources<</Font<</F1 1 0 R>>>>
/MediaBox[0 0 595 842]>>
endobj
1 0 obj
<</BaseFont/Helvetica/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>>
endobj
3 0 obj
<</Type/Pages/Count 1/Kids[4 0 R]>>
endobj
5 0 obj
<</Type/Catalog/Pages 3 0 R>>
endobj
6 0 obj
<</Producer(iText® 5.4.2 ©2000-2012 1T3XT BVBA \(AGPL-version\))
/ModDate(D:20130502165150+02'00')/CreationDate(D:20130502165150+02'00')>>
endobj
xref
0 7
0000000000 65535 f
0000000302 00000 n
0000000015 00000 n
0000000390 00000 n
0000000145 00000 n
0000000441 00000 n
0000000486 00000 n
trailer
<</Root 5 0 R/ID [<91bee3a87061eb2834fb6a3258bf817e><91bee3a87061eb2834fb6a3258bf817e>]
/Info 6 0 R/Size 7>>
%iText-5.4.2
startxref
639
%%EOF
Update:
В комментарии, по следующей ссылке был добавлен: https://blog.idrsolutions.com/2010/01/printing-pdf-files-from-java/
Это на самом деле лучший способ печати файла:
FileInputStream fis = new FileInputStream(“C:/mypdf.pdf”);
Doc pdfDoc = new SimpleDoc(fis, null, null);
DocPrintJob printJob = printService.createPrintJob();
printJob.print(pdfDoc, new HashPrintRequestAttributeSet());
fis.close();
Если вы не хотите использовать FileInputStream
, вы всегда можете создать PDF как ByteArrayOutputStream
и использовать полученный byte[]
для создания ByteArrayInputStream
.
Вот что такое практический ответ: создать PDF-файл в памяти не так сложно.Это делается так:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter.getInstance(document, baos);
document.open();
// add content
document.close();
byte[] pdf = baos.toByteArray();
вопрос: что вы собираетесь делать с pdf
?
Либо ваш принтер понимает эти байты (есть принтеры, которые принимают синтаксис PDF), либо вам нужно найти программное обеспечение, которое преобразует PDF в формат, который принтеры понимают. Обычно для печати документа используется программа для рендеринга PDF (например, Adobe Reader). Многие из этих зрителей (один из них - Adobe Reader) требуют, чтобы файл существовал как файл: Adobe Reader не принимает массив байтов.
Это объясняет, почему практический ответ не так прост, как теоретический ответ: на практике ваш вопрос далек от тривиального: он зависит от принтера (какие форматы он принимает) и средства просмотра PDF (если требуется один).
"Печать PDF файлы из Явы" - https://blog.idrsolutions.com/2010/01/printing-pdf-files-from-java/ – CSCH