gpt4 book ai didi

pdf - 将页码文本添加到 pdf 副本会被 itext 7 翻转/镜像

转载 作者:行者123 更新时间:2023-12-03 22:13:26 30 4
gpt4 key购买 nike

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

enter image description here

此外,用于为添加的文本( public T setFixedPosition(int pageNumber, float left, float bottom, float width) )设置固定位置的方法的 java 文档对我来说没有意义:

Sets values for a absolute repositioning of the Element. The coordinates specified correspond to the bottom-left corner of the element and it grows upwards.



但是当我运行 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();
}

这是 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
将当前变换矩阵更改为
  • 将所有内容缩小到 75% 和
  • 垂直翻转坐标系。

  • 前一个更改导致您添加的内容不在页面角落,而是在更靠近中心的某个地方;后者导致它被垂直镜像,更多地到页面底部而不是顶部。
    修复
    如果不知道页面的当前内容最终是否具有基本恢复的图形状态(通常是处理页面内容未生成的情况),则应避免通过 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;
    }
    ( AddPagenumberToCopy 方法) 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)
    像这样使用
    try (   PdfDocument pdfDocSrc = new PdfDocument(new PdfReader(SOURCE));
    PdfDocument pdfDocTgt = new PdfDocument(new PdfWriter(TARGET)) ) {
    copyPdfPagesFixed(pdfDocSrc, pdfDocTgt, 1, pdfDocSrc.getNumberOfPages(), 1);
    }
    ( AddPagenumberToCopy 测试 testLikeAibanezFixed )
    第一个结果页面的顶部如下所示:
    screen shot

    关于pdf - 将页码文本添加到 pdf 副本会被 itext 7 翻转/镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52743566/

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