2016-07-01 6 views
1

Apache FOP 라이브러리를 사용하여 Java8 프로젝트에서 일부 pdf 파일을 생성합니다. 영어 콘텐츠가 문제없이 표시되지만 러시아 문자가 이상합니다. 그들은 다음과 같이 보입니다 : Ð # огР̧н.Apache FOP. cyrrilic 문자가있는 문제

여기 엔 문제가 인코딩과 관련되어 있지만 어떻게 해결할 수 있습니까? 여기

내가 생성하는 데 사용하는 클래스입니다 PDF : 내가 'UTF-8' 은 다음과 같습니다 내 키릴 문자열을에 'ISO-8859-1'에서 인코딩을 변경

public class PdfGenerationTools implements StreamResource.StreamSource 
    { 
    String content; 

    public PdfGenerationTools(String content) { 
     this.content = content; 
    } 

    @Override 
    public InputStream getStream() 
    { 
     ByteArrayInputStream foStream = 
       new ByteArrayInputStream(content.getBytes(StringTools.UTF8)); 

     // Basic FOP configuration. You could create this object 
     // just once and keep it. 
     FopFactory fopFactory = FopFactory.newInstance(); 
     fopFactory.setStrictValidation(false); // For an example 

     // Configuration for this PDF document - mainly metadata 
     FOUserAgent userAgent = getFOUserAgent(fopFactory); 

     // Transform to PDF 
     ByteArrayOutputStream fopOut = new ByteArrayOutputStream(); 
     try { 
      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, 
        userAgent, fopOut); 
      TransformerFactory factory = 
        TransformerFactory.newInstance(); 
      Transformer transformer = factory.newTransformer(); 
      Source src = new 
        javax.xml.transform.stream.StreamSource(foStream); 
      Result res = new SAXResult(fop.getDefaultHandler()); 
      transformer.transform(src, res); 
      fopOut.close(); 
      return new ByteArrayInputStream(fopOut.toByteArray()); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    private FOUserAgent getFOUserAgent(FopFactory factory) 
    { 
     FOUserAgent userAgent = factory.newFOUserAgent(); 

     userAgent.setProducer("Company"); 
     userAgent.setCreationDate(new Date()); 
     userAgent.setTitle("Printing jobs"); 
     userAgent.setTargetResolution(300); // DPI 

     return userAgent; 
    } 

    public static String initDoc() 
    { 
     return "<?xml version='1.0' encoding='ISO-8859-1'?>"+ 
       "<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>"+ 
       "<fo:layout-master-set>"+ 
       "<fo:simple-page-master master-name='A4' margin='2cm'>"+ 
       "<fo:region-body />"+ 
       "</fo:simple-page-master>"+ 
       "</fo:layout-master-set>"+ 
       "<fo:page-sequence master-reference='A4'>"+ 
       "<fo:flow flow-name='xsl-region-body'>"; 
    } 

    public static String closeDoc() 
    { 
     return "</fo:flow>"+ 
       "</fo:page-sequence>"+ 
       "</fo:root>"; 
    } 

    public static String initTable() 
    { 
     return "<fo:block space-before.optimum=\"10pt\"></fo:block>" + 
       "<fo:table table-layout=\"fixed\" border-width=\"1mm\" border-style=\"solid\">" + 
       "<fo:table-column column-number=\"1\" column-width=\"50%\"/>" + 
       "<fo:table-column column-number=\"2\" column-width=\"50%\"/>" + 
       "<fo:table-body>"; 
    } 

    public static String closeTable() 
    { 
     return "</fo:table-body>" + 
       "</fo:table>"; 
    } 

    public static String initTableRow() 
    { 
     return "<fo:table-row keep-together.within-page=\"always\">"; 
    } 

    public static String closeTableRow() 
    { 
     return "</fo:table-row>"; 
    } 

    public static String getCell(String ... args) 
    { 
     final StringBuilder sb = new StringBuilder(); 
     sb.append("<fo:table-cell padding=\"1mm\" border-width=\"1mm\" border-style=\"double\">"); 

     for (String arg : args) 
     { 
      sb.append("<fo:block font-family=\"SansSerif\">") 
        .append(arg) 
        .append("</fo:block>"); 
     } 

     sb.append("</fo:table-cell>"); 

     return sb.toString(); 
    } 
} 

: '## ### '. 내가 여기 글꼴이없는 것 같다 ..

+1

마치 1 바이트 ISO/Windows 인코딩으로 간주되는 멀티 바이트 UTF-8처럼 보입니다. 나머지는 http://www.javaranch.com/journal/200409/CreatingMultipleLanguagePDFusingApacheFOP.html와 같은 작은 테스트를 작성하십시오. –

+1

아마도 글꼴 구성 문제 ([this answer of myine] (http://stackoverflow.com/ a/28251945/4453460) 또는 인코딩 문제가 발생할 수 있습니다. 키릴 문자가있는 작은 FO 스 니펫을 추가하면 답을 얻을 수 있습니다. 그렇지 않으면 문제를 시도하고 재현 할 수 없습니다 ([MCVE] (http://stackoverflow.com/help/mcve) 참조). – lfurini

+0

위의 코드를 추가하여 PDF 내용을 생성하는 방법을 보여줍니다. – user1053031

답변

2

당신은 예를 들어, PDF 문서에 포함 할 글꼴을 나타냅니다 FOP에 대한 구성 파일을 사용합니다

<?xml version="1.0" encoding="UTF-8"?> 
<fop version='1.0'> 
    <renderers> 
     <renderer mime='application/pdf'> 
      <fonts> 
       <!-- TTF fonts --> 
       <font kerning='yes' embed-url='c:\windows\fonts\arial.ttf'> 
        <font-triplet name='Arial' style='normal' weight='normal' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\arialbd.ttf'> 
        <font-triplet name='Arial' style='normal' weight='bold' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\ariali.ttf'> 
        <font-triplet name='Arial' style='italic' weight='normal' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\arialbi.ttf'> 
        <font-triplet name='Arial' style='italic' weight='bold' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\times.ttf'> 
        <font-triplet name='TimesNewRoman' style='normal' weight='normal' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\timesbd.ttf'> 
        <font-triplet name='TimesNewRoman' style='normal' weight='bold' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\timesi.ttf'> 
        <font-triplet name='TimesNewRoman' style='italic' weight='normal' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\timesbi.ttf'> 
        <font-triplet name='TimesNewRoman' style='italic' weight='bold' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\cour.ttf'> 
        <font-triplet name='CourierNew' style='normal' weight='normal' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\courbd.ttf'> 
        <font-triplet name='CourierNew' style='normal' weight='bold' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\couri.ttf'> 
        <font-triplet name='CourierNew' style='italic' weight='normal' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\courbi.ttf'> 
        <font-triplet name='CourierNew' style='italic' weight='bold' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\verdana.ttf'> 
        <font-triplet name='Verdana' style='normal' weight='normal' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\verdanab.ttf'> 
        <font-triplet name='Verdana' style='normal' weight='bold' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\verdanai.ttf'> 
        <font-triplet name='Verdana' style='italic' weight='normal' /> 
       </font> 
       <font kerning='yes' embed-url='c:\windows\fonts\verdanaz.ttf'> 
        <font-triplet name='Verdana' style='italic' weight='bold' /> 
       </font> 
      </fonts> 
     </renderer> 
    </renderers> 
</fop> 
사용 방법 :

// configure fopFactory as desired 
FopFactory fopFactory = FopFactory.newInstance(); 
FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
fopFactory.setUserConfig(new File("fop.xml")); 
+0

마침내이 문제로 돌아 왔습니다. 문제는 제가 우분투 14에서 작동한다는 것입니다. 그래서 MS 글꼴은 여기에 없습니다. ( – user1053031

+2

키릴 문자가 포함 된 글꼴을 사용할 수 있습니다. 우분투에서 MS 글꼴을 설정할 수도 있습니다. 우분투 소프트웨어 센터를 열고 "ttf-mscorefonts-installer"를 검색하면 Microsoft의 핵심 글꼴이 설치됩니다. –