【问题标题】:blank pdf page is created when im using itext in android当我在android中使用itext时创建空白pdf页面
【发布时间】:2016-01-28 13:10:37
【问题描述】:

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

【问题讨论】:

  • 请出示您的HeaderFooterPageEvent。我假设你在那里做错了什么,就像@Bruno 在他的回答中所做的那样。
  • 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); }
  • 当我删除 HeaderFooterPageEvent 时它工作正常。但我也需要包括这个
  • 您是否尝试过按照@Bruno 的建议切换线路?
  • 是的,但没有成功

标签: android pdf itext


【解决方案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)

结果:

没有空白的第一页,一切都应该是......

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

【讨论】:

  • 是的@mkl,要么HeaderFooter 有问题,要么他使用的是旧的iText 版本...
  • 考虑到 OP 在对他的问题的评论中说我的代码对他有用,我认为他的 onStartPage 中有一些东西。
  • 啊哈,我没有看到那个评论。通常,当某些事情起作用时,OP 会接受答案。当那没有发生时,我讨厌它。感觉太忘恩负义了。
  • 太棒了!在这种情况下,请接受答案(点击答案左上角的勾号)。
【解决方案2】:

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

如果当前页面为空白,则忽略document.newPage()

我看到你介绍了HeaderFooterPageEvent。如果您在此HeaderFooterPageEvent 中添加内容,则当前页面不是空白的。我猜你在这次活动中做了一些你不应该做的事情。

您的操作顺序也错误:

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

首先添加一个新页面,然后添加一个图像。 (然后您抱怨您的文档以空白页开头,这很有趣。)

请注意,如果您在HeaderFooterPageEvent 中没有做错什么,添加newPage() 不会有问题。

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

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

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

最后,这行也是错的:

document.addAuthor("Genetech Solutions");

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多