【问题标题】:itext font color gets darker in first pageitext 字体颜色在第一页变暗
【发布时间】:2014-05-29 09:52:29
【问题描述】:

我正在使用 iText 2.1.7,我正在使用 writer.getDirectcontent() 方法在绝对位置添加页眉和页脚。除了第一页中的字体比第二页更暗之外,一切正常。

注意第一页和第二页的页眉和页脚

有什么帮助吗?

这就是我所做的

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 页 X 添加页脚的事件处理程序

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;
}
}

【问题讨论】:

  • 他们不是更黑...他们是更大胆
  • 好的..谢谢你的更正..无论如何我没有设置任何东西让它们变粗
  • 嗯...那么你到底做了什么
  • 更新问题供您参考..谢谢
  • 嗯...破译代码需要一些时间...两个文档的大小Dimension)是否相同?

标签: java spring-mvc pdf-generation itext


【解决方案1】:

在过去,当人们对一种常规字体使用一个字体程序,而对粗体字体没有单独的字体文件时,人们找到了解决这个问题的方法,而 Adob​​e Reader 适应了这种解决方法。

解决方法是在同一位置两次(或多次)写入相同的内容。当您添加一次“Page 1 of 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(),第一次添加页脚。页面完成后,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.

【讨论】:

  • 感谢您的回复。我了解像您这样的开发人员背后的努力。也将您的文章转发给我的同事..现在正在做 RND..我很快就会迁移到最新版本..我读过你的书 iText 在行动中......太棒了!
  • 我修复了页脚,但页眉仍然比第二页暗。尝试删除 document.newPage() 但内容在同一页中重叠。
  • 可以分享PDF吗?这样,我们可以检查文本是否仍然被添加两次。颜色的差异也可能是由混合模式引起的。黑白页面上的黑色可能不同于彩色页面上的黑色,因为前者使用 DeviceGray 作为色彩空间,而后者可使用 DeviceCMYK。在这种情况下,使用writer.setRgbTransparencyBlending() 可以解决问题。 (这个问题在ISO PDF委员会里已经讨论过很多次了。)
  • 这里是 pdf drive.google.com/file/d/0B3IRPs7dec7zX1pBOVRCa3ZrdVk/…。在 pdf 中使用 PNG 图像有什么问题吗?
  • 我在 Adob​​e Reader 中打开了 PDF,并将两页并排放置(请参阅添加到我的答案中的屏幕截图)。我看不出有什么不同。你能解释一下问题的本质吗?我必须从哪里看出差异?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2013-01-09
相关资源
最近更新 更多