2013-05-30 1 views
4

PDFBox를 사용하여 기존 PDF 템플릿에서 문서를 작성하므로 파일을 열고 텍스트를 추가 한 다음 저장합니다. 그것은 외부 TTF 글꼴을 사용하려고 할 때를 제외하고는 잘 동작합니다. 나는 여러 가지 일을 시도해 보았지만 해결책을 찾는데 2 일을 보냈지 만 PDFBox에는 그다지 많은 것이 없습니다.PDFBox 내장 TTF 글꼴이 작동하지 않습니다.

"Tardy Kid" 글꼴은 다른 것으로 오인 할 수 없으며 어떤 표준 라이브러리에도 속하지 않으므로 일부 코드가 있습니다.

코드가 잘 실행되고 println의 "TardyKid"가 표시되고 (글꼴이로드되고 이름이 gettable임을 나타냄) 텍스트가 표시되지만 Helvetica에 있습니다. 너비를 계산하기 위해 getStringWidth()을 사용하는보다 정교한 코드 부분도 너비 테이블로드에 성공한 것 같습니다. 단지 올바르게 표시되지 않습니다.

코드는 기존 PDF 문서 (템플릿)를 열고 텍스트를 추가하는 큰 프로그램의 컨텍스트에서 실행됩니다. 그것은 모두를 제외하고 잘 작동하는 것 같습니다

public void setText (PDDocument document, String text) throws IOException { 
    int lastPage = document.getNumberOfPages() - 1; 
    PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(lastPage); 
    PDPageContentStream contentStream = null; 
    try { 
     contentStream = new PDPageContentStream(document,page,true,true,false); 
     File fontFile = new File(m_fontDir, "Tardy_Kid.ttf"); 
     PDFont font = PDTrueTypeFont.loadTTF(document, fontFile); 
     Color color = new Color(196, 18, 47); 
     float x = 100f, y = 700f; 
     System.out.println(font.getBaseFont()); 
     contentStream.setFont(font, 32); 
     contentStream.setNonStrokingColor(color); 
     contentStream.beginText(); 
     contentStream.moveTextPositionByAmount(x,y); 
     contentStream.drawString(text); 
     contentStream.endText(); 
    } finally { 
     if (contentStream != null) { 
      contentStream.close(); 
     } 
    } 
} 
+0

추가 테스트시, 다른 텍스트에 대해이 후에 SetFont를 다시 호출하면 문제가 발생하는 것 같습니다. 모든 텍스트가 마지막 글꼴 세트로 되돌아갑니다. 하나의 텍스트 또는 여러 글꼴을 같은 글꼴 (Tardy Kid)로 설정하면 작동합니다. –

답변

4

나는 대답을 찾았습니다. 이것은 PDFBox의 버그인지 확실하지 않지만 같은 페이지에서 두 번 이상 내용 스트림 (PDPageContentStream에서 반환)을 열거 나 닫으면 제대로 작동하지 않습니다. 따라서 setText 루틴 내에서 컨텐츠 스트림을 열거 나 닫는 것은 루틴이 페이지에서 두 번 이상 호출 될 때 작동하지 않았습니다. 루틴 외부에서 스트림을 이동하고 전체 페이지에 대해 한 번 열거 나 닫으면이 문제 (및 몇 가지 다른 문제)가 해결 된 것 같습니다.

이것은 설명서 나 예제 코드에서 언급되지 않았으며 기껏해야 미묘합니다. 나는 그것을 버그라고 부르는데, 특히 "작동"(예외는 발생하지 않음)하지만 페이지에 불확정 및/또는 잘못된 결과가 생성되므로 특히 그렇습니다.

1

우리 전쟁 파일을 만들 때 pdf 템플릿 파일을 손상시킨 pom 업데이트에서 온 유사한 문제가있었습니다.

스택 추적에서 "TimesBrowser, Timesold, Bold에 대해 내장 된 TTF를 읽을 수 없습니다."이것은 "pushback size"와 관련된 오류를보고 난 후입니다. 물론 과거의 새로운 속성 값을 설정했습니다. 참조 용 : org.apache.pdfbox.exceptions.WrappedIOException: Could not push back 480478 bytes in order to reparse stream. Try increasing push back buffer using system property org.apache.pdfbox.baseParser.pushBackSize).

전쟁을 폭발시키고 전쟁에서 pdf 파일을 열려고했지만 우리는 그것이 부패한 것으로 나타 났지만 출처에 있던 pdf 파일은 손상되지 않았 음을 알게되었습니다.

문제의 근본 원인은 리소스 폴더에 대해 "필터링"을 우리의 pom에 추가했기 때문입니다. 우리는 건강 검진 페이지에서 일부 값을 얻기 위해 약간의 리플렉션을 사용할 수 있도록했습니다. 그러나 이는 다음 참조에서 알아 낸 PDF 파일을 손상 시켰습니다. https://bitbucket.org/petermr/xhtml2stm/issues/12/pdf-files-are-being-corrupted-at-some

다음은 필터링 설정 예제입니다. 그 비트 우리 :

<resources> 
    <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
</resources> 

우리의 해결책은 우리의 건강 관리 페이지에 대한 정보를 어떻게 우리의 pom에서 제거하고 우리가 건강한 페이지에 대한 정보를 가지고 있었다.

관련 문제