2017-10-11 1 views
0

COSName에서 글꼴을 가져 오는 방법은 무엇입니까?pdfbox 사용 - COSName에서 글꼴을 가져 오는 방법?

내가 이런 식으로 어떻게 든 모습을 찾고 해결책은 : 나는 PDF로 일부 문자열을 대체하려고

: 당신이 더 많은 배경이 필요하면

COSDictionary dict = new COSDictionary(); 
dict.add(fontname, something); // fontname COSName from below code 
PDFontFactory.createFont(dict); 

, 나는 아래의 전체 이야기를 추가했다. 이것은 성공합니다 (모든 텍스트가 하나의 토큰에 저장되어있는 한). 형식을 유지하기 위해 저는 텍스트의 중심을 다시 맞추기를 좋아합니다. 내가 아는 한, 나는 오래된 문자열과 새로운 문자열의 너비를 얻고, 사소한 계산을하고 새로운 위치를 설정함으로써 이것을 할 수있다.

나는 예는 몇 가지 문제가 있습니다 ( https://stackoverflow.com/a/36404377 교체에 대한 유래에 대한 영감을 찾았지만 내 간단한 PDF 년대. 그리고 How to center a text using PDFBox 작동합니다. 불행히도이 예 글꼴 상수를 사용합니다.

그래서 내가 할 첫 번째 링크의 코드를 사용하여 연산자에 대한 처리 'TJ'와 'TJ'의 하나.

PDFStreamParser parser = new PDFStreamParser(page); 
    parser.parse(); 
    java.util.List<Object> tokens = parser.getTokens(); 
    for (int j = 0; j < tokens.size(); j++) 
    { 
    Object next = tokens.get(j); 
    if (next instanceof Operator) 
    { 
     Operator op = (Operator) next; 
     // Tj and TJ are the two operators that display strings in a PDF 
     if (op.getName().equals("Tj")) 
     { 
     // Tj takes one operator and that is the string to display so lets 
     // update that operator 
     COSString previous = (COSString) tokens.get(j - 1); 
     String string = previous.getString(); 
     String replaced = prh.getReplacement(string); 
     if (!string.equals(replaced)) 
     { // if changes are there, replace the content 
      previous.setValue(replaced.getBytes()); 
      float xpos = getPosX(tokens, j); 
      //if (true) // center the text 
      if (6 * xpos > page.getMediaBox().getWidth()) // check if text starts right from 1/xth page width 
      { 
      float fontsize = getFontSize(tokens, j); 
      COSName fontname = getFontName(tokens, j); 
      // TODO 
      PDFont font = ?getFont?(fontname); 
      // TODO 
      float widthnew = getStringWidth(replaced, font, fontsize); 
      setPosX(tokens, j, page.getMediaBox().getWidth()/2F - (widthnew/2F)); 
      } 
      replaceCount++; 
     } 
     } 

도도 태그 사이에 코드를 고려, 나는 토큰 목록에서 필요한 값을 얻을 것이다. (예이 코드는 끔찍하지만, 지금은 주요 문제에 집중하겠습니다.)

문자열, 크기 및 글꼴 나는 샘플 코드에서 getWidth (..) 메서드를 호출 할 수 있어야합니다.

불행히도 COSName 변수에서 글꼴을 만드는 데 어려움이 있습니다.

PDFont는 이름으로 글꼴을 만드는 방법을 제공하지 않습니다. PDFontFactory는 괜찮아 보이지만 COSDictionary를 요청합니다. 이것은 내가 포기하고 당신에게 도움을 요청하는 요점입니다.

답변

2

이름은 페이지 리소스의 글꼴 개체와 연결됩니다.

당신이 PDFBox의 커널 2.0.x를 사용하고 pagePDPage 인스턴스 인 것을, 당신이 사용하는 이름 fontname 해결할 수 있습니다 가정 :

PDFont font = page.getResources().getFont(fontname); 

하지만 참조하는 질문에 대한 코멘트에서 경고가 남아 :이 접근 할 것이다 매우 간단한 PDF에 대해서만 작동하며 다른 PDF도 손상시킬 수 있습니다.

관련 문제