如何使图像不可选
How do I make an image not selectable
我已将图像添加到我的 iTextSharp PDF 文档中,如下所示:
Public Sub CreatePDFFromBitmap(ByVal uPath As String, ByVal uBitmap As Bitmap)
Dim nFs As System.IO.FileStream = New FileStream(uPath, FileMode.Create)
Dim nDocument As iTextSharp.text.Document
Dim nWriter As iTextSharp.text.pdf.PdfWriter
Dim nCb As iTextSharp.text.pdf.PdfContentByte
Dim nImgFromBitmap As System.Drawing.Image = DirectCast(uBitmap, System.Drawing.Image)
Dim nImg As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(nImgFromBitmap, Imaging.ImageFormat.Png)
Dim bLandscape As Boolean = (nImg.Width > nImg.Height)
'rotation needs to be set before document is being opened
If bLandscape Then
nDocument = New iTextSharp.text.Document(PageSize.A4.Rotate, 0, 0, 0, 0)
Else
nDocument = New iTextSharp.text.Document(PageSize.A4, 0, 0, 0, 0)
End If
'if an exception is raised here, the following will help:
nWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(nDocument, nFs)
nDocument.Open()
nCb = nWriter.DirectContent
nImg.ScaleToFit(nDocument.PageSize.Width, nDocument.PageSize.Height) 'raises dpi size :-)))
'X-Y-Koordinatensystem 0,0 startet also unten links, nicht oben-links
nImg.SetAbsolutePosition(0, nDocument.PageSize.Height - nImg.ScaledHeight)
nCb.AddImage(nImg)
nDocument.Close()
nWriter.Close()
nFs.Close()
End Sub
它工作正常。
但是,当我单击 PDF 中的图像时,它会被选中。
这不是我想要的。
如果我点击PDF中的图片,应该不会被选中。
这是它的样子:图像变成蓝色:
我想在 PDF 中添加可编辑的字段,所以我需要将图像设置为不可选择,否则会使用户感到困惑。
这是一个 pdf 程序规范,与 asp.net 或 vb.net 编程无关。您需要控制 pdf reader 设置。或尝试使用其他格式。
正如 Abdel-Rahman Al-Qawasmi 在他的回答中提到的,完全取决于 PDF 查看器,它可以选择哪些实体,哪些不可以。因此,没有保证的方法可以得到你想要的。
尽管如此,有一些方法可以将图像放入 PDF 中,这会阻止大多数 PDF 查看器的当前版本使其可选择。这些方法要么 将位图图像 转换为非位图实体(例如,通过迭代位图的像素并使用矢量图形为每个像素绘制一个小矩形)或 将位图图像 包装成通常无法选择的东西。
让我们采用后一种方法,将图像包装成页面大小的 PDF 图案,然后用它填充实际页面。您可以通过更换
nCb.AddImage(nImg)
来自
Dim painter As iTextSharp.text.pdf.PdfPatternPainter = nCb.CreatePattern(nDocument.PageSize.Width, nDocument.PageSize.Height)
painter.AddImage(nImg)
nCb.SetColorFill(New iTextSharp.text.pdf.PatternColor(painter))
nCb.Rectangle(0, 0, nDocument.PageSize.Width, nDocument.PageSize.Height)
nCb.Fill()
(这基本上是 中 Java/iText 代码的 VB/iTextSharp 吊坠。)
我已将图像添加到我的 iTextSharp PDF 文档中,如下所示:
Public Sub CreatePDFFromBitmap(ByVal uPath As String, ByVal uBitmap As Bitmap)
Dim nFs As System.IO.FileStream = New FileStream(uPath, FileMode.Create)
Dim nDocument As iTextSharp.text.Document
Dim nWriter As iTextSharp.text.pdf.PdfWriter
Dim nCb As iTextSharp.text.pdf.PdfContentByte
Dim nImgFromBitmap As System.Drawing.Image = DirectCast(uBitmap, System.Drawing.Image)
Dim nImg As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(nImgFromBitmap, Imaging.ImageFormat.Png)
Dim bLandscape As Boolean = (nImg.Width > nImg.Height)
'rotation needs to be set before document is being opened
If bLandscape Then
nDocument = New iTextSharp.text.Document(PageSize.A4.Rotate, 0, 0, 0, 0)
Else
nDocument = New iTextSharp.text.Document(PageSize.A4, 0, 0, 0, 0)
End If
'if an exception is raised here, the following will help:
nWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(nDocument, nFs)
nDocument.Open()
nCb = nWriter.DirectContent
nImg.ScaleToFit(nDocument.PageSize.Width, nDocument.PageSize.Height) 'raises dpi size :-)))
'X-Y-Koordinatensystem 0,0 startet also unten links, nicht oben-links
nImg.SetAbsolutePosition(0, nDocument.PageSize.Height - nImg.ScaledHeight)
nCb.AddImage(nImg)
nDocument.Close()
nWriter.Close()
nFs.Close()
End Sub
它工作正常。 但是,当我单击 PDF 中的图像时,它会被选中。 这不是我想要的。 如果我点击PDF中的图片,应该不会被选中。
这是它的样子:图像变成蓝色:
我想在 PDF 中添加可编辑的字段,所以我需要将图像设置为不可选择,否则会使用户感到困惑。
这是一个 pdf 程序规范,与 asp.net 或 vb.net 编程无关。您需要控制 pdf reader 设置。或尝试使用其他格式。
正如 Abdel-Rahman Al-Qawasmi 在他的回答中提到的,完全取决于 PDF 查看器,它可以选择哪些实体,哪些不可以。因此,没有保证的方法可以得到你想要的。
尽管如此,有一些方法可以将图像放入 PDF 中,这会阻止大多数 PDF 查看器的当前版本使其可选择。这些方法要么 将位图图像 转换为非位图实体(例如,通过迭代位图的像素并使用矢量图形为每个像素绘制一个小矩形)或 将位图图像 包装成通常无法选择的东西。
让我们采用后一种方法,将图像包装成页面大小的 PDF 图案,然后用它填充实际页面。您可以通过更换
nCb.AddImage(nImg)
来自
Dim painter As iTextSharp.text.pdf.PdfPatternPainter = nCb.CreatePattern(nDocument.PageSize.Width, nDocument.PageSize.Height)
painter.AddImage(nImg)
nCb.SetColorFill(New iTextSharp.text.pdf.PatternColor(painter))
nCb.Rectangle(0, 0, nDocument.PageSize.Width, nDocument.PageSize.Height)
nCb.Fill()
(这基本上是