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

Android 如何使用iText library 5.5.2为整个pdf页面绘制边框,android,pdf,border,itext,Android,Pdf,Border,Itext,如标题所述,如何使用iText库为所有生成的pdf页面绘制“红色”边框,宽度笔划为5。我试过一些密码,但没有结果 (一) (二) 那些方法没有效果,谢谢 编辑 我改变了我的方法,也感谢布鲁诺·洛瓦吉的回应。这个例子很有魅力,但我无法将它融入我的代码中 这是我的代码:按下一个按钮,PDF文件将在指定的地址生成。稍后我将添加更多内容,但现在让我们继续生成pdf文件 下面是方法/类的定义: public class RedBorder extends PdfPageEventHelper {

如标题所述,如何使用iText库为所有生成的pdf页面绘制“红色”边框,宽度笔划为5。我试过一些密码,但没有结果

(一)

(二)

那些方法没有效果,谢谢


编辑 我改变了我的方法,也感谢布鲁诺·洛瓦吉的回应。这个例子很有魅力,但我无法将它融入我的代码中

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

下面是方法/类的定义:

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应用程序后,创建了一个名为的文件夹,但没有PDF文件


非常感谢。

阅读您的问题,显然您需要一个页面事件。您的尝试将只添加一次边框,而您可能希望为每个页面添加边框

请看一看这个例子。在本例中,您将发现名为
RedBorder
PageEvents
接口的实现:

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()
方法添加内容)

在该方法的实现中,我们询问
文档
对象其当前页面大小。请注意,传递给事件的
文档
实例的类型为
PdfDocument
。它与
createPdf()
方法中使用的文档不同

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

如果您停在那里,将绘制一个边框为5个用户单位的矩形,但您只能看到2.5个用户单位的线条,因为5个用户单位的另一半将位于页面的可见区域之外

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


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

阅读您的问题,显然您需要一个页面事件。您的尝试将只添加一次边框,而您可能希望为每个页面添加边框

请看一看这个例子。在本例中,您将发现名为
RedBorder
PageEvents
接口的实现:

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()
方法添加内容)

在该方法的实现中,我们询问
文档
对象其当前页面大小。请注意,传递给事件的
文档
实例的类型为
PdfDocument
。它与
createPdf()
方法中使用的文档不同

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

如果您停在那里,将绘制一个边框为5个用户单位的矩形,但您只能看到2.5个用户单位的线条,因为5个用户单位的另一半将位于页面的可见区域之外

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


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

在SaveToSD的onClick部分中有一些更改。改变这些:

 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();
        }
为此:

            String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/ConcreteProject";
            File dir = new File(path);
            if(!dir.exists())
                dir.mkdirs();

            //Incremental
            String NameWithCounter = "/ConcreteProject/myPDFfile_1.pdf";
            String DEST = Environment.getExternalStorageDirectory().getAbsolutePath()+NameWithCounter;
            //int FileCounter = 1;
            File real_file = new File(DEST);
            while(real_file.exists()){
                FileCounter++;
                NameWithCounter = "/ConcreteProject/myPDFfile_"+FileCounter+".pdf";
                DEST = Environment.getExternalStorageDirectory().getAbsolutePath()+NameWithCounter;
                real_file = new File(DEST);
            }

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

因此,当用户按Save to Memory时,将生成PDF文件。例如,如果用户按下4次,将有4个不同的PDF文件,文件名为增量。

在SaveToSD的onClick部分中有一些更改。改变这些:

 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();
        }
为此:

            String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/ConcreteProject";
            File dir = new File(path);
            if(!dir.exists())
                dir.mkdirs();

            //Incremental
            String NameWithCounter = "/ConcreteProject/myPDFfile_1.pdf";
            String DEST = Environment.getExternalStorageDirectory().getAbsolutePath()+NameWithCounter;
            //int FileCounter = 1;
            File real_file = new File(DEST);
            while(real_file.exists()){
                FileCounter++;
                NameWithCounter = "/ConcreteProject/myPDFfile_"+FileCounter+".pdf";
                DEST = Environment.getExternalStorageDirectory().getAbsolutePath()+NameWithCounter;
                real_file = new File(DEST);
            }

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

因此,当用户按Save to Memory时,将生成PDF文件。例如,如果用户按4次,将有4个不同的PDF文件,文件名为增量。

我也是这样做的

PdfCopy copy = new PdfCopy(document, bout);
document.open();
......
//read the PDF however you want to PDFReader testPdf 

for (int page = 0; page < noOfPages; ) {
    PdfImportedPage importedPage = copy.getImportedPage(testPdf, ++page);
    PageStamp pageStamp = copy.createPageStamp(importedPage);
    addHilitePageBlock(pageStamp);
    copy.addPage(importedPage);
}
copy.freeReader(testPdf);
testPdf.close();
......



public void addPageBlock(PageStamp stamp) throws IOException {
    PdfContentByte canvas = stamp.getOverContent();
    drawRectangle(canvas, PageSize.A5.getWidth(), PageSize.A5.getHeight());
    stamp.alterContents();
}
public void drawRectangle(PdfContentByte content, float width, float height) {
    content.saveState();
    PdfGState state = new PdfGState();
    state.setFillOpacity(0.0f);
    content.setGState(state);
    content.setColorStroke(BaseColor.RED);
    content.setLineWidth(6);
    content.rectangle(17, 17, width + 155, height+ 145);
    content.fillStroke();
    content.restoreState();
}
PdfCopy copy=新的PdfCopy(文件,布特);
document.open();
......
//阅读PDF,但你想阅读PDFReader testPdf
对于(int page=0;page
我也是这样做的

PdfCopy copy = new PdfCopy(document, bout);
document.open();
......
//read the PDF however you want to PDFReader testPdf 

for (int page = 0; page < noOfPages; ) {
    PdfImportedPage importedPage = copy.getImportedPage(testPdf, ++page);
    PageStamp pageStamp = copy.createPageStamp(importedPage);
    addHilitePageBlock(pageStamp);
    copy.addPage(importedPage);
}
copy.freeReader(testPdf);
testPdf.close();
......



public void addPageBlock(PageStamp stamp) throws IOException {
    PdfContentByte canvas = stamp.getOverContent();
    drawRectangle(canvas, PageSize.A5.getWidth(), PageSize.A5.getHeight());
    stamp.alterContents();
}
public void drawRectangle(PdfContentByte content, float width, float height) {
    content.saveState();
    PdfGState state = new PdfGState();
    state.setFillOpacity(0.0f);
    content.setGState(state);
    content.setColorStroke(BaseColor.RED);
    content.setLineWidth(6);
    content.rectangle(17, 17, width + 155, height+ 145);
    content.fillStroke();
    content.restoreState();
}
PdfCopy copy=新的PdfCopy(文件,布特);
document.open();
......
//阅读PDF,但你想阅读PDFReader testPdf
对于(int page=0;page