2015-04-20 4 views
1

Я использую IText для создания PDF и записать его в файловую систему в качестве следующего:IText прямая печать

private void createPDF() throws Exception{ 
    com.itextpdf.text.Document doc = new com.itextpdf.text.Document(); 
    PdfWriter docWriter = null; 
    path = "C:\\PATH\\TO\\Desktop\\EXAMPLE_FOLDER\\" + pdfFilename; 
    docWriter = PdfWriter.getInstance(doc, new FileOutputStream(path)); 
    doc.addTitle("Invoice"); 
    doc.setPageSize(PageSize.A4); 
    doc.open(); 
    PdfContentByte cb = docWriter.getDirectContent(); 
    fillPDFDetails(cb); 
    if (doc != null) { 
     doc.close(); 
    } 
    if (docWriter != null) { 
     docWriter.close(); 
    } 
} 

Однако, я хочу, чтобы отправить PDF на принтер и распечатать файл в формате PDF вместо записывая его в файловую систему. Как я могу это достичь?

+0

"Печать PDF файлы из Явы" - https://blog.idrsolutions.com/2010/01/printing-pdf-files-from-java/ – CSCH

ответ

7

Существует теоретический и практический ответ на этот вопрос.

Начнем с теоретического ответа. Там есть класс 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 (если требуется один).

+0

Я выполнил ваше код, я получаю java.io.IOException: в документе нет страниц Исключение. – fareed

+0

Это потому, что вы ничего не добавили, где говорится '// добавление контента'. –

+0

Я добавляю детали там! – fareed

0

Попробуйте это:

filename = "aaaaaaa.pdf"; 
java.io.File fileout = new File(filename); 
com.lowagie.tools.Executable.printDocumentSilent(fileout)); 
fileout.delete(); // if you don't want to keep it.