1

画像を PDF に変換し、透かしを追加したいと考えています。iTextSharp を使用して変換しました。画像ファイルを pdf に正常に変換しましたが、別の pdf ファイルを作成しないと透かしを追加できません。

以下のコードは PDF ファイルを作成し、カスタム属性も追加します。watermarkpdf透かしを追加するために関数が使用され、引数として pdfname が指定されます。

foreach (string filenm in Images)
    using (var imageStream = new FileStream(filenm, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        doc.NewPage();

        iTextSharp.text.Image jpeg = iTextSharp.text.Image.GetInstance(filenm);
        float width = doc.PageSize.Width;
        float height = doc.PageSize.Height;
        jpeg.ScaleToFit(width,height);
        doc.Add(jpeg);
    }
    doc.AddHeader("name", "vijay");
    watermarkpdf(pdfname);

以下watermarkpdfに関数を示します。

PdfReader pdfReader = new PdfReader(txtpath.Text+"\\pdf\\" + pdfname);
FileStream stream = new FileStream(txtpath.Text + pdfname,FileMode.Open);
PdfStamper pdfStamper = new PdfStamper(pdfReader, stream);
for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++)
{
    Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex);
    PdfContentByte pdfData = pdfStamper.GetUnderContent(pageIndex);
    pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 40);
    PdfGState graphicsState = new PdfGState();
    graphicsState.FillOpacity = 0.4F;
    pdfData.SetGState(graphicsState);
    pdfData.SetColorFill(BaseColor.BLUE);
    pdfData.BeginText();
    pdfData.ShowTextAligned(Element.ALIGN_CENTER, "SRO-Kottarakkara", pageRectangle.Width / 2, pageRectangle.Height / 2, 45);
    pdfData.EndText();
}
pdfStamper.Close();
stream.Close();
4

1 に答える 1

2

iTextSharpは、ファイルの「インプレース編集」をサポートしておらず、既存のファイルを読み取って新しいファイルを作成するだけです。問題は、書き込み中の何かに書き込む必要があり、非常に問題になる可能性があることです。

ただし、ファイルを使用する代わりに、で画像を作成し、MemoryStreamそこからバイトを取得してPdfReader、コードに最小限の変更を加えて、ファイルにパイプすることができます。ファイルを受け取るすべてのPDF書き込み関数は、実際には抽象Streamクラスで動作し、MemoryStreamから継承するため、互換的に使用できます。以下は、私が話していることを示す基本的なコードです。私は現在IDEを持っていないので、タイプミスがあるかもしれませんが、ほとんどの場合は機能するはずです。

//Image part
//We will dump the bytes from the memory stream to the variable below later
byte[] bytes;
using (MemoryStream ms = new MemoryStream()){
  Document doc = new Document(PageSize.LETTER);
  PdfWriter writer = PdfWriter.GetInstance(doc, ms);
  doc.Open();
  //foreach (string filenm in Images)
  //...
  doc.Close();
  //Dump the bytes, make sure to use ToArray() and not GetBuffer()
  bytes = ms.ToArray();
}

//Watermark part
//Read from our bytes
PdfReader pdfReader = new PdfReader(bytes);
FileStream stream = new FileStream(txtpath.Text + pdfname,FileMode.Open);
//...
于 2012-06-01T13:19:31.690 に答える