【问题标题】:Add page numbers to Merged PDF with different Pages sizes using IText API使用 IText API 将页码添加到具有不同页面大小的合并 PDF
【发布时间】:2016-07-08 20:37:40
【问题描述】:

我正在尝试使用页面右上角的 Itext 将页码添加到合并的 PDF 文件中,但我的 pdf 内容大小不同,在尝试打印页面大小时合并 PDF 后,我得到的大小大致相同(每个页面上的高度和宽度),但由于内容大小不同,我无法看到页码。请参阅下面用于合并 PDF 和添加页码的代码和 pdf 附件。

public class PageNumber {

    public static void main(String[] args) {
        PageNumber number = new PageNumber();
        try {
            String DOC_ONE_PATH = "C:/Users/Admin/Downloads/codedetailsforartwork/elebill.pdf";
            String DOC_TWO_PATH = "C:/Users/Admin/Downloads/codedetailsforartwork/PP-P0109916.pdf";
            String DOC_THREE_PATH = "C:/Users/Admin/Downloads/codedetailsforartwork/result.pdf";
            String[] files = { DOC_ONE_PATH, DOC_TWO_PATH };
         Document document = new Document();
         PdfCopy copy = new PdfCopy(document, new FileOutputStream(DOC_THREE_PATH));
         document.open();
         PdfReader reader;
         int n;
         for (int i = 0; i < files.length; i++) {
             reader = new PdfReader(files[i]);
             n = reader.getNumberOfPages();
             for (int page = 0; page < n; ) {
                 copy.addPage(copy.getImportedPage(reader, ++page));
             }
             copy.freeReader(reader);
             reader.close();
         }
         // step 5
         document.close();
            number.manipulatePdf(
                    "C:/Users/Admin/Downloads/codedetailsforartwork/result.pdf",
                    "C:/Users/Admin/Downloads/codedetailsforartwork/PP-P0109916_1.pdf");
        } catch (IOException | DocumentException | APIException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void manipulatePdf(String src, String dest)
            throws IOException, DocumentException, APIException {
        PdfReader reader = new PdfReader(src);
        int n = reader.getNumberOfPages();
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        PdfContentByte pagecontent;
        for (int i = 0; i < n;) {
            pagecontent = stamper.getOverContent(++i);
            System.out.println(i);
            com.itextpdf.text.Rectangle pageSize = reader.getPageSize(i);
            pageSize.normalize();
            float height = pageSize.getHeight();
            float width = pageSize.getWidth();
            System.out.println(width + " " + height);
            ColumnText.showTextAligned(pagecontent, Element.ALIGN_CENTER,
                    new Phrase(String.format("page %d of %d", i, n)),
                    width - 200, height-85, 0);
        }
        stamper.close();
        reader.close();
    }
}

PDF files Zip

【问题讨论】:

    标签: java itext


    【解决方案1】:

    @Bruno 的答案解释和/或参考答案,并解释了手头问题的所有相关事实。

    简而言之,OP的代码的两个问题是:

    • 他使用reader.getPageSize(i);虽然这确实返回了页面大小,但 PDF 查看器不会显示整个页面大小,而只是显示其上的裁剪框。因此,OP 应该使用 reader.getCropBox(i) 代替。根据 PDF 规范,“裁剪框定义了页面内容在显示或打印时应被裁剪(裁剪)到的区域。...默认值为页面的媒体框。”
    • 他使用pageSize.getWidth() 和pageSize.getHeight() 来确定右上角,但应该使用pageSize.getRight() 和pageSize.getTop() 代替。定义 PDF 坐标系的框的左下角可能没有原点。

    【讨论】:

    • 我赞成你这个简洁的解释,但即使这样,右上角似乎并不总是在右上角......
    • @user1566694 你能分享一个例子,即你的代码和它不能使用的示例 PDF 吗?
    • 我正在尝试创建边距。显然,在这样做之后,坐标失去了所有意义......重新审视创建边距的问题......
    • 实际上我使用的是你的代码。这似乎使页面混淆了边界在哪里:stackoverflow.com/questions/21375150/…
    • @user1566694 我根本无法重现您的问题。根据对your recent question 的评论中的要求:请分享一个 PDF 文件,以便我可以重现该问题。
    【解决方案2】:

    我不明白你为什么要这样定义页码的位置:

    com.itextpdf.text.Rectangle pageSize = reader.getPageSize(i);
    pageSize.normalize();
    float height = pageSize.getHeight();
    float width = pageSize.getWidth();
    

    你在哪里使用

    x = width - 200;
    y = height - 85;
    

    这有什么意义?

    如果您有一个A4纵向页面,左下角坐标为(0,0),页码将添加到位置x = 395; y = 757。但是,(0,0) 并不总是左下角的坐标,所以原点在另一个位置的第一个 A4 页面已经将页码放在另一个位置。如果页面大小不同,页码会移动到其他地方。

    就好像您完全不知道以前回答过的问题,例如 How should I interpret the coordinates of a rectangle in PDF? 和 Where is the Origin (x,y) of a PDF page?

    我知道,我知道,在 StackOverflow 上找到这些具体的答案很难,但我花了好几个星期在官方网站上的 StackOverflow 上组织最好的 iText 问题。例如:How should I interpret the coordinates of a rectangle in PDF? 和 Where is the origin (x,y) of a PDF page?

    这些问答甚至可以通过free ebook 获得!如果您花点时间通过阅读文档来了解自己,您会找到问题 How to position text relative to page? 的答案,该问题已在 2013 年的 StackOverflow 上得到解答:How to position text relative to page using iText?

    例如,如果你想把你的页码放在底部和中间,你需要像这样定义你的坐标:

    float x = pageSize.getBottom() + 10;
    float y = pageSize.getLeft() + pageSize.getWidth() / 2;
    ColumnText.showTextAligned(pagecontent, Element.ALIGN_CENTER,
        new Phrase(String.format("page %d of %d", i, n)), x, y, 0);
    

    我希望这个答案能激发您阅读文档的灵感。我花了数周时间整理这些文档,当我发现人们不阅读它时,我感到很沮丧。

    【讨论】:

    • 感谢您的回复布鲁诺。我已经浏览了问答 PDF,但它并没有解决我的问题。如果查看附加的 PDF 文件,第二页 PDF 内容位于页面中间,当我尝试获取页面大小时,我正在获取总页面大小,使用它我无法设置页码。请查看随附的 PDF 一次。
    • 我需要合并文档每页右上角的页码
    • 如果你想让它们出现在右上角,你需要修改代码:x = pageSize.getRight() - 36; y = pageSize.getTop() - 36; 还将Element.ALIGN_CENTER 更改为Element.RIGHT,不要抱怨:做对了。跨度>
    • 我试过 x=pageSize.getRight() - 36; y=pageSize.getTop()-36 并将对齐方式更改为 RIGHT 但对于第一页,页码显示正确,但其余页面无法按预期工作。此问题是由于 PDF 中的数据未显示在总页面上,但当我尝试获取页面大小时,它显示如下:页码 - 1 宽度 612.0 高度 792.0 页码 - 2 宽度 793.701 高度 651.968 页码 - 3 宽度 612.0 高度792.0
    • 嗨,请在第 1 页找到随附的 PDF 示例文件,我可以获得页码,但在第 2 页和第 3 页我没有任何页码,我不知道如何添加请帮我解决这个问题。 drive.google.com/open?id=0Bxuvm1mtsDnHUUhmVzNYUzhXYkk
    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 2015-04-19
    • 2015-06-04
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2017-03-24
    • 2018-09-30
    相关资源
    最近更新 更多