def make_popup(page, rect, popupname, popup, code): from pdfrw import PdfDict, PdfArray, PdfName from pdfrw.uncompress import uncompress codeword_on, codeword_off = code show_action = PdfDict(S=PdfName.SetOCGState, State=PdfArray([PdfName.OFF] + codeword_off + [PdfName.ON] + codeword_on)) link = PdfDict(indirect=True, Type=PdfName.Annot, H=PdfName.I, Subtype=PdfName.Link, A=show_action, Rect=rect) if pdf_popup_config['popuplinkcolor']: link.C = PdfArray(pdf_popup_config['popuplinkcolor']) else: link.Border = [0, 0, 0] page.Annots.append(link) ocmd = PdfDict(Type=PdfName.OCMD, OCGs=codeword_on, P=PdfName.AllOn) popup_pdfname = '/SPopup' + popupname ocmd_pdfname = '/SPopupOCMD{}'.format(popup_unique_id()) if not page.Resources.Properties: page.Resources.Properties = PdfDict() if not page.Resources.XObject: page.Resources.XObject = PdfDict() page.Resources.XObject[popup_pdfname] = popup page.Resources.Properties[ocmd_pdfname] = ocmd if page.Contents.Filter: uncompress( [page.Contents] ) # Important. Otherwise appending to stream add plain text to compressed stream page.Contents.stream += "q /OC {ocmd} BDC 1 0 0 1 {x} {y} cm {popup} Do EMC Q\n".\ format(x=rect[0],y=float(rect[1])-popup.BBox[3], ocmd=ocmd_pdfname, popup=popup_pdfname)
def create_highlight(points, color=(1, 0.92, 0.23), author=None, contents=None): """Given Quad points, create a highligh object in standard pdf format.""" new_highlight = PdfDict() new_highlight.F = 4 new_highlight.Type = PdfName('Annot') new_highlight.Subtype = PdfName('Highlight') if author: new_highlight.T = author new_highlight.C = color if contents: new_highlight.Contents = contents new_highlight.indirect = True ############################################################# ### Search for bounding coordinates ############################################################# bot_left_x = float('inf') bot_left_y = float('inf') top_right_x = 0.0 top_right_y = 0.0 quad_pts = [] for (x1, y1, x2, y2) in points: # this quadpoints specified PDF definition of rect box quad_pts.extend([x1, y2, x2, y2, x1, y1, x2, y1]) bot_left_x = min(bot_left_x, x1, x2) bot_left_y = min(bot_left_y, y1, y2) top_right_x = max(top_right_x, x1, x2) top_right_y = max(top_right_y, y1, y2) new_highlight.QuadPoints = PdfArray(quad_pts) new_highlight.Rect = PdfArray( [bot_left_x, bot_left_y, top_right_x, top_right_y]) return new_highlight