【问题标题】:Why are images getting cropped while converting Images to PDF using iText library in android为什么在android中使用iText库将图像转换为PDF时图像被裁剪
【发布时间】:2015-01-22 02:04:13
【问题描述】:

在我的应用程序中,我想将用户选择的图像转换为一个 PDF 文件。 我正在使用许多人建议的 iText 库。 用户选择多张图片并用它创建一个 pdf,其中每张图片是 1 个 pdf 页。

我使用的代码如下

    Document document = new Document(PageSize.A4);
            try {

                String path = Environment.getExternalStorageDirectory()+"/PDFile.pdf";

                File file= new File(path);

                if(file.exists())
                {

                }
                else
                {
                    file.createNewFile();
                }


                PdfWriter.getInstance(document,new FileOutputStream(path));

                document.open();

                for(int i =0; i<pdfImage.size();i++)
                {
                    Image image = Image.getInstance(pdfImage.get(i));
                    image.scaleAbsolute(PageSize.A4);
                    image.setAbsolutePosition(0, 0);
                    document.add(image);

                }

                document.close();



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

正在生成 pdf,但图像被裁剪。图像只有一半可见,其余部分被裁剪。

我是否必须为 pdf 设置任何内容以适应图像大小??

或者我是否必须更改或调整图像大小以适应 pdf 页面大小??

请帮忙!!不知道怎么解决???

【问题讨论】:

标签: android pdf itext


【解决方案1】:

当你这样做时:

Document document = new Document();

然后您隐式创建一个文档,其中页面的页面大小称为 A4。即:宽度为 595,高度为 842 个用户单位。

如果您添加较小的图像,它们将不会被裁剪。如果您添加更大的图像。图像将被裁剪...

如果您希望图像完全适合页面,您有两种选择:

  1. 调整页面大小,或
  2. 调整图片大小。

这两个选项是等效的,因为 iText 不会改变图像的分辨率:每个像素都会被保留。

选项 1:

查看我对问题的回答:Adding maps at iText Java

在这个问题中,我这样做:

Image img = Image.getInstance(IMG);
Document document = new Document(img);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
img.setAbsolutePosition(0, 0);
document.add(img);
document.close();

Document 对象接受 Rectangle 作为参数。这个Rectangle 以用户单位定义页面大小。由于Image 类是Rectangle 类的子类,我可以使用Image 实例作为参数来创建Document 实例。

另一种选择是这样做:

Rectangle pagesize = new Rectangle(img.getScaledWidth(), img.getScaledHeight());
Document document = new Document(pagesize);

如果您的文档有不同的页面,则必须在触发新页面之前使用setPageSize() 方法。

选项 2:

查看我对问题的回答:Backgroundimage in landscape and cover whole pdf with iTextSharp

代码看起来像这样(嗯,实际的代码有点不同,但这也可以):

Document document = new Document(PageSize.A4.rotate());
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
Image image = Image.getInstance(IMAGE);
image.scaleAbsolute(PageSize.A4.rotate());
image.setAbsolutePosition(0, 0);
document.add(image);
document.close();

这里我有横向尺寸为 A4 的页面,我缩放图像以使其完全适合页面。这是危险的,因为这会改变图像的纵横比。这可能会导致图像失真。将scaleAbsolute() 替换为scaleToFit() 将避免该问题,但如果图像的纵横比与页面的纵横比不同,则会有一些白边距。

重要提示:请注意,我在这两种情况下都使用了setAbsolutePosition(0, 0);。我正在引入这条线,以便图像的左下角与页面的左下角重合。如果您不这样做,您将看到底部和左侧的边距,并且您的图像将被剪裁到顶部和右侧。

【讨论】:

  • 我如何使用它来将多个图像作为页面放入 pdf 中???我尝试了您的代码,就像在我编辑的问题中一样,我得到了一个只有最后一张图片的单页pdf。请检查并告诉我您的代码哪里出了问题...
  • 每次在当前页面的绝对位置添加图片时都应该添加document.newPage()不是很明显吗? ;-)
  • 对不起,我的错!有效!我不太熟悉在android中玩pdfs..所以我不知道还能写什么..第一次使用它..无论如何,非常感谢!
  • 这些方法我都试过了。但所有这些工作都非常缓慢。我在安卓上使用这个。
  • @AdityaChaudhary 这些方法的 iText 执行速度非常快,因为它们不需要任何图像处理。但是,如果图像非常大,则磁盘访问和为图像分配内存可能会出现问题。也许你的安卓设备很差。您不应该将磁盘访问速度慢、CPU 性能差以及设备内存可能不足归咎于 iText。
【解决方案2】:

这是一篇旧帖子,您可能已经对其进行了整理,但另一种选择是使用 iText 中的表格。

设置文档的边距,然后创建一个表格,其中包含一个跨过允许页面的整个宽度的单元格。当您将图像添加到该单元格时,它将使用单元格尺寸作为图片大小的限制因素,并且应该重新缩放图像以自动适合该单元格。

如果您不喜欢带边框的表格的外观,您可以随时将其关闭,但单元格还可以为您提供一些其他格式选项,例如能够将图像在单元格中居中(在页面上) .

祝你好运。

【讨论】:

  • 嗨 Matthew,感谢您回答有关通过 iText 将图像缩放到页面大小的问题。请您在您的文本中添加一些示例代码,以使您的答案更清楚吗?谢谢。
猜你喜欢
  • 2017-08-17
  • 2019-11-28
  • 2014-06-26
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多