gpt4 book ai didi

java - PdfBox-Android添加页面文字叠加

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:28 25 4
gpt4 key购买 nike

卡在 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;
}

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

最佳答案

问题在于您重复使用了相同的 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();
}

关于java - PdfBox-Android添加页面文字叠加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34494419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com