我正在尝试使用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;
}
当我执行第二个类时,它似乎将原始文档视为空白。然后在原有内容的基础上写下新段落。我知道我错过了什么,只是不确定那是什么。
每次都需要重新打开文档吗?如果您保持文档打开,您可以随心所欲地追加内容,并且不必处理内容重叠的问题。
如果这是一个要求,那么你将不得不自己跟踪最后一个免费内容位置,并将其重置为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,我想生成这里的类。提前谢谢。