2016-07-01 5 views
1

Apache FOPライブラリを使用してJava8プロジェクトでpdfファイルを生成します。英語のコンテンツは問題なく表示されますが、ロシア語の文字は奇妙です。彼らは次のようになります:Ð#огІ††Apache FOP。筆頭の文字での問題

ここでの問題は、何とかエンコードに関連しているようですが、どうすれば修正できますか?ここ

は、私は、PDFを生成するために使用するクラスです:i 'はISO-8859-1' から 'UTF-8' にエンコーディングを変更した場合

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

マルチバイトのUTF-8は、1バイトのISO/Windowsエンコーディングと見えます。残りの部分については、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

最終的に私はこの問題に戻りました。問題は私がUbuntu 14thで働いていることです。 MSのフォントはここでは利用できません( – user1053031

+2

)UbuntuでMSフォントを設定することもできます。Ubuntu Software Centerを開き、 "ttf-mscorefonts-installer"を検索すると、Microsoftのコアフォントがインストールされます。 –