Java:在PDF生成中使用iText进行粗体生成并不正常

时间:2015-10-12 13:57:35

标签: java pdf itext

我使用iText从XML文件生成PDF,内容为HTML。一切都在起作用,除了一件小事 当我有一个包含BOLD部分的文本块时,BOLD不会出现在生成的PDF文件中。如果我在BOLD中有一个完整的短语,它的工作正常 示例:

<DIV><FONT face='Arial' size='10'><B>The BOLD for this phrase works</B></FONT></DIV>
<DIV><FONT face='Arial' size='10'>The BOLD for <B>this part of the phrase </B> doesn't work</FONT></DIV>  

使用&#39; Italic&#39;或者&#39; Underline&#39;,我可以做同样的测试,但我没有遇到问题。它的工作......
有点精确:如果我将标记<B>与标记<U><I>结合使用,对于文本块的一部分,它也可以正常工作。
示例:

<DIV><FONT face='Arial' size='10'>The combination of <B><I>BOLD and something else (U or I)</I></B> works fine.</FONT></DIV>


对于上下文:带有struts的WebApp,PDF不会保存为文件,而是作为响应发送到导航器。正如答案所示,我将我的iText版本从1.4.8更新为5.5.7 对于保存在xml文件中的HTML代码,您可以看到上面的示例 对于Java代码(我从几个很长的方法中获取代码。我希望我什么都不会忘记......)。

ByteArrayOutputStream baoutLettre = new ByteArrayOutputStream();  
Document document = new Document();  
PdfWriter myWriter = PdfWriter.getInstance(document, baoutLettre);  
handleHeaderFooter(request, response, document, Constantes.Type_LETTRE);  
document.open();  
String lettreContent = FileHelper.readFile("myLetter.xml");  
XmlParser.parse(document, new ByteArrayInputStream(lettreContent.getBytes("UTF-8")), getTagMap());
document.close();
ByteArrayOutputStream outTmp = new ByteArrayOutputStream(64000);
PdfCopyMerge pdfCM = new PdfCopyMerge(outTmp);
pdfCM.addDocument(baoutLettre.toByteArray());
pdfCM.close();
ByteArrayOutputStream outPDF = addPageNumber(outTmp.toByteArray(), soc, dicoEdition, request);
outPDF.writeTo(request.getOutputStream());

对于PdfCopyMerge类:

public class PdfCopyMerge {

private ByteArrayOutputStream outStream = new ByteArrayOutputStream();
private Document document = null;
private PdfCopy writer = null;

public PdfCopyMerge(ByteArrayOutputStream stream) {
    super();
    outStream = stream;
}    
public int addDocument(byte[] pdfByteArray) {
    int numberOfPages = 0;
    try {
        PdfReader reader = new PdfReader(pdfByteArray);
        numberOfPages = reader.getNumberOfPages();
        if (this.document == null) {
            this.document = new Document(reader.getPageSizeWithRotation(1));
            this.writer = new PdfCopy(this.document, this.getOutputStream());
            this.document.open();
        }
        PdfImportedPage page;
       for (int i = 0; i < numberOfPages;) {
           ++i;
           page = this.writer.getImportedPage(reader, i);
           this.writer.addPage(page);
       }
       PRAcroForm form = reader.getAcroForm();
       if (form != null) {
           this.writer.copyAcroForm(reader);
       }
   } catch (Exception e) {
      logger.error(e.getMessage(),e);
   }
    return numberOfPages;
}

有人遇到同样的问题吗?我寻找任何有用的想法...
感谢。

1 个答案:

答案 0 :(得分:1)

尝试最新版本5.5.7。一切正常。 https://github.com/itext/itextpdf/tags