为什么在使用Android中的iText库将图像转换为PDF时图像会被裁剪

时间:2014-11-24 11:13:23

标签: android pdf itext

在我的应用程序中,我想将用户选择的图像转换为单个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页面大小??

请帮忙!!我不知道如何解决这个???

2 个答案:

答案 0 :(得分:10)

执行此操作时:

Document document = new Document();

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

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

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

  1. 调整页面大小,或
  2. 调整图像的大小。
  3. 两个选项都是等价的,因为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);。我正在介绍此行,以便图像的左下角与页面的左下角重合。如果你不这样做,你会看到底部和左边的边距,你的图像将被剪裁到顶部和右边。

答案 1 :(得分:0)

这是一篇旧文章,您可能已经对此进行了整理,但是另一种选择是在iText中使用表格。

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

如果您不喜欢带有边框的桌子的外观,则可以始终将其关闭,但是单元格还可以为您提供其他一些格式设置选项,例如能够将图像居中放置在单元格中(在页面上)

祝你好运。