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

使用iText7生成PDFJava

弓嘉纳
2023-03-14

我正在尝试使用iText7将内容添加到现有的PDF中。我已经能够创建新的PDF,并使用段落和表格为其添加内容。然而,一旦我重新打开我创建的PDF并尝试向其写入更多内容,新内容就会开始覆盖旧内容。我希望新内容在旧内容之后附加到文档中。我怎样才能做到这一点?

编辑

这个类设置了一些常见的方法,这些方法将在对PDF文档进行每次更改时执行。

public class PDFParent {

private static Document document;

private static PdfWriter writer;

private static PdfReader reader;

private static PageSize ps;

private static PdfDocument pdfDoc;

public static Document getDocument() {
    return document;
}

public static void setDocument(Document document) {
    PDFParent.document = document;
}

public static void setupPdf(byte[] inParamInPDFBinary){
    writer = new PdfWriter(new ByteArrayOutputStream());

    try {
        reader = new PdfReader(new ByteArrayInputStream(inParamInPDFBinary));           
    } catch (IOException e) {
        e.printStackTrace();
    }

    pdfDoc = new PdfDocument(reader, writer);

    ps = PageSize.A4;
    document = new Document(pdfDoc, ps);
}

public static byte[] writePdf(){        
    ByteArrayOutputStream stream = (ByteArrayOutputStream) writer.getOutputStream();    
    return stream.toByteArray();
}

public static void closePdf(){
    pdfDoc.close();
}

这就是我将内容添加到pdf的方式

public class ActAddParagraphToPDF extends PDFParent{

// output parameters
public static byte[] outParamOutPDFBinary;

public static ActAddParagraphToPDF mosAddParagraphToPDF(byte[] inParamInPDFBinary, String inParamParagraph) throws IOException {
    ActAddParagraphToPDF result = new ActAddParagraphToPDF();

    setupPdf(inParamInPDFBinary);

    //---------------------begin content-------------------//

    getDocument().add((Paragraph) new Paragraph(inParamParagraph));

    //---------------------end content-------------------//

    closePdf();

    outParamOutPDFBinary = writePdf();

    return result;
}

当我执行第二个类时,它似乎将原始文档视为空白。然后在原有内容的基础上写下新段落。我知道我错过了什么,只是不确定那是什么。

共有1个答案

魏凡
2023-03-14

每次都需要重新打开文档吗?如果您保持文档打开,您可以随心所欲地追加内容,并且不必处理内容重叠的问题。

如果这是一个要求,那么你将不得不自己跟踪最后一个免费内容位置,并将其重置为newDocumentRenler

一个矩形足以存储最后一页上剩余的空闲区域。在关闭文档之前,按以下方式将空闲区域保存在某个矩形中:

Rectangle savedBbox = document.getRenderer().getCurrentArea().getBBox();

之后,当您必须重新打开文档时,首先跳到最后一页:

document.add(new AreaBreak(AreaBreakType.LAST_PAGE));

然后重置上次处理文档时留下的空闲区域:

document.getRenderer().getCurrentArea().setBBox(savedBbox);

之后,您可以自由地向文档添加新内容,它将出现在保存的位置:

document.add(new Paragraph("Hello again"));

请注意,如果您知道您正在处理哪些文档(即您可以将最后一个“空闲”位置与文档的ID相关联),并且此文档不会在您的环境之外更改,则此方法可以工作。如果不是这样,我建议您查看内容提取,特别是PdfDocumentContentParser。它可以帮助您提取页面上的内容,并确定它占据的位置。然后,您可以计算页面上的空闲区域,并使用document.get渲染器()。getMONtArea()。setBBox我在上面描述的方法将DocumentRenler指向要将内容写入的正确位置。

 类似资料:
  • 我正在尝试从预定义的HTML内容生成PDF。我设法生成了内容,但没有所需的HTML页眉、HTML页脚和阿拉伯语也不受支持。 我的要求: > 阿拉伯语支持。 生成超过10页的能力。 页脚可能因页而异。 有一个Web应用程序向WCF服务发送请求,该服务返回一个包含PDF的字节数组。 所以,我一直在寻找一个好的工具,我发现SelectPdf,它是完美的,除了它不是免费的,所以唯一的解决方案是IText7

  • 我正在使用,我已经能够获得一个html页面并为该页面生成pdf,但我需要从多个html页面生成一个pdf文档,并用页面分隔。例如:我有,。我需要一份3页的pdf文档,第一页的内容为之类的。。。 这是我的代码,它适用于一个html页面: 是否可以针对多个html页面进行循环,为每个html页面向PdfDocument添加一个新页面,然后仅生成一个pdf,每个html页面生成一个页面? 更新 我一直在

  • 在iText5中,可以像这样开始绘制Graphics2D对象 “writer”是“PdfWriter”的一个实例。 PdfContentByte在iText7中不存在,我还没有找到一种方法让Graphics2D参与进来。还有可能吗? 我完全知道现在有了画布,你可以画圆、矩形、线,。。。但这将意味着重新编写所有现有代码,因此,如果您仍能以某种方式使用Graphics2D,这将是首选的方式。

  • 这是我尝试过的代码,但我得到以下异常: iText。内核PDFEException:“无法在已刷新的页面上绘制元素。” 我需要在最后添加页码,因为在生成pdf的内容后,我生成了一个目录并将其移动到文档的开头。因此,我只知道生成所有页面后的页码。

  • 可以使用Spring RestDocs生成的另一件事是Spring Cloud Contract DSL文件和文档。如果您将其与Spring Cloud WireMock相结合,那么您将获得合同和存根。 提示 您可能会想知道为什么该功能在WireMock模块中。来想一想,它确实有道理,因为只生成合同并且不生成存根就没有意义。这就是为什么我们建议做这两个。 我们来想象下面的测试: this.mo

  • 你好。我可以使用SOAPMessage从java项目中的web服务生成类吗?。这是WS,我想生成这里的类。提前谢谢。