当前位置: 首页 > 知识库问答 >
问题:

pdfBox-Android添加页面文本覆盖

白浩荡
2023-03-14

坚持使用PDFBox Android,PDFBox Android:1.8.9.0

我加载pdf文件的第一页,在其中写入文本,并将此页面导入最终文档的新页面。

问题是,当创建新页面时,它会使用包含以前文本的最后一页
所以,第一页是可以的,但是下一页有重叠的文本。。

private File writeReport() {
    File fileSource = new File(getActivity().getApplicationContext().getExternalCacheDir(), "fileSource.pdf");

    // get file model in assets
    InputStream inputAsset = null;
    try {
        inputAsset = getActivity().getApplicationContext().getResources().getAssets().open("file_model.pdf");
    } catch (IOException e) {
        e.printStackTrace();
    }

    // copy file model in fileSource
    try {
        OutputStream outputStream = new FileOutputStream(file);
        byte buffer[] = new byte[1024];
        int length = 0;

        while ((length = inputAsset.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
        outputStream.close();
        inputAsset.close();
    } catch (IOException e) {
        System.out.print("Copy assets : IOException" + e.getMessage());
    }

    File fileTarget = new File(getActivity().getApplicationContext().getCacheDir(), "fileTarget.pdf");


    try {
        PDFBoxResourceLoader.init(getActivity().getApplicationContext());       // init lib

        PDDocument documentSource = PDDocument.load(fileSource);
        PDDocument documentTarget = new PDDocument();

        // iteration == a new page
        for(int i=0 ; i < 3 ; i++)
        {
            PDPage page = documentSource.getDocumentCatalog().getPages().get(0);
            PDPageContentStream contentStream = new PDPageContentStream(documentSource, page, true, true);

            PDFont font1 = PDType1Font.HELVETICA;

            float startY = page.getMediaBox().getUpperRightY();
            float factor = 2.83f;

            page.getStream();

            // add text
            contentStream.beginText();
            contentStream.setFont(font1, 10);
            contentStream.newLineAtOffset(factor * 60, startY - (factor * 53));
            contentStream.showText("test text" + i);
            contentStream.endText();

            contentStream.close();

            // import source page to output file->  Problem here ! new page contain old overlay text... 
            documentTarget.importPage(page);
        }
        documentTarget.save(fileTarget);
        documentTarget.close();
        documentSource.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
    return fileTarget;
}

有没有办法在每次迭代中都有新的页面?谢谢

共有1个答案

韩景辉
2023-03-14

问题是您重用了同一个PDPage对象,这导致它包含上一次迭代的文本。解决方案:使用

documentTarget.importPage(page)

和那个一起工作。因为这是一个新的PDPage对象,所有内容都已克隆。所以你的新代码如下:

    // iteration == a new page
    for(int i=0 ; i < 3 ; i++)
    {
        PDPage page = documentSource.getDocumentCatalog().getPages().get(0);
        page = documentTarget.importPage(page); // this is now a new PDPage object
        PDPageContentStream contentStream = new PDPageContentStream(documentSource, page, true, true);

        PDFont font1 = PDType1Font.HELVETICA;

        float startY = page.getMediaBox().getUpperRightY();
        float factor = 2.83f;

        page.getStream();

        // add text
        contentStream.beginText();
        contentStream.setFont(font1, 10);
        contentStream.newLineAtOffset(factor * 60, startY - (factor * 53));
        contentStream.showText("test text" + i);
        contentStream.endText();

        contentStream.close();            
    }
 类似资料:
  • 主要内容:将页面添加到PDF文档,示例在前一章中,我们已经学习了如何创建PDF文档。 创建PDF文档后,我们需要添加页面。 现在来了解如何在PDF文档中添加页面。 将页面添加到PDF文档 可以通过实例化类并使用类的方法将其添加到PDF文档来创建空白页面。 以下是创建一个空文档并向其中添加页面的步骤。 第1步:创建空白文档 通过实例化类创建一个空的PDF文档,如下所示。 第2步:创建一个空白页面 类表示PDF文档中的一个页面,因此可以通

  • 主要内容:将文本添加到现有的PDF文档,示例在前一章中,我们讨论了如何将页面添加到PDF文档。 在本章中,我们将讨论如何将文本添加到现有的PDF文档。 将文本添加到现有的PDF文档 可以使用PDFBox库将内容添加到文档,它提供一个名称为的类,其中包含在的页面中插入文本,图像和其他类型内容所需的方法。 以下是创建空白文档并将内容添加到其中的页面的步骤。 第1步:加载现有文档 使用类的方法加载现有文档。 因此,请实例化此类并加载所需的文档,如

  • 主要内容:示例在前一章中提供的示例中,学习了如何在PDF中向页面添加文本,但通过此程序,只能添加适合单行的文本。 如果您尝试添加更多内容,则不会显示超出行间距的所有文字。 例如,如果传递以下字符串在上一章中执行上述程序,则只会显示其中的一部分。 用上面提到的字符串替换上一章中例子的字符串文本并执行它。 执行后,将得到类似以下输出。 如果仔细观察输出,可以看到只显示了一部分字符串。 要将多行添加到PDF,需要使用

  • 我一直在尝试编辑PDF文档以预填充表单条目。我让它(某种程度上)起作用了。我添加的文本很好。然而,已经存在的其他文本似乎已被替换为“ 救命啊!

  • 页面窗格以缩略图显示仪表板中的所有页面。 添加一个新页面 在仪表板选项卡中,点击页面窗格上的“+”按钮。 将添加一个空白页到仪表板并已选择。 属性 页面的可用属性: 选项 描述 页面大小 自定义仪表板中页面的大小。 背景 设置页面的背景色。如果你选择“图像填充”,则可以选择图像文件和缩放比例选项。 不透明度 设置图像的不透明度。

  • 页面窗格以缩略图显示仪表板中的所有页面。 添加一个新页面 在仪表板选项卡中,点击页面窗格上的“+”按钮。 将添加一个空白页到仪表板并已选择。 属性 页面的可用属性: 选项 描述 页面大小 自定义仪表板中页面的大小。 背景 设置页面的背景色。如果你选择“图像填充”,则可以选择图像文件和缩放比例选项。 不透明度 设置图像的不透明度。