当前位置: 首页 > 面试题库 >

如何使用iText库5.5.2为整个pdf页面绘制边框

亢保赫
2023-03-14
问题内容

如标题中所述,如何使用iText库为所有生成的pdf页面绘制带有“红色”颜色,宽度描边5的边框。我尝试了一些代码,但没有结果。

(1)

                    PdfPTable table = new PdfPTable(1);
                    table.setWidthPercentage(99);
                    table.setLockedWidth(true);

                    PdfPCell cell = new PdfPCell();
                    cell.setFixedHeight(PageSize.A4.getHeight());


                    document.add(table);
(2)

                    PdfContentByte content = PdfWriter.getInstance(document, fout).getDirectContent();
                    Rectangle pageRect = document.getPageSize();

                    pageRect.setLeft(pageRect.getLeft() + 10);
                    pageRect.setRight(pageRect.getRight() - 10);
                    pageRect.setTop(pageRect.getTop() - 10);
                    pageRect.setBottom(pageRect.getBottom() +10);

                    content.setColorStroke( BaseColor.BLUE);
                    content.rectangle(pageRect.getLeft(), pageRect.getBottom(), pageRect.getWidth(), pageRect.getHeight());
                    content.setLineWidth(10);
                    content.stroke();
                    content.fillStroke();

这些方法没有结果,谢谢!

编辑
感谢Bruno Lowagie的回应,我改变了自己的方法。该示例的工作原理很吸引人,但是我无法将其放入代码中。

这是我的代码:按下按钮,PDF文件将在指定地址生成。稍后我将添加更多内容,但现在让我们坚持生成pdf文件。

   SaveToSD = (Button)findViewById(R.id.SaveToMemoryCard_xml);
    SaveToSD.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View sssdd)
        {
            String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/ConcreteProject";
            File dir = new File(path);
            if (!dir.exists())
                dir.mkdirs();
            Log.d("PDFCreator", "PDF Path: " + path);

            // Incremental Process of Creating File(s).
            String pdfName = "SDG_Created_pdf.pdf";
            int num = 0;
            File file = new File(dir, pdfName);
            while (file.exists()) {
                num++;
                pdfName = "SDG_Created_pdf" + num + ".pdf";
                file = new File(dir, pdfName);
            }


            try {

                new ConAccept_Result().createPdf(pdfName);


            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }//End Of onClick(View sssdd).
    });

这是方法/类定义:

public class RedBorder extends PdfPageEventHelper {
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        PdfContentByte canvas = writer.getDirectContent();
        Rectangle rect = document.getPageSize();
        rect.setBorder(Rectangle.BOX); // left, right, top, bottom border
        rect.setBorderWidth(5); // a width of 5 user units
        rect.setBorderColor(BaseColor.RED); // a red border
        rect.setUseVariableBorders(true); // the full width will be visible
        canvas.rectangle(rect);
    }
}

public void createPdf(String stringfile) throws IOException, DocumentException {
    // step 1
    com.itextpdf.text.Document document = new com.itextpdf.text.Document();

    // step 2
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(stringfile));
    RedBorder event = new RedBorder();
    writer.setPageEvent(event);
    // step 3
    document.open();
    // step 4

    Chunk chunk = new Chunk("Lovin' iText - Lovin' iText");
    chunk.setTextRenderMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE, 0.3f, BaseColor.CYAN);
    document.add(chunk);

    // step 5
    document.close();
}

运行da app后,我创建了一个名为i的文件夹,但是没有PDF文件!

非常感谢..


问题答案:

阅读您的问题,似乎很明显您需要页面事件。您的尝试只会添加一次边框,而您可能想在每个页面上添加一个边框。

请看一下PageBorder示例。在此示例中,您将找到PageEvents名为的接口的实现RedBorder:

