如何在itextSharp(dll)中保留原始旋转页面

时间:2013-03-08 09:10:42

标签: excel pdf rotation pdf-generation itextsharp

我想创建项目,从Excel阅读并写在pdf上并打印此pdf。 从Excel文件(从单元格)读取目录,其中是原始pdf在计算机或服务器上,下一个单元格具有在第二个pdf顶部写入的信息。

问题出在这里,原始pdf是横向的,横向的,旋转的,我的程序从原始pdf创建副本,并在复制pdf文件的顶部从excel写入信息。但是作为风景的pdf旋转270 deegres。这不行。对于纵向旋转工作程序OK,复制OK并在副本顶部写入即可。 我的代码中的问题在哪里?

代码:

public int urediPDF(string inTekst)
{
    if (inTekst != "0")
    {
        string pisava_arialBD = @"..\debug\arial.ttf";
        string oldFile = null;
        string inText = null;
        string indeks = null;
        //razbitje stringa
        string[] vhod = inTekst.Split('#');
        oldFile = vhod[0];
        inText = vhod[1];
        indeks = vhod[2];

        string newFile = @"c:\da\2";

        //odpre bralnik pdf
        PdfReader reader = new PdfReader(oldFile);                
        Rectangle size = reader.GetPageSizeWithRotation(reader.NumberOfPages);
        Document document = new Document(size);

        //odpre zapisovalnik pdf                
        FileStream fs = new FileStream(newFile + "-" + indeks + ".pdf", FileMode.Create, FileAccess.Write);
        PdfWriter writer = PdfWriter.GetInstance(document, fs);
        //document.Open();
        document.OpenDocument();
        label2.Text = ("Status: " + reader.GetPageRotation(reader.NumberOfPages).ToString());

        //določi sejo ustvarjanje pdf
        PdfContentByte cb = writer.DirectContent;

        //izbira pisave oblike
        BaseFont bf = BaseFont.CreateFont(pisava_arialBD, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        cb.SetColorFill(BaseColor.RED);
        cb.SetFontAndSize(bf, 8);

        //pisanje teksta v pdf
        cb.BeginText();
        string text = inText;

        //izbira koordinat za zapis pravilnega teksta v pdf (720 stopinj roatacija (ležeče) in 90 stopinj (pokončno))
        if (reader.GetPageRotation(1) == 720)               //ležeča postavitev
        {
            cb.ShowTextAligned(1, text, 10, 450, 0);
            cb.EndText();
        }
        else                                              //pokončna postavitev
        {
            cb.ShowTextAligned(1, text + " - pokončen", 10, 750, 0);
            cb.EndText();
        }


        // create the new page and add it to the pdf
        PdfImportedPage page = writer.GetImportedPage(reader, reader.NumberOfPages);
        cb.AddTemplate(page, 0, 0);

        // close the streams and voilá the file should be changed :)
        document.Close();
        fs.Close();
        writer.Close();
        reader.Close();
    }
    else
    {
        label2.Text = "Status: Končano zapisovanje";
        return 0;
    }
    return 0;
}

图片假pdf:

Fake PDF

1 个答案:

答案 0 :(得分:3)

正如之前多次解释过的那样(ITextSharp include all pages from the input fileItext pdf Merge : Document overflow outside pdf (Text truncated) page and not displaying等),您应该阅读我的书chapter 6iText in Action(您可以找到C#版本的例子here)。

您正在使用DocumentPdfWriterPdfImportedPage的组合来拆分PDF。请告诉我是谁让你这样做,这样我就可以诅咒激励你的人(因为我之前已经回答过几百次这个问题了,而且我已经厌倦了重复自己)。这些课程不适合这项工作:

  • 你失去了所有的互动,
  • 如果页面是横向的,您需要自己旋转内容
  • 您需要考虑原始页面大小,
  • ...

您的问题类似于itextsharp: unexpected elements on copied pages。您有没有理由不阅读文档?如果你说:“我没有时间”,请相信我,如果我说我有近20年的开发经验,我从未见过“阅读文档”浪费时间。

长话短说:阅读文档,将PdfWriter替换为PdfCopy,将AddTemplate()替换为AddPage()