当我在android中使用itext时创建了空白pdf页面

时间:2016-01-28 13:10:38

标签: android pdf itext

Screen shot 我在pdf文件中添加图像以生成其pdf,因为文档问题是它自动将第一页添加为空白页,其余页面包含正常的图像。那么我应该如何克服这个问题呢。

pdfPath = dir + "/" + txtFileName.getText().toString() + ".pdf";

String pdfFileName = txtFileName.getText().toString() + ".pdf";
PdfWriter writer;
File file = new File(dir, pdfFileName);
Document document = new Document();

try {
     writer = PdfWriter.getInstance(document,
            new FileOutputStream(file));
    HeaderFooterPageEvent event = new HeaderFooterPageEvent();
    writer.setPageEvent(event);
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (DocumentException e) {
    e.printStackTrace();
}
document.open();

Image image = null;

for (int i = 0; i < listofimage.size(); i++) {
    String imgFileName = listofimage.get(i).toString();
    try {

        image = Image.getInstance(imgFileName);
    } catch (BadElementException e) {

        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    }

    float scaler = ((document.getPageSize().getWidth()
            - document.leftMargin() - document.rightMargin()) / image
            .getWidth()) * 90;
    Log.i("Scale Percentage", scaler + "");
    image.scalePercent(scaler);

    try {

        document.newPage();
        document.add(image);
        document.addAuthor("Genetech Solutions");

    } catch (DocumentException e) {
        e.printStackTrace();
    }
}

document.close();

HeaderFooterPageEvent主要包括:

public void onEndPage(PdfWriter writer, Document document)
{
    ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Generated by Snap Scanner Powered By Genetech Solutions"), 180, 30, 0);
    ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("page " + document.getPageNumber()), 550, 30, 0);
}

Screen shot

2 个答案:

答案 0 :(得分:1)

我将您的代码归结为以下测试用例,删除try-catch构造以保持简短并内联页面事件侦听器:

@Test
public void testYasirAhmedKhanOriginal() throws IOException, DocumentException
{
    List<String> listofimage = Collections.nCopies(3, "src/test/resources/mkl/testarea/itext5/layer/Willi-1.jpg");
    // Collections.singletonList("src/test/resources/mkl/testarea/itext5/layer/Willi-1.jpg");
    File file = new File(RESULT_FOLDER, "YasirAhmedKhanOriginal.pdf");

    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    writer.setPageEvent(new PdfPageEventHelper()
    {
        public void onEndPage(PdfWriter writer, Document document)
        {
            ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("Generated by Snap Scanner Powered By Genetech Solutions"), 180, 30, 0);
            ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase("page " + document.getPageNumber()), 550, 30, 0);
        }
    });
    document.open();

    for (int i = 0; i < listofimage.size(); i++)
    {
        String imgFileName = listofimage.get(i).toString();
        Image image = Image.getInstance(imgFileName);

        float scaler = ((document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin()) /
                image.getWidth()) * 90;
        image.scalePercent(scaler);

        document.newPage();
        document.add(image);
        document.addAuthor("Genetech Solutions");
    }

    document.close();
}

UnwantedPage.java

结果:

the result pdf

没有空的首页,应该是一切......

因此,要么OP做了额外的事情导致空白页面,要么他使用了一些旧的iText版本,这可能在这方面有一些错误。

答案 1 :(得分:0)

使用document.newPage()时,您会创建一个新页面。

如果当前页面为空白,则忽略

document.newPage()

我看到你引入了HeaderFooterPageEvent。如果您在此HeaderFooterPageEvent中添加内容,则当前页面不为空白。我想你在这件事上做的事情你不应该这样做。

您也是以错误的顺序执行此操作:

document.newPage();
document.add(image);

首先添加新页面,然后添加图像。 (你有点抱怨说你的文件以空白页开头,这很有趣。)

请注意,如果您在newPage()中没有做错任何事情,那么添加HeaderFooterPageEvent就不会有问题。

为什么不像这样切换这些行:

document.add(image);
document.newPage();

现在您首先添加图像,然后创建新页面。如果页面事件写得正确,这不会导致任何问题。但是,我们无法对该页面事件发表评论,因为您没有共享HeaderFooterPageEvent代码。

最后,这一行也是错误的:

document.addAuthor("Genetech Solutions");

您不应在document.open()之后添加有关作者的元数据。