所以...我一直在尝试使用 itext 文档中提供的示例来合并文档并为合并的结果创建一个目录。但是将页码文本添加到每个页面的部分并没有像我预期的那样工作。发生的情况是添加的文本在某个水平轴上翻转,如下图所示:

此外,用于为添加的文本 ( public T setFixedPosition(int pageNumber, float left, float bottom, float width))设置固定位置的方法的 java 文档对我来说没有意义:
为元素的绝对重新定位设置值。指定的坐标对应于元素的左下角并向上增长。
但是当我运行时setFixedPosition(pageNumber, 0, 0, 50),文本最终出现在左上角,再次翻转。如果我分别使用源 PdfDocument 页面大小的宽度和高度作为左侧和底部位置的参数,它甚至不会到达右下角。
我可能做错了什么或误解了什么。无论哪种方式,这是我正在使用的代码:
private static int copyPdfPages(PdfDocument source, Document document, Integer start, Integer pages, Integer number) {
int oldC;
int max = start + pages - 1;
Text text;
for (oldC = start; oldC <= max; oldC++) {
text = new Text(String.format("Page %d", number));
PageSize pageSize = source.getDefaultPageSize();
source.copyPagesTo(oldC, oldC, document.getPdfDocument());
document.add(new Paragraph(text).setBorder(new SolidBorder(ColorConstants.RED, 1))
.setFixedPosition(number++, pageSize.getWidth() - 55, pageSize.getHeight() - 30, 50));
}
return oldC - start;
}
public static void main(String[] args) throws IOException {
String path = "/path/to/target";
FileOutputStream fos = new FileOutputStream(path);
PdfDocument pdfDocTgt = new PdfDocument(new PdfWriter(fos));
Document document = new Document(pdfDocTgt);
PdfDocument pdfDocSrc = new PdfDocument(new PdfReader(new FileInputStream("path/to/source")));
copyPdfPages(pdfDocSrc, document, 1, pdfDocSrc.getNumberOfPages(), 1);
pdfDocTgt.close();
pdfDocSrc.close();
document.flush();
document.flush();
fos.flush();
fos.close();
}
Run Code Online (Sandbox Code Playgroud)
这是 pdf 来源:https : //drive.google.com/open?id=11_9ptuoRqS91hI3fDcs2FRsIUEiX0a84
请帮助(并抱歉我的英语)。
问题在于,Document.add假设当前页面的当前内容中的指令在其末尾使图形状态基本上恢复到其初始状态(或者期望差异对输出的影响)。
在您的示例 PDF 中,此假设不满足,特别是页面内容说明以
0.750000 0.000000 0.000000 -0.750000 0.000000 841.920044 cm
Run Code Online (Sandbox Code Playgroud)
将当前变换矩阵更改为
前一个更改导致您添加的内容不在页面角落,而是在更靠近中心的某个地方;后者导致它被垂直镜像,更多地到页面底部而不是顶部。
如果不知道页面的当前内容最终是否具有基本恢复的图形状态(通常情况下,如果处理页面内容没有自己生成),则应避免通过Document实例添加内容,而是使用PdfCanvas使用构造函数生成,该构造函数将当前页面内容包装在 save-graphics-state ... restore-graphics-state 信封中。
例如,对于您的任务:
private static int copyPdfPagesFixed(PdfDocument source, PdfDocument target, int start, int pages, int number) {
int oldC;
int max = start + pages - 1;
Text text;
for (oldC = start; oldC <= max; oldC++) {
text = new Text(String.format("Page %d", number));
source.copyPagesTo(oldC, oldC, target);
PdfPage newPage = target.getLastPage();
Rectangle pageSize = newPage.getCropBox();
try ( Canvas canvas = new Canvas(new PdfCanvas(newPage, true), target, pageSize) ) {
canvas.add(new Paragraph(text).setBorder(new SolidBorder(ColorConstants.RED, 1))
.setFixedPosition(number++, pageSize.getWidth() - 55, pageSize.getHeight() - 30, 50));
}
}
return oldC - start;
}
Run Code Online (Sandbox Code Playgroud)
PdfCanvas上面使用的构造函数记录为
/**
* Convenience method for fast PdfCanvas creation by a certain page.
*
* @param page page to create canvas from.
* @param wrapOldContent true to wrap all old content streams into q/Q operators so that the state of old
* content streams would not affect the new one
*/
public PdfCanvas(PdfPage page, boolean wrapOldContent)
Run Code Online (Sandbox Code Playgroud)
像这样使用
try ( PdfDocument pdfDocSrc = new PdfDocument(new PdfReader(SOURCE));
PdfDocument pdfDocTgt = new PdfDocument(new PdfWriter(TARGET)) ) {
copyPdfPagesFixed(pdfDocSrc, pdfDocTgt, 1, pdfDocSrc.getNumberOfPages(), 1);
}
Run Code Online (Sandbox Code Playgroud)
( AddPagenumberToCopy测试testLikeAibanezFixed)
第一个结果页面的顶部如下所示:
| 归档时间: |
|
| 查看次数: |
536 次 |
| 最近记录: |