关于中心:itextsharp PdfCopy和横向页面

itextsharp PdfCopy and landscape pages

我正在使用ITextSharp加入多个PDF文档并添加页脚。我的代码工作正常-除了横向页面-它没有检测到页面旋转-页脚不是横向的中心:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
    public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString)
    {
        CreateFont();
        try
        {
            m.Seek(0, SeekOrigin.Begin);
            var reader = new PdfReader(m);

            // get page count
            var pdfPages = reader.NumberOfPages;
            var i = 0;

            // add pages
            while (i < pdfPages)
            {
                i++;

                // import page with pdfcopy
                var page = pdfCopy.GetImportedPage(reader, i);

                // get page center
                float posX;
                float posY;
                var rotation = page.BoundingBox.Rotation;
                if (rotation == 0 || rotation == 180)
                {
                    posX = page.Width / 2;
                    posY = 0;
                }
                else
                {
                    posX = page.Height / 2;
                    posY = 20f;
                }

                var ps = pdfCopy.CreatePageStamp(page);
                var cb = ps.GetOverContent();

                // add footer
                cb.SetColorFill(BaseColor.WHITE);
                var gs1 = new PdfGState {FillOpacity = 0.8f};
                cb.SetGState(gs1);
                cb.Rectangle(0, 0, document.PageSize.Width, 46f + posY);
                cb.Fill();

                // Text
                cb.SetColorFill(BaseColor.BLACK);
                cb.SetFontAndSize(baseFont, 7);
                cb.BeginText();

                // create text
                var pages = string.Format(pageLangString, i + footerPageNumOffset, numPages);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, posX, 40f + posY, 0f);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, footer, posX, 28f + posY, 0f);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, pages, posX, 20f + posY, 0f);
                cb.EndText();

                ps.AlterContents();

                // add page to new pdf
                pdfCopy.AddPage(page);
            }

            // close PdfReader
            reader.Close();
            // return number of pages
            return i;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return 0;
        }
    }

在这种情况下,如何检测页面旋转(例如横向)格式?给出的示例适用于PDFReader,但不适用于PDFCopy。

编辑:为什么我需要pdfcopy?我尝试复制Word PDF导出。当您尝试使用PDFReader复制页面时,某些单词超链接将不起作用。只有pdfcopy传输所有需要的页面信息。

编辑:(已解决)你需要使用reader.getpagerotation(i);


你需要使用reader.getpagerotation(i);

求解代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
    public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString)
    {
        CreateFont();
        try
        {
            m.Seek(0, SeekOrigin.Begin);
            var reader = new PdfReader(m);

            // get page count
            var pdfPages = reader.NumberOfPages;
            var i = 0;

            // add pages
            while (i < pdfPages)
            {
                i++;

                // import page with pdfcopy
                var page = pdfCopy.GetImportedPage(reader, i);

                // get page center
                float posX;
                float posY;
                var rotation = reader.GetPageRotation(i);
                if (rotation == 0 || rotation == 180)
                {
                    posX = page.Width / 2;
                    posY = 0;
                }
                else
                {
                    posX = page.Height / 2;
                    posY = 20f;
                }

                var ps = pdfCopy.CreatePageStamp(page);
                var cb = ps.GetOverContent();

                // add footer
                cb.SetColorFill(BaseColor.WHITE);
                var gs1 = new PdfGState {FillOpacity = 0.8f};
                cb.SetGState(gs1);
                cb.Rectangle(0, 0, document.PageSize.Width, 46f + posY);
                cb.Fill();

                // Text
                cb.SetColorFill(BaseColor.BLACK);
                cb.SetFontAndSize(baseFont, 7);
                cb.BeginText();

                // create text
                var pages = string.Format(pageLangString, i + footerPageNumOffset, numPages);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, posX, 40f + posY, 0f);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, footer, posX, 28f + posY, 0f);
                cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, pages, posX, 20f + posY, 0f);
                cb.EndText();

                ps.AlterContents();

                // add page to new pdf
                pdfCopy.AddPage(page);
            }

            // close PdfReader
            reader.Close();
            // return number of pages
            return i;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return 0;
        }
    }

在代码示例中,page的类型是pdfimportedpage。你要的是它的边界框。pdfimportedpage是pdfemplate类型,因此您需要XObject的边界框。我怀疑这会奏效。

您应该向读卡器对象请求页面的旋转。我想你已经发现了这一点,因为你说"给定的示例适用于PDFReader,但不适用于PDFCopy"。