2014-02-07 1 views
0

PDF 파일을 인쇄하는 라벨 프린터로 작업하고 있습니다. 다음과 같은 파일을 만듭니다.텍스트의 크기를 조정하여 한 페이지에 텍스트가 맞도록합니다.

public static Document createPDF() { 
float pageWidth = 176f; 
    float pageHeight = 200f; 

    Rectangle pageSize = new Rectangle(pageWidth, pageHeight); 
    Document document = new Document(pageSize); 
    document.setMargins(5, 5, 1, 0); 
    String file = MainActivity.FILE_URI; 
    try { 
     PdfWriter.getInstance(document,new FileOutputStream(file)); 
    } catch (FileNotFoundException e1) { 
     e1.printStackTrace(); 
    } catch (DocumentException e1) { 
     e1.printStackTrace(); 
    } 

    return document; 
} 

그런 다음 몇 개의 단락을 추가합니다. 단락에는 가변 길이가 있습니다. 페이지의 길이를 초과하면 IText는 다른 페이지를 추가합니다. 페이지는 62 x 75mm입니다.

나는 종이를 낭비하지 않도록 텍스트의 양을 기준으로 길이를 변경하고 싶습니다. 시도 :

try { 
    PdfReader reader = new PdfReader(MainActivity.FILE_URI); 

    while (reader.getNumberOfPages() > 1) { 
     float pageHeight = document.getPageSize().getHeight(); 
     float pageWidth = document.getPageSize().getWidth(); 

     pageHeight += 50f; 

     document.setPageSize(new Rectangle(pageWidth, pageHeight)); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

하지만 작동하지 않습니다. 페이지 수가 길어지지 않으므로 페이지 수가 동일하게 유지되고 루프가 발생합니다.

누구나 해결책을 알고 계십니까?

+1

사용 가능한 페이지 수에 맞게 인쇄되는 텍스트의 크기를 고르게 변경하거나 올바른 크기로 인쇄 할 용지를 변경 하시겠습니까? – Steven

+0

좋은 질문입니다. 나는이 반론에 대한 답이 없으면 작전에 응답 할 수 없다! –

+0

용지를 늘립니다. 프린터는 10 미터 롤을 가지고 있기 때문에 어떤 길이라도 프린트 할 수 있습니다. – Jeroen

답변

1

본질적으로 유스 케이스에 대한 타당한 입력보다 긴 긴 페이지를 먼저 그려야하며, 빈 부분을 잘라내야합니다.

즉, pageHeight 값을 적절하게 설정해야합니다. 안전한 값은

float pageHeight = 14400f; 

결과는 매우 긴 페이지 하나, 길이가 5m 이상인 PDF 문서입니다.

이 페이지는 내용과 일치하도록 축약되었습니다. 이이 같은 두 번째 패스에서 수행 할 수 있습니다 (I 이미 정의 된 pageSize 사각형을 사용합니다 INTERMEDIATE 점을 ​​첫 번째 패스에서 생성 된 PDF로) :

PdfReader reader = new PdfReader(INTERMEDIATE); 
PdfStamper stamper = new PdfStamper(reader, FINAL_RESULT); 

PdfReaderContentParser parser = new PdfReaderContentParser(reader); 
TextMarginFinder finder = parser.processContent(1, new TextMarginFinder()); 

PdfDictionary page = reader.getPageN(1); 
page.put(PdfName.CROPBOX, new PdfArray(new float[]{pageSize.getLeft(), finder.getLly(), pageSize.getRight(), pageSize.getTop()})); 
stamper.markUsed(page); 

stamper.close(); 
reader.close(); 

당신을 유지할 수 있습니다 문서 데이터에 따라 중급 PDF를 ByteArrayOutputStream을 사용하여 PdfWriter에 입력하고이후에 intermdeiate PDF를 가져오고 document.close() 다음에 byte[]을 두 번째 단계에서 PdfReader에 넣으십시오.

+0

'TextMarginFinder'는 필요하지 않은 자원을 요구합니다. 생성 프로세스를 제어 할 수있게되면 생성 단계에서 Y 위치 (필요한 공간의 양)를 알 수 있습니다. 'PdfWriter.getVerticalPosition()'메소드를 사용하거나'ColumnText' 오브젝트를 사용하여 컨텐츠를 추가하고'getYLine()'메소드로 최종 Y 위치를 요청할 수 있습니다. 극한의 높이를 갖는'PdfTemplate'을 생성하고'ColumnText'를 사용하여이'PdfTemplate '에 내용을 추가 한 다음 올바른 크기의 페이지에 잘린'PdfTemplate'을 추가하여 한 번에 PDF를 작성할 수 있습니다. –

+1

@ BrunoLowagie 당신은 완전합니다. OP의 코드에서'Document' 생성이 그 자체의 방법으로 분해되었다는 것을 보았을 때, 나는 가능한 한 호출자가 거의주의를 기울이지 않는 방법을 보여 주려했다. – mkl

+0

그 이유는 그것이 내 최대 투표를 받았다 ;-) –

관련 문제