2014-04-15 1 views
1

Я использую iText 2.1.7, я добавляю верхний и нижний колонтитулы в абсолютном положении, используя метод writer.getDirectcontent(). Все отлично работает, за исключением того, что шрифты на первой странице становятся темнее чем на вторых страницах.Цвет текста itext становится темнее на первой странице

Обратите внимание на Колонтитулы в первой и второй страницы

enter image description here

enter image description here

anyhelp?

Вот что я сделал

Reader stringReader = new StringReader(svgXmlDoc); 

    Document document = new Document(PageSize.A4.rotate()); 

    ByteArrayOutputStream content = new ByteArrayOutputStream(); 
    try { 

     PdfWriter writer = PdfWriter.getInstance(document, content); 

     document.open(); 

     PdfService event = new PdfService(); 
     event.setHeader(date.toString()); 

     event.onOpenDocument(writer, document); 
     event.onEndPage(writer, document); 
     event.onCloseDocument(writer, document); 
     writer.setPageEvent(event); 

     Image image1 = Image.getInstance("Infinity-Loop.png"); 

     image1.scalePercent(35); 

     PdfPTable signature = new PdfPTable(numberOfSignature); 

     signature.setTotalWidth(document.getPageSize().getWidth() 
       - document.leftMargin() - document.rightMargin()); 
     signature.setLockedWidth(true); 
     signature.setWidthPercentage(100); 
     signature.getDefaultCell().setFixedHeight(20); 

     signature.getDefaultCell().setHorizontalAlignment(
       Element.ALIGN_RIGHT); 
     for (int i = 0; i < numberOfSignature; i++) { 
      PdfPCell cell = new PdfPCell(new Paragraph(
        String.valueOf("____________"))); 
      cell.setBorder(Rectangle.NO_BORDER); 
      cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
      signature.addCell(cell); 
     } 

     PdfPTable header = new PdfPTable(3); 

     float[] columnWidths = {1f,2f,1f}; 
     header.setWidths(columnWidths); 
     header.setTotalWidth(document.getPageSize().getWidth() 
       - document.leftMargin() - document.rightMargin()); 
     header.setLockedWidth(true); 
     header.setWidthPercentage(100); 
     header.getDefaultCell().setPadding(15); 
     header.getDefaultCell().setBorder(Rectangle.NO_BORDER); 

     PdfPCell logocell = new PdfPCell(image1, false); 
     logocell.setRowspan(3); 
     logocell.setFixedHeight(72); 
     logocell.setBorder(Rectangle.NO_BORDER); 
     header.addCell(logocell); 

     PdfPCell Title = new PdfPCell(new Phrase(title, 
       FontFactory.getFont(FontFactory.TIMES_ROMAN, 18, 
         Font.PLAIN, new Color(0, 0, 0)))); 
     Title.setBorder(Rectangle.NO_BORDER); 
     Title.setHorizontalAlignment(Element.ALIGN_CENTER); 
     header.addCell(Title); 
     header.addCell(""); 
     header.completeRow(); 
     PdfPCell SubTitle = new PdfPCell(new Phrase(subTitle)); 
     SubTitle.setBorder(Rectangle.NO_BORDER); 
     SubTitle.setHorizontalAlignment(Element.ALIGN_CENTER); 
     header.addCell(SubTitle); 
     header.addCell(""); 
     header.completeRow(); 
     PdfPCell dataRange = new PdfPCell(new Phrase(
       dateRange)); 
     dataRange.setBorder(Rectangle.NO_BORDER); 
     dataRange.setHorizontalAlignment(Element.ALIGN_CENTER); 
     header.addCell(dataRange); 
     header.addCell(""); 
     header.completeRow(); 
     ArrayList tmp = header.getRows(0, header.getRows().size()); 
     header.getRows().clear(); 
     header.getRows().addAll(tmp); 

     int width = (int) ((int) document.getPageSize().getWidth() 
       - document.leftMargin() - document.rightMargin()); 
     int height = 350; 
     PdfContentByte cb = writer.getDirectContent(); 
     PdfTemplate template = cb.createTemplate(width, height); 
     Graphics2D g2 = template.createGraphics(width, height); 

     PrintTranscoder prm = new PrintTranscoder(); 
     TranscoderInput ti = new TranscoderInput(stringReader); 
     prm.transcode(ti, null); 

     PageFormat pg = new PageFormat(); 
     Paper pp = new Paper(); 
     pp.setSize(width, height); 
     pp.setImageableArea(0, 0, width, height); 
     pg.setPaper(pp); 
     prm.print(g2, pg, 0); 
     g2.dispose(); 

     ImgTemplate img = new ImgTemplate(template); 
     img.setAbsolutePosition(document.left(), document.topMargin() + 100); 
     document.add(img); 
     signature.writeSelectedRows(0, -1, document.left(), 
       document.bottom() + document.bottomMargin() * 2, 
       writer.getDirectContent()); 

     header.writeSelectedRows(0, -1, document.left(), document.top(), 
       writer.getDirectContent()); 
     document.newPage(); 

    PdfPTable statisticsTitle=new PdfPTable(1); 
    statisticsTitle.setTotalWidth(document.right() - document.left()); 
    statisticsTitle.setWidthPercentage(100); 
    PdfPCell titleCell= new PdfPCell(new Paragraph("Statistics Report")); 
    titleCell.setBorder(Rectangle.NO_BORDER); 
    titleCell.setHorizontalAlignment(Element.ALIGN_CENTER); 
    statisticsTitle.addCell(titleCell); 
    statisticsTitle.writeSelectedRows(0, -1, document.left(), document.top() 
      - document.topMargin() * 2 - 10, writer.getDirectContent()); 

     PdfPTable table; 
     if(measurementType.equals("Temp")){ 
      table = new PdfPTable(6); 
     } 
     else{ 
      table = new PdfPTable(11); 
     } 
     table.setTotalWidth(document.right() - document.left()); 
     table.setWidthPercentage(100); 
     table.setHeaderRows(1); 


     PdfPCell h1 = new PdfPCell(new Paragraph("Description")); 
     h1.setGrayFill(0.7f); 
     h1.setRowspan(2); 
     h1.setVerticalAlignment(Element.ALIGN_MIDDLE); 
     h1.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(h1); 

     PdfPCell h2 = new PdfPCell(new Paragraph("Temperature")); 
     h2.setGrayFill(0.7f); 
     h2.setColspan(5); 
     h2.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(h2); 

     if(measurementType.equals("TempHumi")){ 
      PdfPCell h3 = new PdfPCell(new Paragraph("Humidity")); 
      h3.setGrayFill(0.7f); 
      h3.setColspan(5); 
      h3.setHorizontalAlignment(Element.ALIGN_CENTER); 
      table.addCell(h3); 
     } 
     table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); 
     PdfPCell tc1 = new PdfPCell(new Paragraph("Min")); 
     tc1.setGrayFill(0.7f); 
     tc1.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(tc1); 

     PdfPCell tc2 = new PdfPCell(new Paragraph("Max")); 
     tc2.setGrayFill(0.7f); 
     tc2.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(tc2); 

     PdfPCell tc3 = new PdfPCell(new Paragraph("Avg")); 
     tc3.setGrayFill(0.7f); 
     tc3.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(tc3); 

     PdfPCell tc4 = new PdfPCell(new Paragraph("Std")); 
     tc4.setGrayFill(0.7f); 
     tc4.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(tc4); 

     PdfPCell tc5 = new PdfPCell(new Paragraph("Mkt")); 
     tc5.setGrayFill(0.7f); 
     tc5.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(tc5); 

     if(measurementType.equals("TempHumi")){ 
     PdfPCell hc1 = new PdfPCell(new Paragraph("Min")); 
     hc1.setGrayFill(0.7f); 
     hc1.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(hc1); 

     PdfPCell hc2 = new PdfPCell(new Paragraph("Max")); 
     hc2.setGrayFill(0.7f); 
     hc2.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(hc2); 

     PdfPCell hc3 = new PdfPCell(new Paragraph("Avg")); 
     hc3.setGrayFill(0.7f); 
     hc3.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(hc3); 

     PdfPCell hc4 = new PdfPCell(new Paragraph("Std")); 
     hc4.setGrayFill(0.7f); 
     hc4.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(hc4); 

     PdfPCell hc5 = new PdfPCell(new Paragraph("Mkt")); 
     hc5.setGrayFill(0.7f); 
     hc5.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.addCell(hc5); 
     } 



     ArrayList tmpTable = table.getRows(0, table.getRows().size()); 
     table.getRows().clear(); 
     table.getRows().addAll(tmpTable); 

     JsonObject listloggerdatastatistics = ReportService 
       .getStatisticsDetails(serialnumberlist); 

     System.out.println("Json "+listloggerdatastatistics.get("Sensormodellist")); 

     for (int row = 0; row < listloggerdatastatistics.get("Sensormodellist").getAsJsonArray().size(); row++) { 
      JsonObject jsonobj=listloggerdatastatistics.get("Sensormodellist").getAsJsonArray().get(row).getAsJsonObject(); 
      if (row > 20 && row % 21 == 0) { 

       table.completeRow(); 

       table.writeSelectedRows(0, 22, document.left(), 
         document.top() - document.topMargin() * 2 - 10, 
         writer.getDirectContent()); 
       table.deleteBodyRows(); 
       table.setSkipFirstHeader(true); 
       signature.writeSelectedRows(0, -1, document.left(), 
         document.bottom() + document.bottomMargin() * 3, 
         writer.getDirectContent()); 

       header.writeSelectedRows(0, -1, document.left(), 
         document.top(), writer.getDirectContent()); 

       document.newPage(); 
      } 



      table.addCell(jsonobj.get("Modeltype").getAsString()); 
      table.addCell(""+jsonobj.get("Mintemperature").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
      table.addCell(""+jsonobj.get("Maxtemperature").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
      table.addCell(""+jsonobj.get("Avgtemperature").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
      table.addCell(""+jsonobj.get("Stdtemperature").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
      table.addCell(""+jsonobj.get("Mkttemperature").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
      if(measurementType.equals("TempHumi")){ 
       table.addCell(""+jsonobj.get("Minhumidity").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
       table.addCell(""+jsonobj.get("Maxhumidity").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
       table.addCell(""+jsonobj.get("Avghumidity").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
       table.addCell(""+jsonobj.get("Stdhumidity").getAsBigDecimal().setScale(2, RoundingMode.HALF_UP)); 
       table.addCell("-"); 
      } 


     } 

     table.completeRow(); 
     table.writeSelectedRows(0, -1, document.left(), document.top() 
       - document.topMargin() * 3 - 10, writer.getDirectContent()); 
     signature.writeSelectedRows(0, -1, document.left(), 
       document.bottom() + document.bottomMargin() * 2, 
       writer.getDirectContent()); 
     header.writeSelectedRows(0, -1, document.left(), document.top(), 
       writer.getDirectContent()); 


    } catch (DocumentException e) { 
     System.err.println(e); 
    } 
    document.close(); 
    content.close(); 

Я построение графика изображений из SVG и данных таблиц заполняется из базы данных

обработчиков событий для добавления колонтитула с страницей Х Y

public class PdfService extends PdfPageEventHelper { 
/** The header text. */ 
String header; 
/** The template with the total number of pages. */ 
PdfTemplate total; 

/** 
* Fills out the total number of pages before the document is closed. 
* 
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter, 
*  com.itextpdf.text.Document) 
*/ 
@Override 
public void onCloseDocument(PdfWriter writer, Document document) { 
    total.reset(); 
    ColumnText 
      .showTextAligned(total, Element.ALIGN_LEFT, 
        new Phrase(String.valueOf(writer.getPageNumber() - 1)), 
        2, 2, 0); 

} 

/** 
* Adds a header to every page 
* 
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter, 
*  com.itextpdf.text.Document) 
*/ 
@Override 
public void onEndPage(PdfWriter writer, Document document) { 

    PdfPTable table = new PdfPTable(4); 
    try { 
     table.setWidths(new float[] { (float) (2.25), (float) (1.5), 11, 13 }); 
     table.setTotalWidth(document.getPageSize().getWidth() 
       - document.leftMargin() - document.rightMargin()); 
     table.setLockedWidth(true); 
     table.setWidthPercentage(100); 
     table.getDefaultCell().setFixedHeight(20); 
     table.getDefaultCell().setBorder(Rectangle.NO_BORDER); 

     table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); 
     table.addCell(String.format("Page %d of", writer.getPageNumber())); 
     Image img = Image.getInstance(total); 
     Chunk conte = new Chunk(img, 0, 0); 
     Phrase chunk = new Phrase(conte); 

     PdfPCell cell = new PdfPCell(chunk); 
     cell.setBorder(Rectangle.NO_BORDER); 
     cell.setHorizontalAlignment(Element.ALIGN_LEFT); 
     cell.setVerticalAlignment(Element.ALIGN_TOP); 

     table.addCell(cell); 
     table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); 
     table.addCell("SuperAdmin"); 
     table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); 
     table.addCell(header); 
     table.writeSelectedRows(0, -1, document.leftMargin(), 
       document.bottom(), writer.getDirectContent()); 

    } catch (DocumentException de) { 
     throw new ExceptionConverter(de); 
    } 
} 

/** 
* Creates the PdfTemplate that will hold the total number of pages. 
* 
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter, 
*  com.itextpdf.text.Document) 
*/ 
@Override 
public void onOpenDocument(PdfWriter writer, Document document) { 
    total = writer.getDirectContent().createTemplate(15, 14); 
    // total.setBoundingBox(new Rectangle(-1, 6, 20, 20)); 
} 

/** 
* Allows us to change the content of the header. 
* 
* @param header 
*   The new header String 
*/ 
public void setHeader(String header) { 
    this.header = header; 
} 
} 
+0

Они не _darker _... они ** ** смелее. – Astrobleme

+0

хорошо .. спасибо за исправление..хорошо я ничего не установил, чтобы сделать их полужирным – Gowrish

+0

Ну ... тогда _Что вы действительно сделали? – Astrobleme

ответ

3

В старые времена, когда у людей была одна программа шрифтов для одного обычного шрифта и никакого отдельного файла шрифта для жирного шрифта, люди нашли способы обойти эту проблему, а Adobe Reader - объявление чтобы сделать эту обходную работу.

Обходной путь состоит в том, что он записывает одно и то же содержимое дважды (или больше) в том же положении. Когда вы добавляете «Страница 1 из 2» один раз, шрифт отображается как обычный шрифт. Когда вы добавляете его дважды, шрифт отображается в виде жирного шрифта.

Это то, что происходит в вашем случае: вы добавляете нижний колонтитул дважды. Это неправильно:

document.open(); 
PdfService event = new PdfService(); 
event.setHeader(date.toString()); 
event.onOpenDocument(writer, document); 
event.onEndPage(writer, document); 
event.onCloseDocument(writer, document); 
writer.setPageEvent(event); 

вы вызываете event.onEndPage() себя, добавляя FOOTER в первый раз. Когда страница завершена, iText вызывает метод onEndPage() второй раз, добавив нижний колонтитул еще раз, в результате получится полужирный шрифт.

Вы должны адаптировать свой код так:

PdfService event = new PdfService(); 
event.setHeader(date.toString()); 
writer.setPageEvent(event); 
document.open(); 

Вы должны объявить событие в PdfWriter инстанции перед тем открытия документа. Вы не должны называть onOpenDocument(), onEndPage() и onCloseDocument() способами самостоятельно! Они называются внутри iText.

Вы также должны обновить до последней версии по причинам, указанным на FAQ. Using Open Source and contributing nothing in return is unwise. Supporting your open source communities isn’t charity, it’s good business.

enter image description here

+0

Спасибо за ваш ответ. Я постигал усилия, стоящие за такими разработчиками, как ты. Я тоже начал твою статью своему коллеге ... прямо сейчас делаю RND .. скоро перейдем к последней версии .. я прочитал твою книгу iText в действии .. Потрясающие! – Gowrish

+0

Я получил этот нижний колонтитул, но заголовок все еще темнее второй страницы. Попробуйте удалить document.newPage(), но контент будет перекрываться на той же странице. – Gowrish

+0

Можете ли вы поделиться PDF? Таким образом, мы можем проверить, добавлен ли текст еще дважды. Разница в цвете также может быть вызвана режимом смешивания. Черные на черно-белых страницах могут отличаться от черных на цветных страницах, поскольку в прежнем DeviceGray используется как цветовое пространство, тогда как DeviceCMYK может использоваться в последнем. В этом случае использование 'writer.setRgbTransparencyBlending()' может сделать трюк. (Это проблема, которая неоднократно обсуждалась в комитете ISO для PDF). –

Смежные вопросы