【问题标题】:PDF contents are shifted to right and gets cut for wider pagePDF 内容向右移动并被剪切以获得更宽的页面
【发布时间】:2014-10-09 10:20:12
【问题描述】:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Bitmap bmp = Bitmap.createScaledBitmap(pdfBtm, (int) (pdfBtm.getWidth()), (int) (pdfBtm.getHeight()), true);

bmp.compress(CompressFormat.PNG, 0, stream);

byte[] byteArray = stream.toByteArray();

Image img = Image.getInstance(byteArray);

String pdffile = sharedPref.getString(com.appealsoft.i_file_me.Config.PdffileName, ""); 
int pageNumber = sharedPref.getInt(com.appealsoft.i_file_me.Config.PdfpageNumber, 0);

PdfReader reader = new PdfReader(pdffile);

String filename = pdffile.substring(pdffile.lastIndexOf("/") + 1, pdffile.length());
System.out.println("file name is :" + filename);

OutputStream newfile  = new FileOutputStream(new File("/sdcard/" + filename));
Document newDocs = new Document();
PdfWriter writer = PdfWriter.getInstance(newDocs, newfile);
newDocs.open();

for (int i = 1; i <= reader.getNumberOfPages(); i++)
{
    if (i == pageNumber)
    {
        Image img2 = Image.getInstance(byteArray);
        newDocs.add(img2);

        System.out.println(" i was inside...");
    } else {
        Image img2 = Image.getInstance(writer.getImportedPage(reader, i));
        newDocs.add(img2);
    }
}
newDocs.close();

当我使用这种方法创建 PDF 时,PDF 的内容会移到右侧。对于更宽的 PDF 页面,页面的某些部分会被剪切。

有人知道为什么会这样吗?

【问题讨论】:

  • 感谢您纠正我的语法错误.. @Alexis
  • 任何人都知道为什么会这样 - 因为这就是你的代码告诉 iText 做的事情:你从某个源文档(包括它的页边距)中取出一个完整的页面并添加它iText 在有自己的页边距的新页面的正文中排列的东西。您的目标似乎是替换某些文档中的单个页面。为此使用 PdfStamper 或 PdfCopy。
  • 您说得对,先生.. 我想从 pdf 文件中替换特定页面。你能告诉我 pdfCopy 是如何工作的吗,我试过 stamper 但没有解决我的问题。

标签: android pdf itext


【解决方案1】:

当我使用这种方法创建 PDF 时,PDF 的内容会移到右侧。对于更宽的 PDF 页面,页面的某些部分会被剪切。

有人知道为什么会这样吗?

因为这就是代码告诉 iText 要做的事情:它从某个源文档(包括它的边距)中获取一个完整的页面,并将其添加到 iText 在已经有自己的边距的新页面的正文中排列的内容中.

OP 的实际目标似乎是用某些图像替换某些文档中的单个页面。应该使用PdfStamperPdfCopy 实例。

例如使用 PdfStamper 你可以这样做:

PdfReader reader = new PdfReader(SOURCE);
int pageToReplace = NROFPAGETOREPLACE;

List<Integer> pagesToKeep = new ArrayList<Integer>();
for (int i = 1; i <= reader.getNumberOfPages(); i++)
    if (i != pageToReplace) pagesToKeep.add(i);

reader.selectPages(pagesToKeep);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(TARGET));

stamper.insertPage(pageToReplace, reader.getPageSizeWithRotation(1));
Image image = Image.getInstance(IMAGESOURCE);
stamper.getOverContent(pageToReplace).addImage(image, image.getWidth(), 0, 0, image.getHeight(), 30, 30);

stamper.close();

PS:您的 cmets 似乎暗示添加到新页面的图像实际上包含了所有内容。在这种情况下,将上面示例的最后几行替换为

是合适的
Image image = Image.getInstance(IMAGESOURCE);
stamper.insertPage(pageToReplace, new Rectangle(image.getWidth(), image.getHeight());
stamper.getOverContent(pageToReplace).addImage(image, image.getWidth(), 0, 0, image.getHeight(), 0, 0);

stamper.close();

【讨论】:

  • PDFCopy 在其他页面上运行良好.. 但我要替换的页面仍然被剪切。这可能是因为我的位图没有正确转换为字节数组...
  • 您必须调整addImage 调用的参数。例如。最后的 30, 30 导致垂直位移 30 个单位,水平位移 30 个单位。
  • 我早些时候尝试过先生.. 但仍然有同样的问题.. 无论如何可以使用 iText 在 android 中查看 Pdf 页面。我正在使用 PDFViwer,但我认为这导致了我的问题。无论如何可以在android应用程序中查看PDF页面吗?
  • 我早先尝试过,先生.. 但仍然有同样的问题 - 我的答案中的代码对我有用,特别是结合提示 调整参数addImage 通话。请准确解释您使用该解决方案的问题,否则我几乎看不出如何为您提供帮助。 我正在使用 PDFViwer,但我认为这导致了我的问题 - 首先通过在其他查看器上查看有问题的 PDF 来验证您的想法,例如Acrobat 阅读器。
  • 其实我想在 PDF 页面中添加签名。如果我用 Acrobat 阅读器打开它,那么我无法对其应用操作。不是我正在获取 PDF 页面的位图并在其上添加签名图像,然后再次从该位图中使用 iText 创建 PDF。现在,尽管我使用了您的解决方案,但当 PDF 页面更宽时,我创建的 PDF 没有正确对齐和剪切。
猜你喜欢
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2010-10-30
相关资源
最近更新 更多