1

プロジェクトを作成し、Excelから読み取り、PDFに書き込み、このPDFを印刷したいと思います。Excelファイル(セルから)から、コンピューターまたはサーバー上の元のpdfであるディレクトリを読み取り、次のセルには、2番目のpdfの上部に何が書き込まれるかについての情報があります。

そして問題はここにあります、元のpdfは水平、横向き、回転であり、私のプログラムは元のpdfからコピーを作成し、コピーpdfファイルの上部にExcelから情報を書き込みます。しかし、風景であるpdfは270度回転します。これはOKではありません。縦回転作業プログラムOKの場合は、コピー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:

偽のPDF

4

1 に答える 1

4

以前に何度も説明したように(ITextSharpには入力ファイルのすべてのページが含まれますItext pdfマージ:pdf(テキストが切り捨てられた)ページの外にあるドキュメントオーバーフローと表示されないなど)、私の本の第6章iText in Action(例のC#バージョンはここにあります)。

との組み合わせを使用しDocumentてPDFを分割しています。誰があなたにこのようにしたのか教えてください。そうすれば、あなたにインスピレーションを与えた人を呪うことができます(私はこの質問に何百回も答えたことがあり、繰り返すのに飽き飽きしているからです)。これらのクラスは、その仕事には適していません。PdfWriterPdfImportedPage

  • あなたはすべての双方向性を失います、
  • ページが横向きの場合は、コンテンツを自分で回転させる必要があります。
  • 元のページサイズを考慮する必要があります。
  • ..。

あなたの問題はこれに似ていますitextsharp:コピーされたページの予期しない要素。ドキュメントを読まなかった理由はありますか?「時間がなかった」と言えば、開発者として20年近くの経験があり、「ドキュメントを読む」ことを時間の無駄だと思ったことは一度もないと言ったら、信じてください。

簡単に言うと、ドキュメントを読み、に置き換えPdfWriter、にPdfCopy置き換えます。AddTemplate()AddPage()

于 2013-03-09T12:17:34.450 に答える