【问题标题】:How to create sub documents for Itext PDF如何为 Itext PDF 创建子文档
【发布时间】:2016-10-11 16:03:04
【问题描述】:

我的任务是创建一个工作订单应用程序,其中 输出是用于从浏览器打印的 PDF。输出必须是一个 PDF 包含一个或多个“工单”的文件。由于内容长度可变,每个工作订单可能不止一个打印页。每个工单必须有自己的“页”编号。我正在使用 Spring MVC 和 Itext 5。

假设我们有三个工单。第一个将适合打印的 页,第二个需要打印两页,第三个需要打印一页。我们一共打印了四页。

如何做到这一点: 工单一的页码为“1” 工单 2 的页码为“1, 2” 工单三将页码“1”

所以基本上PDF文档将是多个内部的容器 相互独立的文档。

我尝试重置页码并使用页脚进行输出,但这似乎不起作用。我想知道是否有某种方法可以设置我可以控制的自定义页面计数器。

public class PDFBuilder extends AbstractITextPdfView
{

  @Override
  protected void buildPdfDocument(Map<String, Object> model, Document doc,
      PdfWriter writer, HttpServletRequest request, HttpServletResponse response)
      throws Exception
  {

    @SuppressWarnings("unchecked") // TODO replace this with some generic goodness
    List<WorkOrderDto> workOrders = (List<WorkOrderDto>) model.get("workOrders");
    Integer pageCounter = 1;

    // define table header cell
    PdfPCell cell = new PdfPCell();
    cell.setBackgroundColor(BaseColor.BLUE);
    cell.setPadding(5);

    // define font for table header row
    Font font = FontFactory.getFont(FontFactory.HELVETICA);
    font.setColor(BaseColor.WHITE);
    writer.setPageEvent(new Footer(pageCounter));

    for (WorkOrderDto dto : workOrders)
    {
      PdfPTable woHeader = new PdfPTable(4);
      woHeader.setWidthPercentage(100.0f);
      woHeader.setSpacingBefore(10);

      if (dto.getNumber() != null)
      {
        woHeader.addCell("Number: " + dto.getNumber());
      }
      else
      {
        woHeader.addCell("Number: ");
      }

      if (dto.getOwnerNumber() != null)
      {
        woHeader.addCell("Owner: " + dto.getOwnerNumber());
      }
      else
      {
        woHeader.addCell("Owner: ");
      }

      if (dto.getTypeNumber() != null)
      {
        woHeader.addCell("Type: " + dto.getTypeNumber());
      }
      else
      {
        woHeader.addCell("Type: ");
      }

      if (dto.getScheduleDate() != null)
      {
        woHeader.addCell("Open Date: " + dto.getScheduleDate().toString());
      }
      else
      {
        woHeader.addCell("Open Date: ");
      }
      doc.add(woHeader);

      PdfPTable servicesTable = new PdfPTable(4);
      for (ServiceDto serviceDto : dto.getCurrentServices())
      {
        servicesTable.addCell("Number: " + serviceDto.getNumber());
        servicesTable.addCell("Name: " + serviceDto.getName());
        servicesTable.addCell("Description: " + serviceDto.getDescription());
        servicesTable.addCell("Status: " + serviceDto.getStatus());
      }
      doc.add(servicesTable);

      doc.newPage();
      pageCounter++;
    }

  }
}




public class Footer implements PdfPageEvent
{
  Font    ffont = new Font(Font.FontFamily.UNDEFINED, 10, Font.ITALIC);
  Integer pageCounter;

  public Footer(Integer pageCounter)
  {
    this.pageCounter = pageCounter;
  }

  @Override
  public void onOpenDocument(PdfWriter writer, Document document)
  {
  }

  @Override
  public void onStartPage(PdfWriter writer, Document document)
  {
  }

  @Override
  public void onEndPage(PdfWriter writer, Document document)
  {
    PdfContentByte cb = writer.getDirectContent();
    Phrase footer = new Phrase(pageCounter + "", ffont);

    ColumnText.showTextAligned(cb, Element.ALIGN_CENTER,
        footer,
        (document.right() - document.left()) / 2 + document.leftMargin(),
        document.bottom() - 10, 0);
  }

  @Override
  public void onCloseDocument(PdfWriter writer, Document document)
  {
  }

  @Override
  public void onParagraph(PdfWriter writer, Document document, float paragraphPosition)
  {
  }

  @Override
  public void onParagraphEnd(PdfWriter writer, Document document, float paragraphPosition)
  {
  }

  @Override
  public void onChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title)
  {
  }

  @Override
  public void onChapterEnd(PdfWriter writer, Document document, float paragraphPosition)
  {
  }

  @Override
  public void onSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title)
  {
  }

  @Override
  public void onSectionEnd(PdfWriter writer, Document document, float paragraphPosition)
  {
  }

  @Override
  public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text)
  {
  }

}

