使用IText API将页码添加到具有不同页面大小的合并PDF

时间:2016-07-08 20:37:41

标签: java itext

我正在尝试使用页面右上角的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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我不明白为什么要定义页码的位置,如下所示:

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?

这些Q&amp; As甚至可以在free ebook中使用!如果您花点时间通过阅读文档来教育自己,那么您将找到2013年StackOverflow已经回答的问题How to position text relative to page?的答案: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);

我希望这个答案会激励您阅读文档。我花了几周的时间来组织这些文档,当我发现人们没有阅读它时,我感到很沮丧。