0

既存の PDF ドキュメントを変更し、透かし画像を追加したいと考えています。新しいファイルを作成せずにこれを行うにはどうすればよいですか?

一時的なpdfを作成するのはばかげた解決策だと思います。ソース ファイルを削除し、ソース ファイルのように一時 pdf の名前を変更します!?

ここに私のコード例がありますが、新しい宛先ファイルを作成しています。

よろしく

        private static void PdfApplication(String filePath) {

        PdfReader pdfReader = new PdfReader(filePath);
        Stream outputStream = new FileStream(newFilePath, FileMode.Open, FileAccess.Write, FileShare.None);

        PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream,'1', true);

        for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) {
            pdfStamper.FormFlattening = false;
            iTextSharp.text.Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex);
            PdfContentByte pdfData = pdfStamper.GetOverContent(pageIndex);
            pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 10);
            PdfGState graphicsState = new PdfGState();
            graphicsState.FillOpacity = 0.4F;
            pdfData.SetGState(graphicsState);
            pdfData.BeginText();

            FileStream fileStreamImage = new FileStream(watermark.jpg", FileMode.Open);
            iTextSharp.text.Image jpeg = iTextSharp.text.Image.GetInstance(System.Drawing.Image.FromStream(fileStreamImage), ImageFormat.Jpeg);

            float width = pageRectangle.Width;
            float height = pageRectangle.Height;
            jpeg.ScaleToFit(width, height);
            jpeg.SetAbsolutePosition(width / 2 - jpeg.Width / 2, height / 2 - jpeg.Height / 2);
            jpeg.SetAbsolutePosition(50, 50);
            jpeg.Rotation = 250;

            pdfData.AddImage(jpeg);
            pdfData.EndText();
        }
        pdfStamper.Close();
        outputStream.Close();
        outputStream.Dispose();

    }
4

2 に答える 2

3

iTextSharp は、ファイルをその場で編集するために使用することを意図していません。変更を書き込んでいる間に例外が発生した場合はどうなりますか? その過程で、古いファイルと新しいファイルの両方が失われます。iTextSharp に 100% バグがなかったとしても、ユーザー コードがそれを壊す可能性があります。そして、大量の画像を追加して 1 MB のファイルを 10 GB に拡張し、ドライブのスペースが不足するようなエッジ ケースがあります。iTextSharp がこれらのケースを確実にテストする唯一の方法は、実際にファイルを書き込むことです。

テストもあります。ファイルを編集しているときはいつでも、入力ファイルと出力ファイルを比較したいと思っています。iTextSharp が入力ファイルを消去し続けると、別の場所からファイルを常にコピーする必要があり、1 時間に何十回もコピーしなければならない可能性があります。

これらは理由の一部です。しかし、あなたがやりたいことをする方法があります。のコンストラクタの 1 つはPdfReaderバイト配列です。これを渡すだけSystem.IO.File.ReadAllBytes(filePath)です。これらのバイトはもうディスクに関連付けられていないため、ディスクに書き込むことができます。

2 番目のオプションは、MemoryStream代わりに書き込み.ToArray()、それを呼び出し、呼び出しを閉じた後PdfReaderですSystem.IO.File.WriteAllBytes(filePath, bytes)

于 2013-08-15T14:05:13.417 に答える
0

pdfsharp dll のリンク 'これをインポート

Imports System.IO
Imports PdfSharp.Pdf
Imports PdfSharp.Pdf.IO
Imports PdfSharp.Drawing

Dim doc = ReturnCompatiblePdf(path_of_pdf_file)
Dim document As New PdfDocument
document = PdfReader.Open(doc, PdfDocumentOpenMode.Modify)
Dim watermark As String = "This is my watermark"

For Each page_ As PdfPage In document.Pages

    Dim gfx As XGraphics = XGraphics.FromPdfPage(page_, XGraphicsPdfPageOptions.Append)
    Dim fontx As New XFont("Trebuchet MS", 8, FontStyle.Bold)
    Dim posx, posy As Double
    posx = (page_.Width.Value - watermark.Length) / 2
    posy = page_.Height.Value - 8
    gfx.TranslateTransform(posx, posy)
    gfx.DrawString(watermark, fontx, XBrushes.Black, New XPoint(1, 1), XStringFormats.Default)
Next

If File.Exists(save_path) = False Then
    document.Save(save_path)
End If
于 2016-09-05T09:54:13.447 に答える