public class RedBorder extends PdfPageEventHelper {
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        PdfContentByte canvas = writer.getDirectContent();
        Rectangle rect = document.getPageSize();
        rect.setBorder(Rectangle.BOX); // left, right, top, bottom border
        rect.setBorderWidth(5); // a width of 5 user units
        rect.setBorderColor(BaseColor.RED); // a red border
        rect.setUseVariableBorders(true); // the full width will be visible
        canvas.rectangle(rect);
    }
}

onEndPage()每次页面结束时都会自动触发该方法(请勿使用该onStartPage()方法添加内容)。

在此方法的实现中,我们要求document对象提供其当前页面大小。请注意,document传递给事件的实例的类型为PdfDocument。它不为在所使用的相同的文档createPdf()的方法。

我们根据需要调整矩形。我们将边框设置BOX为要在左侧,右侧,顶部和底部添加边框。我们定义边框的宽度(在本例中为5个用户单位),并定义颜色。

如果在此停下来,将绘制一个边框,边框为5个用户单位,但您只能看到2.5个用户单位的行,因为5个用户单位的另一半将位于页面的可见区域之外。

您可以通过使用10个用户单位的宽度或将变量borders标志设置为来避免这种情况true。

现在,我们要做的就是将rect对象传递给rectangle()方法。此方法与您使用的同名方法有所不同,因为它还会描边矩形。



 类似资料:
  • 问题内容: 我想通过iText将Swing JComponent打印到pdf。 不幸的是,PDF文件中未显示任何内容。你知道如何解决这个问题吗? 问题答案: 我已经弄清楚添加addNotify和验证帮助。

  • 我知道如何生成单个超文本标记语言页面。我想知道如何从多个超文本标记语言页面生成的pdf生成单个pdf页面。 例如,有和另一个文件我可以生成单独的pdf文件和分别来自html。我可以将它们写入文件系统,然后像iTextConcatenate示例中那样连接它们。 我只是想知道我是否可以在不将它们写入文件系统的情况下动态地组合此操作。我无法识别丢失的链接

  • 我已经编写了执行以下操作的代码: 以特定页面大小(例如8.5英寸x 11英寸)的PDF为例 为此,我使用方法从原始PDF获取当前页面,然后使用方法将原始页面放置到新PDF的当前页面上。 我的新挑战是,在将原始PDF添加到新PDF之前,我需要裁剪它。例如,假设我想在强制使用之前将原始PDF裁剪2英寸。输入PDF仍然是8.5英寸x11英寸,新PDF仍然是17英寸x11英寸,但新PDF中原始PDF的两个

  • 问题内容: 在我的pdf文件中,我需要有多个页眉和页脚。在页眉中,我希望标题标题位于左侧,而某些文本位于中心。 同样,在页脚中,我需要在左侧打印公司名称,在中心打印页码,并在右侧打印有关表格内容的一些信息。 我看过很多文章,但是我没有正确的想法来创建它,有人请帮助我提供一些示例代码片段。 问题答案: 页眉和页脚应使用“页面事件”添加。如果您需要一些示例,只需在官方网站上查找关键字header /

  • 问题内容: 我编写的代码可以一次打开16位数字。目前,它们都以单独的图形打开。我希望他们在同一页面上全部打开。不一样的图。我希望在单个页面/窗口上有16个独立的图形。同样由于某种原因,numbins和defaultreallimits的格式也无法保存在图1之前。我是否需要使用subplot命令?我不明白为什么我必须这样做,但不知道我还要做什么? 问题答案: 要回答您的主要问题,您想使用subplo

  • 免责声明: 我使用的是iText5。我知道这通常不受欢迎(相对于使用iText7),但我正在使用大量使用iText5的遗留代码,升级不在我的控制范围内。 null 进展/办法: 我扩展了以生成包含字体信息(大小和系列、粗体或斜体等)以及位置信息(相对于绝对坐标系,原点位于输入PDF第一页的左上角)的XML。 然后逐页生成一个新的PDF(根据上面概述的要求,每个页都是所需的长度),根据每个新页的边界