【问题讨论】:

    标签: itext


    【解决方案1】:

    我想出了自己的解决方案,结果非常简单。我创建了一个名为 PageCounter 的类,它具有一些属性来表示各种计数器。我将它传递给页脚,然后在构建页面时操作属性。

    public class PageCounter
    {
      private Integer currentPage = 1;
      private Integer totalPages  = 1;
    
      public Integer getCurrentPage()
      {
        return currentPage;
      }
    
      public void setCurrentPage(Integer currentPage)
      {
        this.currentPage = currentPage;
      }
    
      public Integer getTotalPages()
      {
        return totalPages;
      }
    
      public void setTotalPages(Integer totalPages)
      {
        this.totalPages = totalPages;
      }
    
      public void increment()
      {
        this.currentPage++;
      }
    
      public void reset()
      {
        this.currentPage = 1;
      }
    
    }
    
    
    public class PDFBuilder extends AbstractITextPdfView
    {
    
      @Override
      protected void buildPdfDocument(Map<String, Object> model, Document doc,
          PdfWriter writer, HttpServletRequest request, HttpServletResponse response)
          throws Exception
      {
    
        @SuppressWarnings("unchecked") // TODO replace this with some generic goodness
        List<WorkOrderDto> workOrders = (List<WorkOrderDto>) model.get("workOrders");
        PageCounter pageCounter = new PageCounter();
    
        // define table header cell
        PdfPCell cell = new PdfPCell();
        cell.setBackgroundColor(BaseColor.BLUE);
        cell.setPadding(5);
    
        // define font for table header row
        Font font = FontFactory.getFont(FontFactory.HELVETICA);
        font.setColor(BaseColor.WHITE);
        writer.setPageEvent(new Footer(pageCounter));
    
        for (WorkOrderDto dto : workOrders)
        {
          PdfPTable woHeader = new PdfPTable(4);
          woHeader.setWidthPercentage(100.0f);
          woHeader.setSpacingBefore(10);
    
          if (dto.getNumber() != null)
          {
            woHeader.addCell("Number: " + dto.getNumber());
          }
          else
          {
            woHeader.addCell("Number: ");
          }
    
          if (dto.getOwnerNumber() != null)
          {
            woHeader.addCell("Owner: " + dto.getOwnerNumber());
          }
          else
          {
            woHeader.addCell("Owner: ");
          }
    
          if (dto.getTypeNumber() != null)
          {
            woHeader.addCell("Type: " + dto.getTypeNumber());
          }
          else
          {
            woHeader.addCell("Type: ");
          }
    
          if (dto.getScheduleDate() != null)
          {
            woHeader.addCell("Open Date: " + dto.getScheduleDate().toString());
          }
          else
          {
            woHeader.addCell("Open Date: ");
          }
          doc.add(woHeader);
    
          PdfPTable servicesTable = new PdfPTable(4);
          for (ServiceDto serviceDto : dto.getCurrentServices())
          {
            servicesTable.addCell("Number: " + serviceDto.getNumber());
            servicesTable.addCell("Name: " + serviceDto.getName());
            servicesTable.addCell("Description: " + serviceDto.getDescription());
            servicesTable.addCell("Status: " + serviceDto.getStatus());
          }
          doc.add(servicesTable);
    
          doc.newPage();
          pageCounter.reset();
        }
    
    
    
    public class Footer implements PdfPageEvent
    {
      Font        ffont = new Font(Font.FontFamily.UNDEFINED, 10, Font.ITALIC);
      PageCounter pageCounter;
    
      public Footer(PageCounter pageCounter)
      {
        this.pageCounter = pageCounter;
      }
    
      @Override
      public void onOpenDocument(PdfWriter writer, Document document)
      {
      }
    
      @Override
      public void onStartPage(PdfWriter writer, Document document)
      {
      }
    
      @Override
      public void onEndPage(PdfWriter writer, Document document)
      {
        PdfContentByte cb = writer.getDirectContent();
        Phrase footer = new Phrase(pageCounter.getCurrentPage() + "", ffont);
        pageCounter.increment();
    
        ColumnText.showTextAligned(cb, Element.ALIGN_CENTER,
            footer,
            (document.right() - document.left()) / 2 + document.leftMargin(),
            document.bottom() - 10, 0);
      }
    
      @Override
      public void onCloseDocument(PdfWriter writer, Document document)
      {
      }
    
      @Override
      public void onParagraph(PdfWriter writer, Document document, float paragraphPosition)
      {
      }
    
      @Override
      public void onParagraphEnd(PdfWriter writer, Document document, float paragraphPosition)
      {
      }
    
      @Override
      public void onChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title)
      {
      }
    
      @Override
      public void onChapterEnd(PdfWriter writer, Document document, float paragraphPosition)
      {
      }
    
      @Override
      public void onSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title)
      {
      }
    
      @Override
      public void onSectionEnd(PdfWriter writer, Document document, float paragraphPosition)
      {
      }
    
      @Override
      public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text)
      {
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多